web-dev-qa-db-ja.com

iOSプッシュ通知-通知ではなくアプリアイコンをクリックしたときに通知データを取得する方法

この質問に似ています: applicationDidBecomeActiveのリモートプッシュ通知データにアクセスするにはどうすればよいですか?

ただし、異なるのは、inapplicationDidBecomeActiveのときに通知データにアクセスする方法と、プッシュ通知の代わりにアプリアイコンをクリックした場合です

フローは:Push notification次にdidReceiveRemoteNotificationがトリガーされますが、元のアプリアイコンをクリックすると、applicationDidBecomeActiveのみがトリガーされ、didReceiveRemoteNotificationは呼び出されません。

後者のケースを探しているので、プッシュ通知データにアクセスするにはどうすればよいですか。

(どちらの場合も、アプリがバックグラウンドにあり、まだ強制終了されていないと想定しています。)

36
Howard

ホーム画面からアプリを起動してリモートプッシュペイロードを取得することはできません。

プッシュデータがアプリの使用にとって重要な場合は、アプリの起動後にサーバーからプッシュデータを読み込みます。

38
fannheyward

@fannheywardの答えは完全に正しいです。アプリのアイコンをタップしてアプリを起動すると、ペイロードを取得できません。

アプリのアイコンをタップしてアプリを起動したときに、いくつかの通知が保留されていることを知ったらどうなるでしょうか。この知識があれば、アプリはサーバーからペイロードをフェッチできます。

そのようなすべての通知で「バッジ」を設定でき、applicationDidBecomeActiveで[application applicationIconBadgeNumber]> 0をチェックして、一部の通知がアクティブであることを確認できます。サーバーからペイロードを取得した後、以下のように0に設定できます

[UIApplication sharedApplication] setApplicationIconBadgeNumber:1];
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];

注:これは、通知を受信したときにアプリにバッジが表示されることを意味します。ユーザーが設定からバッジを無効にしたときの動作がわかりません。

6
msk

アプリケーションターゲットがiOS7を超えている場合は、アプリケーションがバックグラウンドで動作している場合にのみ実行できます。

Xcodeの機能設定で、バックグラウンドモード>リモート通知を有効にし、以下のコードを書く必要があります。

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{ 
    // save userInfo in NSUserDefaults
    completionHandler( UIBackgroundFetchResultNoData );
}

テストしたい場合は、 https://github.com/acoomans/SimulatorRemoteNotifications を使用すると便利です。

  • サーバー側から、content-availableプロパティに値1を設定してください

これが機能するためには、バックグラウンドのフェッチボックスもオンにする必要がありました。

4
kasajei