質問: 質問失礼いたします。 プッシュ通知を受信した後、バッジを表示したいのですが、バックグラウド状態での処理が行われません。 以下のように分岐して行っております。 ``` // Push通知受信時とPush通知をタッチして起動したときに呼ばれる func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) { switch application.applicationState { case .Inactive: // アプリがバックグラウンドにいる状態で、Push通知から起動したとき break case .Active: // アプリ起動時にPush通知を受信したとき break case .Background: // アプリがバックグラウンドにいる状態でPush通知を受信したとき break } } ``` caseの.Inactiveと.Active は処理されるのですが、.Backgroundが処理されません。 ですので、 プッシュ通知を受信した、アプリを開いていない人にバッジを表示することができておりません。 ご教授願います。
回答: アプリがバックグラウンドにある状態でプッシュ通知を受信した場合でも`didReceiveRemoteNotification:userInfo`がBackgroundで呼びだされることはありません。 なぜなら、バックグラウンド状態のアプリは、ユーザーがプッシュ通知メッセージをタップすることで初めてキックされ、そこからフォアグラウンドへ移行するために一旦Inactive状態へ移行してから`didReceiveRemoteNotification:userInfo`が呼びだされるからです。 つまり、バックグラウンドにある状態でプッシュ通知により起動されたかどうか判断したいなら、InActiveかどうかを見るだけでかまいません。 バッジが表示されないとのことですが、バックグラウンド状態でも未起動状態でも、iOSはプッシュ通知を受信したら、サーバーからの通知内容に従ってアプリをキックする前に通知音を鳴らし、通知メッセージを表示し、その時に同時にアイコンバッジも表示します。(その後、ユーザーが通知メッセージをタップして初めてアプリをキックします。) なので、バックグラウンド(または未起動)の時にバッジが表示されないのでしたら、サーバーからの通知内容にバッジ表示が設定されてないか、iPhone側の通知設定でバッジの受け取りを有効にしていないかのどちらかではないかと思います。 (追伸) プッシュ通知受信時にユーザーがメッセージをタップする前にサーバーからコンテンツを事前ダウンロードしておきたいような場合は、バックグラウンド動作を設定することで、プッシュ通知受信のタイミングでアプリをバックグラウンド動作させることも可能です。もし、この機能を動作させるついでにアプリでバッジ表示をするつもりでしたら、`didReceiveRemoteNotification:userInfo`でなく`didReceiveRemoteNotification:fetchCompletionHandler`を実装する必要が有ります。 の解説がわかりやすいと思いますので、一読しておくことをお勧めします。