この質問に似ています: applicationDidBecomeActiveのリモートプッシュ通知データにアクセスするにはどうすればよいですか?
ただし、異なるのは、inapplicationDidBecomeActive
のときに通知データにアクセスする方法と、プッシュ通知の代わりにアプリアイコンをクリックした場合です。
フローは:Push notification
次にdidReceiveRemoteNotification
がトリガーされますが、元のアプリアイコンをクリックすると、applicationDidBecomeActive
のみがトリガーされ、didReceiveRemoteNotification
は呼び出されません。
後者のケースを探しているので、プッシュ通知データにアクセスするにはどうすればよいですか。
(どちらの場合も、アプリがバックグラウンドにあり、まだ強制終了されていないと想定しています。)
ホーム画面からアプリを起動してリモートプッシュペイロードを取得することはできません。
プッシュデータがアプリの使用にとって重要な場合は、アプリの起動後にサーバーからプッシュデータを読み込みます。
@fannheywardの答えは完全に正しいです。アプリのアイコンをタップしてアプリを起動すると、ペイロードを取得できません。
アプリのアイコンをタップしてアプリを起動したときに、いくつかの通知が保留されていることを知ったらどうなるでしょうか。この知識があれば、アプリはサーバーからペイロードをフェッチできます。
そのようなすべての通知で「バッジ」を設定でき、applicationDidBecomeActiveで[application applicationIconBadgeNumber]> 0をチェックして、一部の通知がアクティブであることを確認できます。サーバーからペイロードを取得した後、以下のように0に設定できます
[UIApplication sharedApplication] setApplicationIconBadgeNumber:1];
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];
注:これは、通知を受信したときにアプリにバッジが表示されることを意味します。ユーザーが設定からバッジを無効にしたときの動作がわかりません。
アプリケーションターゲットがiOS7を超えている場合は、アプリケーションがバックグラウンドで動作している場合にのみ実行できます。
Xcodeの機能設定で、バックグラウンドモード>リモート通知を有効にし、以下のコードを書く必要があります。
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
// save userInfo in NSUserDefaults
completionHandler( UIBackgroundFetchResultNoData );
}
テストしたい場合は、 https://github.com/acoomans/SimulatorRemoteNotifications を使用すると便利です。
これが機能するためには、バックグラウンドのフェッチボックスもオンにする必要がありました。