PHPからiOSとAndroidアプリへプッシュ通知 2023(1)Unity編

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

UnityのiOS、Androidアプリへデバイス特定でプッシュ通知するまでのMEMOです。(プッシュ通知は生モノなので2023年11月現在としておきます)

長くなりそうなので、以下のように分けてMEMOしときます。

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編」へつづく