iOSのAPNSと、AndroidのGCMの実装上の違いをまとめたいと思います。
APNSとGCMの違いまとめ表
思いつく限り、書き出してみました。追加で思いついたら書き足します。他にもあったら教えて下さい!
iOS | Android | 備考 | |
サービス名 | APNS | GCM | AndroidはかつてはC2DM |
提供元 | Apple | ||
リリースバージョン | iOS 3.0 | Android 2.2 | |
送信のプロトコル | 独自プロトコル | HTTP | |
追加で必要なライブラリ | なし | Google Play Services | |
認証形式 | SSL | APIキー | |
WEB設定画面 | Apple Developer Center | Google API Console | |
シミュレータ利用 | 不可 | 不可 | |
トークンの名前 | device token | registration id | |
トークンのコールバック先 | UIApplicationDelegate | BroadCastReceiver | |
トークン長 | 64バイト | 140〜205バイト | Androidは、ほぼこの範囲だが保証されていない。 |
デバイストークンの変動 | 一部あり | あり | iOSはiOS7へのアップデートで発生 |
トークン変動の検知 | 不可能 | 可能 | Androidは通知レスポンスから新しいトークンが取得可能 |
トークン無効化の検知 | 可能 | 可能 | iOSは無効化日時も取得可能 |
アプリ削除時のトークン | 無効化される | 無効化されない | |
debug/releaseビルドの差 | あり | なし | iOSはdebugビルドの場合サンドボックス環境を利用する必要がある |
dry run | 不可能 | 可能 | dry runは実際に通知しないで送信すること |
サンドボックス環境 | 有り | 無し | |
ペイロードの最大長 | 256バイト | 4096バイト | |
ペイロードの形式 | JSON | JSON | |
通知データのキー制約 | あり | なし | iOSはapsキーの中に設定する。 |
ペイロードあたり配信上限 | 1デバイス | 1,000デバイス | iOSは1回の接続で複数ペイロード送信可能 |
不正トークンの影響 | リクエストの停止 | リクエストは継続 | iOSは不正トークン以降のペイロードが破棄される。 |
受信方法 | OS依存 | 各自実装 | |
ダイアログ表示 | 可能 | 各自実装 | |
通知センター表示 | 一部可能 | 各自実装 | iOS 5.0以降で通知センターが追加 |
ロック画面表示 | 可能 | 各自実装 | |
サウンド | 可能 | 各自実装 | |
振動 | 可能 | 各自実装 | iOSはサウンドと振動は連動 |
バックグラウンド処理 | 一部可能 | 各自実装 | バックグラウンド処理が可能なのはiOS7から |
バッジ | 可能 | 不可能 | |
利用者への確認 | ダイアログ | パーミッション | |
利用者によるオフ | 可能 | 一部可能 | Android 4.1以降で可能 |
配信制限 | なし | なし | Androidは、C2DM時代は配信制限あり |
少し言い訳しておくと、ちゃんと確認せずに書いているので間違いがあるかもしれません。Wikipediaだったら[要出典]ってたくさん付けられてしまいそうです。
大きな違いをいくつか紹介していきます。
Androidは受信処理を各自実装する必要がある。
iOSとAndroidのプッシュ通知の設計の大きな違いは、iOSはOSの仕組みに乗らなければいけないのに対して、Androidは自由度が高く各自の実装にゆだねられているという点です。
iOSのAPNSは送信するデータの形式もしっかり決まっていて、その形式にしたがって送信すれば、あとはOSが定めた方法で表示されるだけです。一方のAndroid送信データは完全に自由で、それを受信した際にアプリがどんな動作をするかも、制限されていません。
逆にいえばAndroidは受信時の表示などの処理をすべて独自で実装する必要があり、クライアントの実装の手間は数倍になります。
AndroidのGCMはHTTPで一括送信が可能
サーバサイドの違いで大きいのは、iOSのAPNSが独自のプロトコルであるのに対して、AndroidのGCMはHTTPで通知が可能であるということです。
リクエストヘッダーにAPIキーを添え、リクエストボディにメッセージや送信先デバイスのトークンを送るだけなので、非常に単純で、サーバサイドの実装はAndroidの方が簡単と言えます。
実際にAPNSは各言語に対してライブラリがオープンソースで開発されていますが、GCMはただのHTTPであるためにライブラリはほとんど存在しません。
そして、Androidは古いC2DMからGCMへの移行で、1,000デバイスまでの一括送信が可能になりました。iOSのAPNSは1回の接続で複数のペイロードを送信することができるのですが、途中に不正なトークンなどが含まれるとそれ移行のペイロードが破棄されてしまうため、一括送信の制御には手間がかかります。
Androidのトークンはよく変わる
最後の大きな違いとしては、iOSのデバイストークンはほぼ変わらないといって良いのに対して、AndroidのレジストレーションIDはよく変動します。iOSのデバイストークンが変化したのは、3年間の開発歴の中では1回だけで、iOS7へアップデートした時だけです。
iOS7でプッシュ通知のデバイストークンに大きな変更
トークンの変化が激しいAndroidでは、1つの端末に対して複数のトークンが紐付いてしまう場合があります。トークンが変化しても古いトークンはしばらく有効ですので、サーバに複数のトークンを保持してしまうと多重送信が置きてしまうので、適切に処理してやる必要があります。
GCMにはそのための機構も用意されていて、プッシュ通知を送信したレスポンスにトークンが変化した旨と、新しいトークンが返送されます。これを元に、データベースを更新することで多重送信を制御することができます。
iOSのデバイストークンはほぼ変化しないため、このような機構はありません。
おわりに
こうして眺めてみると、iOSとAndroidの設計思想の違いみたいなものも見えてきます。
最後に例によって宣伝ですが、プッシュ通知の実装は、Growth Pushが便利です!ぜひよろしくお願いします!
iOS、Androidはもちろん、Unity、Cocos2d-xへの導入も簡単にできて、セグメント指定による配信対象の制御などもできます。
Growth Push
Growth Pushの実装中に技術調査したことなど、これからも吐き出していきます。
コメント
[…] 一つiOSとAndroidのプッシュ通知の違いとして、株式会社シロクさんのブログ内では以下のように紹介されています。 iOSとAndroidのプッシュ通知の開発の違いまとめ | 三度の飯とエレクトロン […]