APNS / GCMのリクエスト制限
APNSとGCMでPush通知を行う際に1回のリクエストで送信出来る端末(リクエストサイズ)数には上限があるのですが、どれぐらいだったかすぐ忘れてしまうので備忘も兼ねて。
APNS
(2015年01月18日追記)
iOS8以降の情報をキャッチアップ出来ておらず、ペイロードデータの上限が誤っていましたので、修正しましたm(__)m
(2016年10月28日追記)
iOS9以降の上限について記載しました。
- iOS8未満の場合、ペイロードデータの上限は256バイトまで。
- iOS8の場合、ペイロードデータの上限は2Kバイトまで。
- iOS9以降の場合、ペイロードデータの上限は4Kバイトまで。
- 1回の通信で全パケットが5000〜7000バイトを超えるとAPNSから切断される?(非公式)
- パケットの制限はかなり緩いが、速くリクエストしすぎるとエラーになるので、1リクエストあたり10ミリ〜50ミリ秒程度のインターバルを空けたほうがよい?(非公式)
4番目と5番目の情報は非公式かつ相反するものなので、結局は自分で確かめるしかないと思うのですが、"少なくとも秒間9000メッセージは送信出来る"という記載がAppleの公式ドキュメントにあるそうなので、ひとまず、あまり一度に大容量のメッセージを送信せず、ちょくちょくスリープ処理を入れれば問題ないかと思います。
GCM
- ペイロードデータの上限は4096バイトまで。
- マルチキャスト送信の場合は最大1000端末まで。
どちらも公式情報なので、安心です。
どうすればよいのか
上記の制限があるので、マルチOS対応の場合サーバアプリは、Pushメッセージは140文字以内(Pushでそんなに長いメッセージは送らないはず⇒Twitterと同じ文字数だけあれば充分では!という理屈)にして、数千台以上に一気に送りたい場合は、GCMに合わせて1000件ずつに分割、かつ、APNSに配慮して各処理の間で0.1秒くらいインターバル空けて、APNS及びGCMにリクエストすればほぼほぼ大丈夫かなと思いますが、他に良き案があれば教えてください。
※参考サイトにもありますが、PHPer御用達のApnsPHPは、デフォルトで1回送った後に10ミリ秒のスリープ処理を入れるようになっているので、その場合はあまり気にしなくてよいかもしれません。
参考サイト
GCM アーキテクチャの概要:
http://www.techdoctranslator.com/android/guide/google/gcm/gcm
これは罠。PHPでiPhone端末にPUSH通知を送る際の落とし穴:
http://liginc.co.jp/programmer/archives/2355
これは罠。PHPでiPhone端末にPUSH通知を送る際の落とし穴」は(一部)罠:
http://norii.hatenablog.com/entry/2013/10/09/021216
Apple Push Notification Service:
https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/ApplePushService.html