watchOSとiOSでデータのやり取りをしている場合のwatchOS 1からwatchOS 2への置き換え例
watchOS
watchOS 1
[WKInterfaceController openParentApplication:userInfo reply:^(NSDictionary *replyInfo, NSError *error) { if (error) { } else { } }];
watchOS 2
openParentApplication:reply:
は使えなくなったので WatchConnectivity.framework の WCSession
を使った実装に置き換える。
[WCSession isSupported]
はwatchOSでは常にYESを返すので isSupported
のチェックは無くても良い。
セットアップ
- (void)awakeWithContext:(id)context { [super awakeWithContext:context]; WCSession *session = [WCSession defaultSession]; session.delegate = self; [session activateSession]; }
データ取得リクエスト
[[WCSession defaultSession] sendMessage:userInfo
replyHandler:^(NSDictionary<NSString *,id> * _Nonnull replyMessage) {
}
errorHandler:^(NSError * _Nonnull error) {
}];
iOS
iOS 8 with watchOS 1
- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void(^)(NSDictionary *replyInfo))reply { NSDictionary *dict; // configure reply data reply(dict); }
iOS 9 with watchOS 2
WCSession
をセットアップして delegate でのメッセージの受け取りとデータの返却を行う。
WCSessionDelegate
は色々とメソッドのバリエーションがあるけど、watchOS 1の時のデータのやり取りをそのまま置き換える場合は didReceiveMessage:replyHandler:
を実装すればOK
セットアップ
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { if ([WCSession isSupported]) { WCSession *session = [WCSession defaultSession]; session.delegate = self; [session activateSession]; } return YES; }
データ取得リクエストへの応答
- (void)session:(WCSession *)session didReceiveMessage:(NSDictionary<NSString *, id> *)message replyHandler:(void(^)(NSDictionary<NSString *, id> *replyMessage))replyHandler { NSDictionary *dict; // configure reply data replyHandler(dict); }