tarotaroのエンジニア生活

技術ネタとか日々の仕事の話とか

iPhoneのpush通知の実装で注意すべきこと

まず、iPhoneのプッシュ通知を実装する場合次の3つのシナリオがあることを注意しなければならない、
  1. 通知を受け取ったときに、プッシュ通知を実装するアプリが起動してない場合
  2. 通知を受け取ったときに、プッシュ通知を実装するアプリがフォアグラウンドで動いている場合
  3. 通知を受け取ったときに、プッシュ通知を実装するアプリがバックグラウンドで動いている場合
この三パターンがある、調べると、1については、
didFinishLaunchingWithOptions
で、実装などと書いてあるところもあるが、結局のところ、didReceiveRemoteNotification:(NSDictionary *)userInfo
を実装してあれば、こちらが呼ばれる。
2、3についてもこちらがよばれる。
もちろん、これは、OKボタンを押した場合であって、キャンセルボタンを押した場合よばれない。メソッドの中で、1、2、3を区別するには、

application.applicationStateの値が
UIApplicationStateActive

UIApplicationStateInactive
で、判断する。
ちなみに、1と3を区別するためには、
didFinishLaunchingWithOptions
が呼び出されたかで、判断すればいいと思う。それぞれのメソッドを実装する場所はAppDelegateに実装っするのが一般的みたいだけれども、UIApplicationDelegateデリゲートに、設定してあれば、どこでも
大丈夫だと思う。

その他の注意点としては、サーバ側の実装のことになってしまうが、
バッジの数値の増やし方の実装の仕方が
書いてあるところがなかなかみつからない。バッジの数値を設定するには、プッシュ通知を
送るサーバから badgeに数値を設定して送るとかいてあるが、この数値でバッジを付けると
その数値が番号なってしまうので、番号を増やす命令というのはないようだ。
通知がきたら、プログラムのなかで、バッジの番号を増やせばいいじゃないかとも考えたのだが、
そもそも実行されてないとき(1のとき)に、キャンセルを押された場合プログラムは実行されないで、番号は増えない。そのため
バッジの番号はサーバ側でどんどん増やして通知していき、バッジを消す処理を
入れてある部分のページ(通知でOKを押したときに開かれるページなど)にサーバ側の番号を
リセットする処理をいれないといけないっぽい。たしかに、通知があるアプリは、通知が消えるページは、ネットワークにアクセスしにいくページがほとんどだ。
 ちなみに、バッジ、サウンド、メッセージ以外の情報も通知では送れるが、
サイズに256byteの制限があるようだ。
その情報は、userInfoなりlaunchOptions などのメソッドの引数に、
DictionaryとしてUIApplicationLaunchOptionsRemoteNotificationKeyというキーで入ってくる。
ちなみに、サーバ側はデータをJSONの形式で送るようになっている。