UnityのiOS、Androidアプリへデバイス特定でプッシュ通知するまでのMEMOです。(プッシュ通知は生モノなので2023年11月現在としておきます)
長くなりそうなので、以下のように分けて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編
PHPではiOSアプリへはApnsPHP(あるいはcurl_exec)を介してAPNs(Apple Push Notification Service)、AndroidアプリへはFirebase Admin SDK for PHPを介してFCM(Firebase Cloud Messaging)を使います。
また、「Unity」と書いていますが、アセットを使うとデバイストークンの取得が便利ってだけで、それらがわかるなら、それ以外の証明書準備やPHP部分の(2)iOS編、(3)Android編、(4)PHP編あたりがプッシュ通知の肝な話です。
Unity編
Unityユーザーなら、超オススメのアセット「Cross-Platform Native Plugins : Essential Kit (Mobile – iOS & Android)」を買いましょう。いろいろアセットを買いましたが、これは損しません。このアセットについては今後も色々このブログに書いて行こうと思います。今回は、プッシュ通知の一部だけ。バナーも貼っておきます。
実機のデバイストークンを調べる
今回Unityで使うのはこのデバイストークンを調べるところだけ。なので、それがわかっているというなら、Unityのアプリでなくともプッシュ通知部分はどれで作っても同じです。また、このMEMOでは、特定のデバイスだけに通知を送ることを目的としているので、デバイストークンを調べることを書いています。
デバイストークンというのは、そのアプリをインストールした実機を特定する文字列。アプリを削除したりすると新しいものに書き変わる模様。アップデートでは書き換わらない模様。あと、クラウドアプリのようにユーザーは同じでも実機が違うなら別の文字列になるので、デバイストークンをユーザーに複数紐づけるような工夫が必要。
「Cross-Platform Native Plugins : Essential Kit(以下、EssentialKit)」をパッケージマネージャーからインストール後、適当にボタンを作って以下のコードを実行するようにして、ボタンを押したらデバイストークンをクリップボードにコピーして取得できるようにしておきます。最終的なテスト通知でこの実機に通知するまでやれれば成功としておきます。
※ Unityの Window > Voxel Busters > Essential Kit > Open Settings でNotification Servicesがオンになっていることを確認。
VoxelBusters.EssentialKit.NotificationServices.RegisterForPushNotifications((result, error) => { if (error == null) { Debug.Log(result.DeviceToken); } else { Debug.Log(error.Description); } });
これでerrorがなければ取得でき、キャッシュに保存され、以降は
public void OnCopyDeviceToken(){ string token = VoxelBusters.EssentialKit.NotificationServices.CachedSettings.DeviceToken; GUIUtility.systemCopyBuffer = token; }
で、キャッシュから取得できます。(上記はボタンを押した時などにトークンをコピーする例)。注意点としては、NotificationServices というのがUnity標準のものとコンフリクトするので、using VoxelBusters.EssentialKit としていたとしても、改めて、VoxelBusters.EssentialKit.NotificationServices と書いておきます。
AndroidでPushTokenを取得しようとするとFIS_AUTH_ERROR
突如、上記のRegisterForPushNotifications
実行時にerrorを返すようになり、error.Description
に以下のような FIS_AUTH_ERROR
と返るようになり、
java.util.concurrent.ExecutionException: java.io.IOException: FIS_AUTH_ERROR
デバイスの設定やらFirebaseのjsonを入れ替えるなど色々やっても変化なく、ようやく原因がわかりました。Google Cloud Platformでそのプロジェクトを選択し、APIとサービス>認証情報のAPIキー欄で「Android key (auto created by Firebase)」をクリックし次の画面の「キーの制限」>「アプリケーション制限の設定」が「なし」がデフォルトだったと思われるのですが、色々やっていた中で「ウェブサイト」が選択され変更されてしまっていました。ここを「なし」に戻したところ、上記のエラーも出ずプッシュ用のトークンを取得できました。こんなところの設定が影響するとは。。
EssentialKitのプッシュ通知関係機能はまだまだ他にも便利なのですが、今回のMEMOではこのtokenを取得するだけで役割終わりとしときます。 かなり気に入っているアセットなので、EssentialKit タグで今後もMEMOして行こうと思います。
ビルドしてストア(TestFlightと内部テスト)へ
実機で動作させて、先ほどのボタンを押せばデバイストークンは取得できるはずですが、プッシュ通知を送るためには、証明書云々があるので、Appleの方はApple Developer Programの加入は結局必要かな。TestFlightで配信しないとダメなわけではないです。Googleの方も内部テストを介さなくてもデバイストークンさえわかれば通知できるかも(未確認)。こちらは費用はかからないけどFirebaseへの登録が必要ですかね。
とりあえず、実機のデバイストークンをコピーしてなんとかPHPの開発環境にその文字列を持っていっておきます。(PHP開発環境がMacであれば、iPhoneとMacがコピーしたクリップボードの内容を共有できるのがとても便利)
ちなみにiPhoneが
efd3f66634621c77945e3a9d4a4f15767a94b700b32796dff4a231xxx706xxxx
のような文字列(一部xxxで伏せてます)
Androidが
do-05vwoS1We0jSRORik1k:APA91bESUV76o5zv5NbIP2zLFLPN6XcUWluZMvcPPU6eblg6Uwl1lwm2mtAeRhWRhNFVFJvokdoskJlRwIK0oCdJNJGCYUy5alQNBQj28hclfrcPpxuxxxL0NP4tkgY_YM20xxxxe745
のような文字列でした。
さぁ、この後の証明書関係が一番ややこしいところかも。吐く準備を。
まず、iOSアプリの通知はAPNs(Apple Push Notification Serviceというアップルのサービス)、Androidアプリの通知は、Firebase Cloud Messagingを使います。FirebaseはiOSへの通知もやってくれるようですが、今回はPHPのアプリケーションから直接通知する仕組みを作りたいので、FirebaseはAndroidのためだけに使うことにしてます。
どちらも証明書を.pemや.jsonという形式のファイルにして、PHPの動くサーバーに持っていくことを目標にします。
「PHPからiOS/Androidアプリへプッシュ通知 2023(2)iOS編」へつづく
東京造形大学卒業後、マクロメディア(現アドビ)に入社。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」の中の人。