WatchOS 2 — совместное использование пользовательских настроек iOS

Я пытаюсь синхронизировать данные пользователя между iOS и WatchOS 2. В предыдущей версии групп приложений WatchKit было довольно удобно делиться такими предпочтениями, но в версии 2 я борюсь за то же самое.

Прямо сейчас я попытался отправить информацию о пользователе, используя метод WCSession transferUserInfo:, а затем сохранить эту информацию о пользователе в userDefaults watchOS. Но проблема в том, что для таких подробностей часы должны сначала попросить iPhone отправить информацию о пользователе. Если приложение iPhone не используется, то в этом случае приложение Watch не получает отражения изменений в userInfo.

У кого-нибудь есть идеи для такой реализации в WatchOS 2? Правильно ли я делаю, пожалуйста, предложите, если кто-нибудь знает об этом.


person Mrug    schedule 05.04.2016    source источник


Ответы (1)


Если вы используете sendMessage API WCSession на часах, оно разбудит приложение iOS в фоновом режиме, если оно еще не запущено. Таким образом, вы можете сделать что-то вроде:

посмотреть код расширения:

[[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]];
    }
}

Это, очевидно, проще, чем то, что вы, вероятно, сделали бы, но должно дать вам идею

person ccjensen    schedule 05.04.2016