WatchOS 2 - iOS UserDefaults 共享

WatchOS 2 - iOS UserDefaults sharing

我正在尝试在 iOS 和 WatchOS 2 之间同步用户详细信息。在以前版本的 WatchKit 应用程序组中,共享此类首选项非常好,但在版本 2 中,我正在为同样的事情而苦苦挣扎。

现在我尝试使用 WCSessiontransferUserInfo: 方法发送 userInfo,然后将该 userInfo 保存到 watchOS 的 userDefaults 中。但问题是对于这样的细节手表必须首先要求 iPhone 发送 UserInfo。如果 iPhone 应用程序未被使用,那么在这种情况下,Watch App 不会反映 userInfo 中的更改。

有人知道在 WatchOS 2 中实现这种实现吗?如果有人对此有所了解,请提出建议。

如果您在手表上使用 WCSessionsendMessage 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]];
    }
}

这显然比你可能做的要简单,但应该给你思路