テクノモンキーのアプリ開発日記

テクノモンキーの開発ブログです。iOS、Android、Unity、Cocos2d-xなどアプリ開発関連のTipsやアプリ開発に役立つ情報を発信します。

【iOS】TestFlightのプッシュ通知はApnsの本番サーバーに向いているっぽい

最近、iOSアプリ開発で自社サーバーを使ったプッシュ通知を実装しました。

今まではFCM(Firebase Cloud Messaging)使った一斉配信ばかり使っていたのであまり気にしたことなかったのですが、今回自社サーバーを使ったプッシュ通知を実装してみて、TestFlightのプッシュ通知はApns(Apple Push Notification Service)の本番サーバーに向いているっぽかったので、今後の為にメモとして残しておきます。

 

iOSアプリのプッシュ通知を自社サーバーで実装する方法

https://cdn-ak.f.st-hatena.com/images/fotolife/s/samril/20130903/20130903142549.png

画像:Apple Push Notification Serviceを使ってiOSにプッシュ通知をするために必要な証明書の準備方法 - ggった結果

 

まず、iOSアプリのプッシュ通知を自社サーバーで実装する方法についてですが、

上記の画像でいうところの「送信元サーバー」の部分を実装する感じです。

(FCMを使ったプッシュ通知の場合だと、Firebaseが代用してくれていた)

一斉通知だけならFCMで十分事足りますが、FCMの場合は個別のプッシュ通知や、特定の条件のユーザーのみにプッシュ通知を送る場合はカスタマイズが必要になるので、いっそのこと自社サーバーでやってみようということになりました。

 

プッシュ通知のサーバー部分はapns-phpを使用

iOSアプリのプッシュ通知サーバー部分の開発をどうしようか調べていたら、iOSプッシュ通知のサーバー側用ライブラリである「apns-php」を使えばめちゃくちゃ簡単そうだったので、apns-phpを使うことにしました。

 

code.google.com

 

apns-phpを使った実装の流れ

詳しい実装方法については以下の記事がめちゃくちゃわかりやすかったです。

www.lancork.net

www.lancork.net

 

ざっくりとした流れとしては以下です。

  1. プロバイダ証明書・AppID・プロビジョニングプロファイルの準備
  2. ルート証明書の準備
  3. サーバー側でプロバイダの準備(apns-phpの導入)
  4. アプリ側でデバイストークンの取得
  5. プッシュ通知のテスト

上記の記事の流れで進めたらかなりスムーズにテスト配信まで行けました。

できれば、有効期限がなく・証明書の更新が不要なApnsの認証キーを使う方法でやりたかったのですが、自社サーバー+Apns認証キーを使った実装が調べても見つからなかったのでプッシュ通知証明書の方で実装しました。

 

懸念点としては、apns-php自体はかなり前からあるサービスですが、最近の更新はほぼ行われていない為、今後のiOSアップデートにも対応して行けるのか心配です。

(調べた感じだと、近い将来iOSバイスの仕様変更で既存のapns-phpでは動かなくなるかもらしい)

 

TestFlightのプッシュ通知はApnsの本番サーバーに向いているっぽい

で、ようやく本題なのですが、TestFligtのプッシュ通知はApnsの本番サーバーに向いているらしいぞって話です。

 

プッシュ通知のテスト配信を行っていたら、以下のような現象を確認しました。

 

  • Xcodeでビルド・実機転送してデバイストークンを取得した場合だと、普通にApnsからプッシュ通知が届く
  • TestFlightからインストールした端末・アプリの場合、プッシュ通知が届かない

 

TestFlightからアプリをインストールした端末の方はAppleDeveloperにUDIDを登録していなかったので、もしかしたらそれが原因なのかも?と思い、UDIDの登録とプロビジョニングプロファイルの再ダウンロードを行い、再ビルド・再アップロードしてTestFlightから再度ダウンロードしましたが、結局プッシュは届きませんでした。

 

で、ネットを調べていたら、以下の記事を発見しました。

qiita.com

 

TestFlightというくらいなので、てっきり開発用のプッシュ通知証明書・開発用のApnsサーバーに向いていると思ってましたが、上記を参考にすると本番サーバーを向いている可能性が高いです。

実際、apns-phpのapnsの証明書設定を本番用にむけたところ、TestFlightからインストールした端末にも通知が届くようになりました。

 

状況を整理すると、最初の現象が発生したのは、

apns-phpにapns開発用証明書を設定した状態だったことにより、

Xcodeで実機転送した端末は開発ビルドなので開発用のデバイストークンが発行され、プッシュ通知が届いた

→TestFlightでインストールした端末は本番用のデバイストークンになる為、apnsからの通知が届かなかった(apns-phpで開発用のapns証明書を設定している為)

ということなのかなと思います。

 

今後は、プッシュ通知を実装したアプリをTestFlight経由でアプリをインストールする場合は、プッシュ通知の証明書は本番に向けるように気をつけたいと思います。

(ただ、今回の場合はリリース前だから特に問題ありませんが、リリース後にTestFlightでプッシュ通知のテストをしたい場合などにはちょっと対策を考えないといけないなと思いました。)