web-dev-qa-db-ja.com

プッシュ通知を受信したときにiPhoneアプリが実行されているかどうかを確認するにはどうすればよいですか?

IPhoneアプリにプッシュ通知を送信していますが、アプリが既に起動されているかどうかに応じて、異なる一連の命令を実行したいと思います。私はiPhone開発に不慣れで、UIApplicationまたは私のプロジェクトのAppDelegateクラスに解決策があると思いますが、良い答えは見つかりませんでした。これを確認する簡単な方法はありますか?

29
thebossman

UIApplicationデリゲートにはメソッドがあります

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo

実装する必要があります。これは、アプリの実行時に通知を受け取ります。

アプリが現在実行されておらず、通知を受信した場合、アプリは次のコマンドで起動できます。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

通知の詳細はlaunchOptionsディクショナリに保持されています。辞書がnilの場合、ユーザーは通常どおりアプリケーションアイコンをタップしました。

18
Kevin

アプリのアクティブ/非アクティブ状態を処理するためのより適切な方法は次のとおりです。

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {   
        // check for the app state
        UIApplicationState state = [application applicationState];

        if (state == UIApplicationStateActive) {
            //the app is in the foreground, so here you do your stuff since the OS does not do it for you
            //navigate the "aps" dictionary looking for "loc-args" and "loc-key", for example, or your personal payload)
        }

    application.applicationIconBadgeNumber = 0;
}

didReceiveRemoteNotification:は、アプリの実行時に呼び出されますが、一時停止されると、iOSがバッジの表示などを処理します。アプリがフォアグラウンドにある場合、OSは何もしません。 、そしてあなたのdidReceiveRemoteNotification:を呼び出すだけです。

76
Marco Papa

「ローンチ」の意味に応じて、次のいずれかを探しています。

  • 上記のケビンの答え(起動されたものと起動されていないものを区別します)
  • またはこれ(一時停止またはアクティブを区別しますが、すでに起動されています):

アプリケーションがアクティブになるとtrueに設定され、アプリケーションがアクティブでない場合はfalseに設定されるフラグを使用します。

フラグ(ヘッダーファイル[.h]内):

BOOL applicationIsActive;

コード(実装ファイル[.m]内):

- (void)applicationDidBecomeActive:(UIApplication *)application {
    applicationIsActive = YES;
}

- (void)applicationWillResignActive:(UIApplication *)application {
    applicationIsActive = NO;
}

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    if (applicationIsActive) {
        // Handle notification in app active state here
    }
    else {
        // Handle notification in app suspended state here
    }

これが機能するのは、アプリケーションが一時停止されると、OSが「ウェイクアップ」プロセス中に「applicationDidBecomeActive」を呼び出す前に「applicationDidReceiveRemoteNotification」を呼び出すためです。

「完全な」答えは、実際にはケビンの答えとこの答えです。

お役に立てれば。

26
Peter

4未満のiOSでapplicationStateを確認する場合は、applicationStateがサポートされていることを確認する必要があります。

if ([application respondsToSelector:@selector(applicationState)] ){
  // Safe to check applicationState
  UIApplicationState state = [application applicationState];
}
6
ddiego

プッシュ通知のAppleドキュメントはこれを説明しています:

ただし、applicationDidFinishLaunching:が適切な実装サイトではない状況は2つあります。

  • 通知が到着すると、アプリケーションは実行されます。
  • 通知ペイロードには、アプリケーションが使用できるカスタムデータが含まれています。

IPhone OSがリモート通知を受信したときにアプリケーションが実行されている最初のケースでは、データをすぐにダウンロードする場合は、UIApplicationDelegateのapplication:didReceiveRemoteNotification:メソッドを実装する必要があります。ダウンロード後、必ずアプリケーションアイコンからバッジを削除してください。 (アプリケーションがプロバイダーに新しいデータを頻繁に確認する場合は、このメソッドを実装する必要がない場合があります。)

これは、application:didReceiveRemoteNotification:デリゲートメソッドが呼び出された場合、アプリが実行されていることを意味します。

2