ObjecTips

Swift & Objective-C で iOS とか macOS とか

watchOS 1からwatchOS 2への置き換え例

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);
}