繁体   English   中英

WatchOS 2.0在iOS App和WatchOS App之间共享数据

[英]WatchOS 2.0 Sharing Data between iOS App and WatchOS App

上一章,我使用NSUserDefaults在手表和应用之间共享基本变量。

我的目标是在手表上显示用户的电子邮件地址,该手表存储在iPhone应用程序NSUserDefaults中。 我了解到在Watch v1之后,您将无法再使用应用程序组共享数据。

我了解您需要使用Watch Connectivity API,但是我只能弄清楚在操作发生时如何使用它。 在Watch App启动之前。

让我知道您是否有任何想法。

是的,您可以将电子邮件存储在iPhone上的NSUserDefaults中,并将其显示在Watch上。 为此,您需要使用Watch Connectivity API向iPhone发送消息,并在收到此消息时以从NSUserDefaults获取的电子邮件地址进行响应。 一旦启动Watch上的应用程序,可能会发生这种情况,但此之前不会发生。 如果您不想每次都询问iPhone,可以将其缓存在Watch上以备将来使用。 如果iPhone上的手表发生变化,您也可以向手表发送消息以在其中进行更新。

这是一些示例代码,展示了如何从Swift中的Apple Watch发出请求,以及如何在Objective-C中的iPhone上进行响应。

启动后在Watch应用程序代码中的某个位置:

if WCSession.defaultSession().reachable {
    WCSession.defaultSession().sendMessage(["email-request": "email"], replyHandler: { (reply: [String : AnyObject]) -> Void in
        //success
        dispatch_async(dispatch_get_main_queue()) {
            if let email = reply["email-request"] as? String {
                //store the email, display it, etc
            }
        }
    }, errorHandler: { (error: NSError) -> Void in
        dispatch_async(dispatch_get_main_queue()) {
            //couldn't get email, maybe show error message
        }
    })
} else {
    //iPhone not available, maybe show error message
}

在iPhone应用程序的AppDelegate中:

- (void)session:(nonnull WCSession *)session didReceiveMessage:(nonnull NSDictionary<NSString *,id> *)message replyHandler:(nonnull void (^)(NSDictionary<NSString *,id> * __nonnull))replyHandler
{
    dispatch_async(dispatch_get_main_queue(), ^{
        if (message[@"email-request"]) {
            NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
            replyHandler(@{@"email-request": @([defaults stringForKey:@"email"])});
        }
    });
}

请注意,应用程序委托和扩展委托都必须采用WCSessionDelegate协议,并且需要正确激活它们。 有关其他信息,请参阅《 Watch Connectivity框架参考 》。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM