次のコードを使用して、時計アプリから親アプリケーションのアプリケーション状態を「単純に」判断しています。
WatchKit 拡張機能:
[WKInterfaceController openParentApplication:[NSDictionary dictionary] reply:^(NSDictionary *replyInfo, NSError *error)
{
UIApplicationState appState = UIApplicationStateBackground;
if(nil != replyInfo)
appState = (UIApplicationState)[((NSNumber*)[replyInfo objectForKey:kAppStateKey]) integerValue];
//handle app state
}];
メインアプリ:
- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void (^)(NSDictionary *replyInfo))reply
{
__block UIBackgroundTaskIdentifier realBackgroundTask;
realBackgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
reply([NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:[[UIApplication sharedApplication] applicationState]], kAppStateKey, nil]);
[[UIApplication sharedApplication] endBackgroundTask:realBackgroundTask];
}];
reply([NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:[[UIApplication sharedApplication] applicationState]], kAppStateKey, nil]);
[[UIApplication sharedApplication] endBackgroundTask:realBackgroundTask];
}
アプリがフォアグラウンドにある場合、これは常に 100% 機能します。アプリが「最小化」または「終了」されている場合、これはおそらく 50% の時間 (おそらくそれ以下) で機能します。機能しない場合、無期限にブロックしているように見えます。たとえば、1 分後に親アプリを起動すると、呼び出し (openParentApplication) はすぐに状態 "UIApplicationStateBackground" (アプリを起動する前の状態) で返されます。立ち上げました)。
ところで:私は実際のハードウェアでテストしています。
私は何を間違っていますか?バックグラウンド タスクを作成しているにもかかわらず、iOS が通話を受信した直後にメイン アプリをスリープ状態にするのはなぜですか? これは完全なショーストッパーです。
どんな考えや提案も大歓迎です!!