WCSession: данные, представленные на iOS, никогда не поступают на часы - PullRequest
0 голосов
/ 09 мая 2018

Я работаю над небольшим приложением для отслеживания времени для iOS.Пользователь может создать любое количество действий, а затем отслеживать, сколько времени он тратит на каждого из них (например, спать, ехать на работу, есть, работать и т. Д.)

Теперь я хотел бы добавить поддержку Apple Watch: Пользователь должен иметь возможность выбрать действие из списка на своих часах, ввести значение времени и отправить этот результат в приложение iOS, которое затем обновляет свои данные.

Итак, мне нужно общение в обоих направлениях:

iOS -> Watch:
    List of configured activties

Watch -> iOS
    Add time XY for activity 123

Я реализовал WCSession с обеих сторон, но независимо от того, что я пытаюсь, кажется, что нет связи:

// iOS App Delegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  
    ...
    if ([WCSession isSupported]) {
        session = [WCSession defaultSession];
        session.delegate = self;
        [session activateSession];
    }
}

- (void)updateActitviesOnWatch:(NSDictionary<NSString *, id> *)data {
    if (session != nil && session.paired && session.activationState == WCSessionActivationStateActivated) {
        [session updateApplicationContext:data error:nil];

        [session sendMessage:data replyHandler:^(NSDictionary<NSString *,id> * _Nonnull replyMessage) {
            NSLog(@"sendMessage : success");
        } errorHandler:^(NSError * _Nonnull error) {
            NSLog(@"sendMessage : error");
        }];

        [session transferUserInfo:data];
    }
}


// WatchExtension ExtensionDelegate.m
- (void)applicationDidFinishLaunching {
    if ([WCSession isSupported]) {
        session = [WCSession defaultSession];
        session.delegate = self;
        [session activateSession];
    }
}

- (void)session:(WCSession *)session activationDidCompleteWithState:(WCSessionActivationState)activationState error:(nullable NSError *)error {
    NSLog(@"WK activationDidCompleteWithState");
}

- (void)session:(WCSession *)session didReceiveUserInfo:(NSDictionary<NSString *, id> *)userInfo {    
    NSLog(@"WK session didReceiveUserInfo");
}

- (void)session:(WCSession *)session didReceiveApplicationContext:(NSDictionary<NSString *, id> *)applicationContext {
    NSLog(@"WK session didReceiveApplicationContext");
}

- (void)session:(WCSession * __nonnull)session didFinishUserInfoTransfer:(WCSessionUserInfoTransfer *)userInfoTransfer error:(nullable NSError *)error {
    NSLog(@"WK session didFinishUserInfoTransfer");
}

Независимо от того, какой метод используется для отправкиданные на iOS (updateApplicationContext:error:, sendMessage:replyHandler:errorHandler или transferUserInfo:), не относящиеся к получающим методам делегата, вызываются на Watch.

Что я делаю не так?

Какой правильный способ передачи данных в первую очередь?

...