2015-12-24 142 views
0

上一頁我使用NSUserDefaults在手錶和應用程序之間共享基本變量。WatchOS 2.0在iOS應用程序和WatchOS應用程序之間共享數據

我的目標是在手錶上顯示用戶的電子郵件地址,該地址存儲在iPhone應用程序NSUserDefaults中。我知道在Watch v1之後,您不能再使用App Groups來共享數據。

我知道您需要使用Watch Connectivity API,但我只能弄清楚如何在動作發生時使用它。在Watch應用程序啓動之前。

讓我知道你是否有任何想法。

回答

1

是的,您可以將電子郵件存儲在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

+0

非常感謝。快速的問題,你可以提供如何與iPhone快速應用程序派遣? AppDelegate是否必須從WCSessionDelegate繼承? – Nate

+0

@Nate我已將關於'WCSessionDelegate'的信息添加到答案中。我真的推薦閱讀鏈接的文檔。 – Joey

相關問題