APNS(Apple Push Notification Service)を使ってプッシュ通知がうまく送信できないとき、エラーをみても情報が少なく解決するのに頭を悩ませることが多々あるかと思います。
その際に、陥りやすいミスを列挙しました。送信できない場合は以下の点をチェックしてみてください。
1.証明書は正確に生成できているか
APNS用の証明書を作る際、コマンドラインで複数のコマンドを実行することによって証明書を生成するため、間違ったコマンドを入力していると正しい証明書が生成されません。
筆者は以下のコマンドで生成されることを確認していますので、記載しておきます。aps_production_ck.pemがAPNSでプッシュ通知を送る際に必要な証明書です。(productionは本番環境/developmentはテスト環境)
- aps_production_identity.cert ... iOS Dev Centerからダウンロードした証明書
- aps_production_key.p12 ... aps_production_identityをインストールしてキーチェーンストアから書きだした鍵
openssl x509 -in aps_production_identity.cer -inform der -out aps_production_cert.pem
openssl pkcs12 -nocerts -out aps_production_key.pem -in aps_production_key.p12
cat aps_production_cert.pem aps_production_key.pem > aps_production_ck.pem
証明書を生成するスクリプトを公開しました。
http://qiita.com/0x0c@github/items/0514e8b11f84fc0fde36
証明書を生成するアプリを公開しました。
https://itunes.apple.com/jp/app/pempem/id876280659?mt=12
2.証明書のパスワードは間違っていないか
これはサーバサイドでの話です。
証明書のパスワードが間違っている場合、送信ができませんのでパスワードをチェックしましょう。
3.(Development環境の時)ProductionがEnabledになっていないか
iOS Dev CenterのApp IDs画面からプッシュ通知を送ろうとしているアプリの状況を確認しましょう。Push Notificationの欄でProduction(本番環境)がEnabledになっている場合、Development(開発環境)の証明書を使ってもプッシュ通知を送ることができません。
4.Provisioning fileを最新版にする
iOS Dev CenterのApp IDsからPush NotificationをEnabledにしたあと、ローカルに保存されているProvisioning fileを最新版にしないと、アプリ側でプッシュ通知がONになりません。XcodeのWindow->OrganizerからProvisioning fileをRefreshしてください。
もしくは、ダウンロードしなおしてインストールし直してください。
5.AdHocで配信しているアプリはPush通知を受信しない
AdHocのProvisioning fileはDevelopment向けではないため、AdHocで配信しているアプリはPush通知を受診することができません。
なので、実機転送したアプリ出ないとPush通知のテストはできません。
TestFlightを使ってアプリを配信していると、陥る罠だと思います。
プッシュ通知を送る際の証明書はProductionのものを使うと動く可能性があるようです。こちらの環境では確認できていません。
6.Device Tokenの取得方法が間違っている
iOS8からDevice Tokenの取得の方法が変わりました。
そのため、iOS7で動いていたコードでもiOS8では正しく動作しません。
新しいDevice Tokenの取得方法にコードを書き直す必要があります。
その際、iOS8とそれ以前とで条件分岐する必要があります。
Device Tokenを取得するライブラリを書きましたのでご活用ください。
https://github.com/0x0c/M2DPushNotificationManager
7.Device Tokenが混ざっていると飛ばない
Development環境のtokenとProduction環境のtokenを混ぜて送信すると動かないようです。
環境を切り替える際はテーブルをトランケートするか、別々のテーブルを使用したほうが良さそうです。
(@hodadeさんより)
8.大量に送信するとTCPコネクションが切断される
プッシュ通知を大量に送るとAppleのサーバがTCPコネクションを切断してくるため、再送制御が必要になります。
9.証明書が失効していないか?
受託や他社との共同プロジェクトの場合、Developerアカウントへのアクセス権限がないことがあるかと思います。
その際、証明書の失効期限を確認する手段が限られ、気がついたら失効していた!なんてことが発生することがあります。
間違っている情報があったら指摘していただけると幸いですm(_ _)m