PHPからiOS/Androidアプリへプッシュ通知 2023(2)iOS編

広告:超オススメUnity Asset
  広告:超オススメUnity Asset

iOSアプリへプッシュ通知するための準備MEMOです。このシリーズは、

のように分けて書いてます。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しときます。試したという記録だけ残しておきます。

01

※ .pemは一年に一度更新する必要があるとのことなので、こうしたツールでささっと.pemを書き出せた方が便利そう。コマンドラインからAppleIDを入れてログインして、プッシュ通知用のp12やpemなどを一発で書き出せる。なんでうまく行かなかったのかはまた後日調べようと思います。

キーチェーンアクセスを使ってp12ファイルを作成

Mac環境で作ります。キーチェーンアクセスを起動し、キーチェーンアクセス>証明書アシスタント>認証局に証明書を要求… を選び、メールアドレスにメアド(一応AppleIDのメアド)、ディスクに保存(鍵ペア情報を指定はチェックしました。)で、蝶ネクタイアイコンの「CertificateSigningRequest.certSigningRequest」を保存します。

02

先ほどアクセスした「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」とあり、入れ子の中に鍵アイコンが入っているものができあがります。(なんかこの鍵が入ってないやつだとダメっぽい?)

03

この二つの項目を選択して「2項目を書き出す」から「証明書.p12」を書き出します。

.p12ファイルから.pemファイルを作成

なんか昔書いたことあったなと思ったら、ここで書いてました。

CRONでPHPを定期的に自動処理させ、Apple Push を使って各iOSデバイスに通知を配信する仕組みを施し、ある程度の期間サービスを...

上記の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月現在)。

先日、とあるWebサービスの開発担当者から「APNs Provider APIを利用してiOSにプッシュ通知するため、LinuxサーバーのPHP curlでHTTP/2リクエストができるようにしてほしい」というご依頼がありました。その設定手順をここにまとめます。※Web HTTPサーバーのHTTP/2対応ではなく、HT...

なんかこの辺の対応が必要そうですが、対応しているプロバイダを探した方が早いか、今も対策がないか探っています。

ひとまずMacから通知テスト

そだそだ、この便利なツールを忘れてた。「Knuff」です。「PHPからiOS/Androidアプリへプッシュ通知 2023(1)Unity編」で調べたiOSデバイスのデバイストークンと上記でセットアップした「Apple Push Services: com.mushikago.QuickReplace」が正しければ、このツールで実機に通知テストを発信することができます。

Token欄にコピペ。

04

「Choose..」を押すと、「Apple Push Service: 」という証明書が選択できます。(PEMで生成したものだとここで選べないんですよね)

05

選ぶと、Topic欄に「com.mushikago.QuickReplace」と自動的に入ります。(Sandboxだとこれが入らず送れないんですよね、そこが謎で本番用でやってます

【追記】Xcodeから直接インストールしたアプリはSandboxで、TestFlightでインストールしたアプリはProductionで配信テストできました。

「Push」を押すと、数秒(遅くとも10秒以内程度)で通知がきます。

06

このテストで、Unityのアセット「Cross-Platform Native Plugins : Essential Kit」で正しくデバイストークンが取れたのか、Certificates類、証明書類は正しくセットアップされたか、ペイロードの記述は正しいかなどが、テストできると思います。iOSだけなら、このテストができることは、とても便利です。

 

とりあえず、このシリーズは、「PHPからiOS/Androidアプリへプッシュ通知 2023(3)Android編」へ、ひとまず続きます。