Я работаю над небольшим приложением для отслеживания времени для 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.
Что я делаю не так?
Какой правильный способ передачи данных в первую очередь?