之前我使用NSUserDefaults在手表和应用程序之间共享基本变量。
我的目标是在手表上显示用户的电子邮件地址,该地址存储在iPhone应用程序NSUserDefaults上。据我所知,在Watch v1之后,您无法再使用App Groups来共享数据。
我知道你需要使用Watch Connectivity API,但我只能弄清楚当一个动作发生时如何使用它。不是在Watch App启动之前。
如果您有任何想法,请告诉我。
答案 0 :(得分:1)
是的,您可以将电子邮件存储在iPhone上的NSUserDefaults中,并将其显示在Watch上。为此,您需要使用Watch Connectivity API向iPhone发送消息,当您收到此消息时,请回复您从NSUserDefaults获取的电子邮件地址。一旦Watch上的应用程序启动,就会发生这种情况,但在此之前不会发生。您可以将它缓存在Watch上以备将来使用,如果您不希望每次都要向iPhone询问它。如果它在iPhone上发生变化,您也可以通知Watch,以便在那里更新它。
以下是一些示例代码,用于说明如何从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"])});
}
});
}
请注意,app委托和扩展委托都必须采用WCSessionDelegate
协议,并且需要正确激活它们。有关其他信息,请参阅Watch Connectivity Framework Reference。