iOS App がフォアグラウンドにあるときはうまくいくのに background にあるとうまくいかない、などでハマらないように。
iOS App 側
application:handleWatchKitExtensionRequest:reply: の実装
AppDelegate に実装します。
- (void)application:(UIApplication *)application
handleWatchKitExtensionRequest:(NSDictionary *)userInfo
reply:(void (^)(NSDictionary *replyInfo))reply
{
// do something...
}
beginBackgroundTaskWithName:expirationHandler: あるいは beginBackgroundTaskWithExpirationHandler: で background 処理を継続させる
公式ドキュメントの Execution States for Apps 欄 にあるように、アプリは background に移るとほどなくして suspended になり、なんのコードも実行しなくなります。
長めの処理を iOS App 側にさせる場合それだと困るので、こちらの Executing Finite-Length Tasks に従って background 処理を継続させます。
- (void)application:(UIApplication *)application
handleWatchKitExtensionRequest:(NSDictionary *)userInfo
reply:(void (^)(NSDictionary *replyInfo))reply
{
__block UIBackgroundTaskIdentifier bgTask;
bgTask = [application beginBackgroundTaskWithName:@"MyTask" expirationHandler:^{
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}];
// この辺で長い処理とか。GCD を使うなど。
reply( hoge );
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}
WatchKit Extension 側
Controller などで openParentApplication:reply: を呼び出す。
ドキュメントはこちら