[iPhone] APNs プッシュ通知、リモート通知受信

プロバイダーからのプッシュ通知をアプリのステータスによって取得できるようにします
 

  1. Client App から端末に APNs にSSL接続させ deviceToken を取得
  2. Client App が Provider に deviceToken を送出
  3. Provider がその deviceToken を使って特定端末に通知を送る
  4. Client App リモート通知受信のケース分け

 

アプリスのテータスによる受信

 
前のページで試したものは、アプリ起動中に通知を受けたケースでむしろこれはまれで
アプリがバックグラウンドいる場合や、プッシュ通知でアプリを起動する場合等があります
 
「iOSアプリケーション プログラミングガイド」によるとアプリのステータスには
下のような状態をとるようです
 
スクリーンショット 2014-05-14 15.55.09
 
applicationState にてアプリが active か inactive か判断して切り分けられます
(あえて切り分けなくてもいいかもしれませんが)
AppDelegate.m

 
既に通知を受けていた状態で起動するところで通知を取得するケースもあります
inactive との違いはアプリの状態で didFinishLaunchingWithOptions を経由するかどうかになります
AppDelegate.m

 
アプリが Foreground にいない場合にプッシュ通知を受け
その通知を選択してアプリが起動されれば、メッセージを取得できますが
通知をユーザーが選択せず、バッジで気がつきアイコンから起動した場合は
メッセージをアプリでは取得できないようです

アプリがサーバーへ取りに行くようにすればワークアラウンドにはなるようですが
Stack Overflow
 
push-notification_98
 
applicationDidBecomeActive: を経由するけれど…
 

Development から Distribution への変更

 
開発から配布・製品に変更するのは
同じような手順ですが、故に混同しやすいので注意です
 
また、Ad Hoc を使って製品前の段階でテストが必須です
なぜなら、開発では製品で使う APNs サーバーが異なり
デバイストークンも異なります
そのため、Distribution の前に Ad Hoc でテストする必要があります

同じような手順ですが
生成物、設定は異なります、差分をリストアップしてみると
こんなところでしょうか

Development Ad Hoc Distribution
APNs SANDBOX PRODUCTION PRODUCTION
デバイストークン 開発用トークン 製品用トークン 製品用トークン
Provisioning Profile Development Distribution: Ad Hoc Distribution: App Store
Xcode: Code Singing Development Distribution: Ad Hoc Distribution: App Store
Certification aps_development.cer aps_dsitrubution.cer aps_dsitrubution.cer
xxx_development.pem xxx_distribution.pem xxx_distribution.pem
 Test Xcodeと実機 xxx.ipaとテスト実機  (本番: App Store)

 
Ad Hoc でのテスト方法は下を参考にしてください
Ad Hoc によるテスト方法
 

  1. Client App から端末に APNs にSSL接続させ deviceToken を取得
  2. Client App が Provider に deviceToken を送出
  3. Provider がその deviceToken を使って特定端末に通知を送る
  4. Client App リモート通知受信のケース分け