アプリへのプッシュ通知機能の下調べ中

iOSにはAppleのAPNs(Apple Push Notification Service)、AndroidにはgoogleのC2DM(Android Cloud to Device Messaging)という機能がそれぞれ準備されている。名前や実装、手続きは異なるものの、概念的には全く同じといっていい仕組みになっている。

要は、

  1. アプリでプッシュ通知機能を有効化(マニフェスト宣言など)
  2. アプリからプッシュ通知配信サーバ(APNsやC2DMのサーバ)に登録リクエス
  3. 2の登録が正常に行われたら、端末を識別するIDが発行されてくる
  4. 3で得た端末IDをアプリ開発側で準備したメッセージ送信サーバ(配信プロバイダサーバ)にhttpなどで通知し、サーバ側のDBなどで管理しておく
  5. メッセージ配信時は、配信プロバイダサーバに準備しておいた配信画面などから、登録・通知された端末IDごと(リクエストデータ量の上限以内であれば複数でも可能らしい)にプッシュ通知配信サーバへJSONで固めたデータを送信(正しい送信者かどうかを認証するため、APNsはPEMファイルを用いたSSL通信、C2DMはClientLogin認証トークンを用いた通信が必要)。
  6. エラーなどの場合は適切な処理(無効なデバイスIDの除去や再送信など)が必要。

ということらしい。

細かい違いこそあれ、アプリ側からデバイスIDを送ってもらって管理し、配信サーバへメッセージ配信を依頼するための配信サーバを自前で準備する必要がある。
また、無効なデバイスIDに対してメッセージを送り続けたり、異常な頻度でメッセージを送るなど負荷のかかる事をするとキックされてしまうらしいので、エラー対策や再送処理などの実装はきちんと行わなくてはならないみたい。

作業負荷から言うと、この自前で立てる配信プロバイダサーバの作り込みが一番面倒そう。続いてアプリ側のデバイスID管理処理(デバイス登録・解除の処理まわり、通信部のスレッド分けなど)がちょっと手間かな。

配信プロバイダASPみたいなサービスが無いのかなーとか思ったけど、まあ一度作ってしまえば横展開は簡単ぽいから、みんな自前でやってるみたい。


【2012/12/13 追記】
最近は自分みたいにゼロから実装するパターンは希少らしい・・・(自前サーバで運用する必要がある業務系とか大量のデータを載せるとかの理由がある場合は別として)。
いわゆるBaasという概念が一般化していて、TitaniumならCocoafishをベースにしたAppcelerator公式のサービスが既に存在しているし、ネイティブならParseというサービスが結構有名だったり。
iOSAndroidのアプリだけでなくAPI越しにWebアプリやWindows/MacOSのデスクトップアプリにも実装出来るようなので、かなり面白そう。
これから個人や小規模アプリでPush通知扱うのであれば、下手に自力でやるよりこうしたサービスを利用するのがお利口なのかもしれないです。


参考
APNs準備手順サンプル
APNs配信プロバイダサーバ実装チュートリアル
APNsへのphpベースの送信コードサンプル
TitaniumベースでのQ&Aとサンプル
C2DMの概要(公式ドキュメントの日本語訳)
C2DMのアクセスリクエスト登録(サインアップページ)
C2DMへのphpベースの送信コードサンプル