iOSアプリへプッシュ通知するための準備MEMOです。このシリーズは、
- PHPからiOS/Androidアプリへプッシュ通知 2023(1)Unity編
- PHPからiOS/Androidアプリへプッシュ通知 2023(2)iOS編
- PHPからiOS/Androidアプリへプッシュ通知 2023(3)Android編
- PHPからiOS/Androidアプリへプッシュ通知 2023(4)PHP編
のように分けて書いてます。iOSアプリへはApnsPHP(あるいはcurl_exec)を介してAPNs(Apple Push Notification Service)、AndroidアプリへはFirebase Admin SDK for PHPを介してFCM(Firebase Cloud Messaging)を使います。
iOS編
UnityのProject SettingsでSigning Team IDをちゃんと入れて、Automatically Signをチェック、company Nameを「mushikago」、Product Nameを「QuickReplace」と入れると、自動でBundle Identifierが「com.mushikago.QuickReplace」となり、この状態で、iOS用のXcodeプロジェクトを書き出します。
このMEMOでは今後、このバンドルIDのアプリを例に書いていくことにします。
Xcodeで開き、Product > Archive を実行。この作業によって、Xcodeによって自動的にApple DeveloperのCertificates, Identifiers & Profiles > Identifiers に「com.mushikago.QuickReplace」が作られていると思います。それを選び、「Capabilities」の一覧から「Push Notifications」にチェックします。「Configure(あるいはEdit)」を押すと、「Development SSL Certificate」と「Production SSL Certificate」というのがあり、ここにこれからゴニョゴニョやっていきます。
ApnsPHPからプッシュ通知をするにあたり、.pem という拡張子のファイルを用意するのですが、sudo gem install pem
でインストールする「PEM」というのも便利そうだったので試してみたのですが、これで書き出したpemではなんかうまく行かなかったのでキーチェーンアクセスを使う方法をMEMOしときます。試したという記録だけ残しておきます。
※ .pemは一年に一度更新する必要があるとのことなので、こうしたツールでささっと.pemを書き出せた方が便利そう。コマンドラインからAppleIDを入れてログインして、プッシュ通知用のp12やpemなどを一発で書き出せる。なんでうまく行かなかったのかはまた後日調べようと思います。
キーチェーンアクセスを使ってp12ファイルを作成
Mac環境で作ります。キーチェーンアクセスを起動し、キーチェーンアクセス>証明書アシスタント>認証局に証明書を要求… を選び、メールアドレスにメアド(一応AppleIDのメアド)、ディスクに保存(鍵ペア情報を指定はチェックしました。)で、蝶ネクタイアイコンの「CertificateSigningRequest.certSigningRequest」を保存します。
先ほどアクセスした「Identifiers」のcom.mushikago.QuickReplaceの「Push Notifications」の「Configure(あるいはEdit)」ページから「Production SSL Certificate」の方の「Create Certificate」を押します。Developmentと両方作る記事が多いですが、ここではProduction(本番用)だけ作ることにします。(Developmentはいろいろ動かないことが多かったりするので)
「Upload a Certificate Signing Request」で先ほどの「CertificateSigningRequest.certSigningRequest」ファイルを選択し「Continue」。作成された「Download Your Certificate」と表示されたら「Download」。「aps.cer」という証明書アイコンのファイルが落とせます。
「aps.cer」をダブルクリックするとキーチェーンアクセスに「Apple Push Services: com.mushikago.QuickReplace」とあり、入れ子の中に鍵アイコンが入っているものができあがります。(なんかこの鍵が入ってないやつだとダメっぽい?)
この二つの項目を選択して「2項目を書き出す」から「証明書.p12」を書き出します。
.p12ファイルから.pemファイルを作成
なんか昔書いたことあったなと思ったら、ここで書いてました。
上記のMEMOにもあるようにopenssl
で.pemを作成。今回はdevelop用ではなく本番用なのでsandboxと付けずに
openssl pkcs12 -in 証明書.p12 -out server_certificates.pem -nodes -clcerts
です。opensslコマンドについてはここでは割愛します。
【追記】-out server_certificates.pem
で指定したファイル名は、後からFinderとかでリネームしたりすると動作しなくなるようです。
キーチェーンアクセスでp12を書き出す際にpemって項目もあるのにグレイアウトしています。ここで書き出せればええやんと思うのですが、何か方法があるのかも。こうしてようやくPHPから通知を行う際に必要なpemが用意できるわけですが、そこそこの手間がかかるのでやはり上記の「PEM」で一発で書き出せる方法をもう少し探ってみます。その時はここに追記します。
これでようやくPHPからプッシュ通知を行う証明書の準備はできたのですが、ここまで書いてなんですが、アップルのプッシュ通知APNsでは、HTTP/2が必須となっていて、サーバー側のPHPでHTTP/2対応のcURLが使えないとApnsPHPでプッシュ通知時にイニシャライズのエラーが発生します。(レガシーバイナリプロトコルは非推奨となっていて、そのまま送るとエラーもなくうんともすんとも言わない罠にかかります)。
ApnsPHPからのエラーメッセージはこう。
Unable to initialize HTTP/2 backend.
今のところ、HetemlもXserverもプランによっては対応していない模様(2023年11月現在)。
なんかこの辺の対応が必要そうですが、対応しているプロバイダを探した方が早いか、今も対策がないか探っています。
ひとまずMacから通知テスト
そだそだ、この便利なツールを忘れてた。「Knuff」です。「PHPからiOS/Androidアプリへプッシュ通知 2023(1)Unity編」で調べたiOSデバイスのデバイストークンと上記でセットアップした「Apple Push Services: com.mushikago.QuickReplace」が正しければ、このツールで実機に通知テストを発信することができます。
Token欄にコピペ。
「Choose..」を押すと、「Apple Push Service: 」という証明書が選択できます。(PEMで生成したものだとここで選べないんですよね)
選ぶと、Topic欄に「com.mushikago.QuickReplace」と自動的に入ります。(Sandboxだとこれが入らず送れないんですよね、そこが謎で本番用でやってます)
【追記】Xcodeから直接インストールしたアプリはSandboxで、TestFlightでインストールしたアプリはProductionで配信テストできました。
「Push」を押すと、数秒(遅くとも10秒以内程度)で通知がきます。
このテストで、Unityのアセット「Cross-Platform Native Plugins : Essential Kit」で正しくデバイストークンが取れたのか、Certificates類、証明書類は正しくセットアップされたか、ペイロードの記述は正しいかなどが、テストできると思います。iOSだけなら、このテストができることは、とても便利です。
とりあえず、このシリーズは、「PHPからiOS/Androidアプリへプッシュ通知 2023(3)Android編」へ、ひとまず続きます。
東京造形大学卒業後、マクロメディア(現アドビ)に入社。QAやテクニカルサポートマネージャーとしてFlash、DreamweaverなどのWeb製品を担当。独立後、2007年に虫カゴデザインスタジオ株式会社を設立。2021年東京三鷹を拠点に。最近は、Unity, Unity Netcode for GameObjects, CakePHP, Laravel, ZBrush, Modo, Adobe Substance 3D, Adobe Firefly, Xcode, Apple Vision Pro, Firebaseにフォーカスしています。モバイルアプリ開発情報を主としたブログ「MUSHIKAGO APPS MEMO」の中の人。