簡體   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