上一頁我使用NSUserDefaults在手錶和應用程序之間共享基本變量。WatchOS 2.0在iOS應用程序和WatchOS應用程序之間共享數據
我的目標是在手錶上顯示用戶的電子郵件地址,該地址存儲在iPhone應用程序NSUserDefaults中。我知道在Watch v1之後,您不能再使用App Groups來共享數據。
我知道您需要使用Watch Connectivity API,但我只能弄清楚如何在動作發生時使用它。在Watch應用程序啓動之前。
讓我知道你是否有任何想法。
上一頁我使用NSUserDefaults在手錶和應用程序之間共享基本變量。WatchOS 2.0在iOS應用程序和WatchOS應用程序之間共享數據
我的目標是在手錶上顯示用戶的電子郵件地址,該地址存儲在iPhone應用程序NSUserDefaults中。我知道在Watch v1之後,您不能再使用App Groups來共享數據。
我知道您需要使用Watch Connectivity API,但我只能弄清楚如何在動作發生時使用它。在Watch應用程序啓動之前。
讓我知道你是否有任何想法。
是的,您可以將電子郵件存儲在iPhone上的NSUserDefaults中,並將其顯示在手錶上。爲此,您需要使用Watch Connectivity API向iPhone發送消息,並且當您收到此消息時,請回復您從NSUserDefaults獲取的電子郵件地址。這可能會在Watch上的應用程序啓動後發生,但不會在此之前發生。如果您不希望每次都要問iPhone,那麼您可以將其緩存在手錶上供將來使用。如果它在iPhone上發生變化,您也可以向Watch發送消息以更新它。
下面是一些示例代碼,演示如何在Swift中從Apple Watch發出請求,並在Objective-C的iPhone中響應該請求。
某處在您觀看的應用程序的代碼發射後:
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 Framework Reference。
非常感謝。快速的問題,你可以提供如何與iPhone快速應用程序派遣? AppDelegate是否必須從WCSessionDelegate繼承? – Nate
@Nate我已將關於'WCSessionDelegate'的信息添加到答案中。我真的推薦閱讀鏈接的文檔。 – Joey