iOSアプリが高速アプリ切り替えからフォアグラウンドに入ったのか手動でフォアグラウンドに入ったのかを判断する方法はありますか?applicationWillEnterForegroundが呼び出されるまでに知る必要があるため、アプリがフォアグラウンドに入った条件に応じて、特定のコードを実行(または実行しない)できます。
編集:これは私にとってより設計上の問題であることが判明しました。コードをapplicationDidBecomeActiveに移動しました。また、fastAppSwitchingという名前のappDelegateにBOOLプロパティを追加しました(おそらく名前が間違っています)。application:handleOpenURLとapplication:openURL:sourceApplication:annotationでこれをYESに設定しました。次に、次のコードをアプリケーションに追加しました:didFinishLaunchingWithOptions:
if (launchOptions) {
self.fastAppSwitching = YES;
}
else {
self.fastAppSwitching = NO;
}
applicationDidBecomeActiveでは、次のコードを使用しました。
if (fastAppSwitching == YES) {
self.fastAppSwitching = NO; //stop, don't go any further
}
else {
...
}
EDIT2:MaxGabrielは、以下の良い点を指摘しています。「ここで説明する解決策を採用している他の人への警告です。applicationDidBecomeActive:は、applicationWillEnterForegroundとは異なり、ユーザーが電話やテキストメッセージを無視した場合に呼び出されます」。これは実際には、アプリ内購入とFacebookアプリ内認証(iOS 6の新機能)にも当てはまります。したがって、さらにいくつかのテストを行うと、これが現在の解決策になります。
passThroughWillEnterForegroundという新しいブール値を追加します。
applicationWillResignActiveの場合:
self.passedThroughWillEnterForeground = NO;
applicationDidEnterBackgroundの場合:
self.passedThroughWillEnterForeground = NO;
applicationWillEnterForegroundの場合:
self.passedThroughWillEnterForeground = YES;
applicationDidBecomeActiveの場合:
if (passedThroughWillEnterForeground) {
//we are NOT returning from 6.0 (in-app) authorization dialog or in-app purchase dialog, etc
//do nothing with this BOOL - just reset it
self.passedThroughWillEnterForeground = NO;
}
else {
//we ARE returning from 6.0 (in-app) authorization dialog or in-app purchase dialog - IE
//This is the same as fast-app switching in our book, so let's keep it simple and use this to set that
self.fastAppSwitching = YES;
}
if (fastAppSwitching == YES) {
self.fastAppSwitching = NO;
}
else {
...
}
EDIT3:アプリが終了から起動されたかどうかを判断するためのブール値も必要だと思います。