このシナリオを考えてみましょう。
1)アプリを起動します
2)アプリをバックグラウンドに置きます(ホームボタンを押します)
3)サーバーはPUSH通知をクライアントに送信します
4)ユーザーはメニューからアイコンをクリックしてアプリを再開します
この場合、didReceiveRemoteNotificationとdidFinishLaunchingWithOptionsは呼び出されないので、通知を受け取るにはどうすればよいですか?
簡単な答え: このシナリオでは取得できません。
プッシュ通知に重要なペイロードが含まれている場合、次の理由により、重要なことに依存するべきではないため、それを含める必要はありません。
そもそも通知がデバイスに配信されるとは限りません
ユーザーは通知をオフにすることができます
彼らはそれらを無視することができました
表示される予定のときにデバイスの電源がオフになっていると、デバイスは失われます
サーバーが通知を送信したかどうかを知る必要がある場合は、アクティブになったときにホームに接続し、送信したかどうかを確認してください。
applicationWillEnterForeground:
メソッドをチェックインする必要があります。
ユーザーがプッシュ通知を無視することを選択した場合、アプリには何も表示されないと思います。最初に考えられる回避策は、アプリが最後に開かれてからプッシュ通知に値する何かが発生したかどうかをサーバーで確認し、それをローカル データと関連付ける方法を提供することです。
このシステムの背後にあるアイデアは、実際の機能をプッシュ通知から分離し、通知が 1 つの目的 (新しいデータ/イベント/などの通知) のみに使用されるようにすることであり、データのダウンロードと処理は完全に完了したらアプリに任せることだと思います。前景に。つまり、ダウンタイム中の通知が受信/無視されなかった場合でも、アプリが常に最新であることを確認するために、起動シーケンスですべてを複製する必要があります。
application:didReceiveRemoteNotification:
したがって、データを転送してモデルを更新するのではなく、イベントに反応して必要な手順を開始することを目的としています。ほとんどの場合、データは通知に収まるほど小さいため、アプリケーションはそれ以上コンテンツをダウンロードせずに続行できます。