APNs

検索して出てくる情報を読んでいけば、だいたいできるようになるので、それ以外の雑多な情報。
でもAppleのドキュメントは最初に一通り読んでおいたほうがいい。

5000バイトごとに切断する件

Appleのドキュメントには、ソケット接続したら接続したままにしてくれ、と書いてあるのだが、連続して送信しているとAPNsサーバ側から切断されてしまう。
Webの情報を元に、5000バイトごとに切断して再接続すると、確かにうまいこといく。これはこういうものだということか。昔の携帯メールへの送信制限みたいな感じ?

送信するバイナリデータ形式

  • ApnsPHP、java-apnsなどで古い形式を使ったままになっているみたいので、できればAppleのドキュメントを見て、少し直してやったほうがいいようだ。
  • 古い形式だと、優先度(priority)が指定できない。priority=10固定となる。Appleのドキュメントによると
    • priority=10の場合、通知は即座に送信される。この場合、alert, sound, badgeのいずれかを発生させないといけない。ペイロードにcontent-availableしかない通知をこの優先度で送信するとエラーとなる。
    • priority=5の場合、デバイスが節電モードの時に送信される。

APNsサーバ側証明書の検証

  • Entrustのサイトからルート認証局の証明書をダウンロードする。以前は、sandboxと製品環境で証明書が違ったようだが、2010/12/22以降の現在は同じものでいい。
  • PHPでの実装の場合、明示的にこの認証局証明書を指定してあることが多い。
  • Javaの場合、jre/lib/security/cacertsに、最初から入っていることを前提としてある場合がある。2010年より前の古いJREでは入ってないかも。

InstallCert.javaを使うと、サーバの証明書が入ったcacertsファイルができる。使わなかったけど便利そうなので、メモ。

証明書に設定したパスワード間違い

java.io.IOException: failed to decrypt safe contents entry: javax.crypto.BadPaddingException: Given final block not properly padded
SSL接続でクライアント側証明書のパスワードが間違っていた時に出る例外。
ま、そういうケースもあるということで。

異なるプロバイダ側サーバから同じ証明書(クライアント側)でアクセスしても、特に問題はないみたい。

Appleのドキュメントには特に書いてないけど、プロバイダ側のサーバを複数立てて全然違うIPアドレスでもいいみたい。