web-dev-qa-db-ja.com

iOSアプリケーションがフォアグラウンドまたはバックグラウンドで実行されているかどうかを判断する方法は?

誰もが知っているように、iOSアプリがフォアグラウンドで実行されている場合、アプリは削除通知が来てもユーザーに通知しません。私のアプリで、リモート通知が来ることをユーザーに通知するアラートを表示したいと思います。アプリがフォアグラウンドまたはバックグラウンドで実行されているかどうかを判断するにはどうすればよいですか?私はドキュメントを見つけて、stackoverflow.comを検索しましたが、それについて何かを見つけることができませんでした。ありがとうございました。

27
Smeegol

[UIApplication sharedApplication].applicationStateは現在の状態を返し、可能な値を確認し、システム機能を使用できるときに不要なフラグを作成しません。

検討する必要がある値:

  • UIApplicationStateActive
  • UIApplicationStateInactive
  • UIApplicationStateBackground

例えば.

+(BOOL) runningInBackground
{
    UIApplicationState state = [UIApplication sharedApplication].applicationState;
    return state == UIApplicationStateBackground;
}

+(BOOL) runningInForeground
{
    UIApplicationState state = [UIApplication sharedApplication].applicationState;
    return state == UIApplicationStateActive;
}
73
Pavel Oganesyan

状態のチェックがうまくいかない場合があります。

これが私が遭遇したものです:BTを使用しようとして無効になっている場合、iOSはユーザーがBTをオンにするかどうかを尋ねるダイアログを表示します。これが発生した場合、アプリケーションの状態は、アプリがフォアグラウンドにあるかどうかを判断する信頼できる方法ではありません。

まず最初に、2つのapplicationDidBecomeActiveイベントを取得します。1つは(正しく)アプリが表示された後、もう1つはユーザーがダイアログのボタンを押した後に(誤って)表示されます(iOS設定が最前面のアプリです)。

UIApplication.applicationStateは、「アクティブ」とは言えません(少なくとも、「元の質問」のように、「アクティブ」がフォアグラウンドにあると解釈した場合)。

最初の起動時にwillEnterForegroundを取得しないため、アプリが表示されているかどうかを確実に検出する唯一の確実な方法(私が理解できる限り)は、フラグを設定して、それをtrueに設定することです。

applicationDidFinishLaunching
applicationWillEnterForeground

とで偽:

applicationDidEnterBackground
applicationWillResignActive 
5
N.J.