WatchOS 2 - iOS UserDefaults 共享
WatchOS 2 - iOS UserDefaults sharing
我正在尝试在 iOS 和 WatchOS 2 之间同步用户详细信息。在以前版本的 WatchKit 应用程序组中,共享此类首选项非常好,但在版本 2 中,我正在为同样的事情而苦苦挣扎。
现在我尝试使用 WCSession
的 transferUserInfo:
方法发送 userInfo,然后将该 userInfo 保存到 watchOS 的 userDefaults 中。但问题是对于这样的细节手表必须首先要求 iPhone 发送 UserInfo。如果 iPhone 应用程序未被使用,那么在这种情况下,Watch App 不会反映 userInfo 中的更改。
有人知道在 WatchOS 2 中实现这种实现吗?如果有人对此有所了解,请提出建议。
如果您在手表上使用 WCSession
的 sendMessage
API,它将在后台唤醒 iOS 应用程序(如果尚未 [=25] =].所以你可以这样做:
观看扩展代码:
[[WCSession defaultSession] sendMessage:@{@"cmd":@"sendUpdate"} replyHandler:nil errorHandler:^{ /*handle errors*/ }]
iOS 应用代码:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
<...>
[[WCSession defaultSession] setDelegate:self];
[[WCSession defaultSession] activateSession];
<...>
}
- (void)session:(WCSession *)session activationDidCompleteWithState:(WCSessionActivationState)activationState error:(nullable NSError *)error {
}
- (void)sessionDidBecomeInactive:(WCSession *)session
{}
- (void)sessionDidDeactivate:(WCSession *)session
{
[session activateSession];
}
- (void)session:(WCSession *)session didReceiveMessage:(NSDictionary<NSString *, id> *)message {
NSString *cmd = message[@"cmd"];
if ([cmd isEqual:@"sendUpdate"]) {
[self sendUpdate];
}
}
- (void)sendUpdate {
WCSession *session = [WCSession defaultSession];
if (session.isWatchAppInstalled && session.activationState == WCSessionActivationStateActivated) {
[[WCSession defaultSession] transferUserInfo:[self dictionaryFullOfUpdates]];
}
}
这显然比你可能做的要简单,但应该给你思路
我正在尝试在 iOS 和 WatchOS 2 之间同步用户详细信息。在以前版本的 WatchKit 应用程序组中,共享此类首选项非常好,但在版本 2 中,我正在为同样的事情而苦苦挣扎。
现在我尝试使用 WCSession
的 transferUserInfo:
方法发送 userInfo,然后将该 userInfo 保存到 watchOS 的 userDefaults 中。但问题是对于这样的细节手表必须首先要求 iPhone 发送 UserInfo。如果 iPhone 应用程序未被使用,那么在这种情况下,Watch App 不会反映 userInfo 中的更改。
有人知道在 WatchOS 2 中实现这种实现吗?如果有人对此有所了解,请提出建议。
如果您在手表上使用 WCSession
的 sendMessage
API,它将在后台唤醒 iOS 应用程序(如果尚未 [=25] =].所以你可以这样做:
观看扩展代码:
[[WCSession defaultSession] sendMessage:@{@"cmd":@"sendUpdate"} replyHandler:nil errorHandler:^{ /*handle errors*/ }]
iOS 应用代码:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
<...>
[[WCSession defaultSession] setDelegate:self];
[[WCSession defaultSession] activateSession];
<...>
}
- (void)session:(WCSession *)session activationDidCompleteWithState:(WCSessionActivationState)activationState error:(nullable NSError *)error {
}
- (void)sessionDidBecomeInactive:(WCSession *)session
{}
- (void)sessionDidDeactivate:(WCSession *)session
{
[session activateSession];
}
- (void)session:(WCSession *)session didReceiveMessage:(NSDictionary<NSString *, id> *)message {
NSString *cmd = message[@"cmd"];
if ([cmd isEqual:@"sendUpdate"]) {
[self sendUpdate];
}
}
- (void)sendUpdate {
WCSession *session = [WCSession defaultSession];
if (session.isWatchAppInstalled && session.activationState == WCSessionActivationStateActivated) {
[[WCSession defaultSession] transferUserInfo:[self dictionaryFullOfUpdates]];
}
}
这显然比你可能做的要简单,但应该给你思路