Unity

【Unity】Firebaseのサーバープッシュ導入手順を解説

この記事ではUnity環境にFirebaseを使ったサーバープッシュを導入する手順を解説します。

Unityアプリ用にFirebaseのプロジェクトは作成済とします。

【Unity】Onesignalのサーバープッシュ導入手順を解説この記事ではUnity環境にOneSignalを使ったサーバープッシュを導入する手順を解説します。 Onesignalの会...

下準備

iOSの場合:APNs認証キーの発行と登録

iOS環境でサーバープッシュをする場合、APNsを利用します。
APNs(Apple Push Notification Service)とは、Apple環境でサーバープッシュを送るサービスの事です。

APNsをFirebaseから利用できるようにするため、認証キーを発行してFirebaseに登録します。

APNs認証キーの発行

APNs認証キーは新旧2種類あります。
初代のApple Push Notification Service SSLはアプリごとに認証キーが違い、また、発行から1年の有効期限があり、毎年更新する必要があります。

新しく出来た、Apple Push Notification Authentication Keyは全アプリ共有の認証キーとなっており、有効期限もありません。

と言うわけで迷わず新しい「Apple Push Notification Authentication Key」を発行します。

 

  1. Appleの開発サイト(https://developer.apple.com/account)にログインし、「証明書、ID、プロファイル」欄の「証明書」をクリック。
  2. 左メニューからKeysを選び、右側のKeysという見出しの右側にある + ボタンを押す。
  3. 適当にkey Nameを入れて、Apple Push Notifications Serviceにチェックを入れたら、Configureボタンを押す。
  4. EnvironmentをSandbox & Productionにして、Saveボタンを押す。
  5. 前の画面に戻ってきたら、Continueボタンを押す。
  6. Registerを押して登録。
  7. Downloadを押して認証キーをダウンロードして完了です。このDownloadボタンは1回しか押せないので、安全な場所にダウンロードした認証キーを保存しておいてください。
    認証キーをFirebaseに登録する時にKey IDも必要になるので、この画面にあるKey IDをメモっておく事。

APNs認証キーの登録

  1. 次に、Firebaseのプロジェクトを開き、プロジェクトの設定をクリック。
  2. 上のタブでCloud Messagingを選び、APNs認証キー欄のアップロードを押す。
  3. ダウンロードした認証キーをAPNs認証キー欄にドラッグ&ドロップし、キーIDには、認証キーダウンロード画面にあったKey IDを、チームIDには、Appleの開発サイト(https://developer.apple.com/account)のメンバーシップ詳細欄にあるチームIDを入れアップロードボタンを押す。

 

iOS環境のプッシュ通知を有効化

(以下の説明はPost Process Buildスクリプトで自動化するので、自動化する内容を理解するつもりで読んでください)

iOS環境でサーバープッシュを利用する場合、Frameworkの導入とCapabilitesの設定が必要になります。
Unityから書き出したiOSプロジェクトをXCodeで開きます。

そして、左側メニューでUnity-iPhoneを選び、右側のウインドウでGeneralタブを選択。
Frameworks, Libraries, and Embedded Content欄で、UserNotification.frameworkを追加

次に、右側ウインドウのSigning & Capabilitesタブを選択。
+ Capabilityボタンを押して、Push NotificationsをONに。
同様に、Background ModesもONに。
そして、追加されたBackground Modes欄のRemote notificationsにチェックを入れます。

 

ただ、以上の設定はUnityでiOSビルドをするたびに消えてしまい毎回追加しなおす必要が出てくるため、次のPost Process Buildスクリプトを作成し、Editorフォルダに配置してください。

配置後、iOSビルドを実行すれば上記設定の全てが自動的にXCodeに追加されます。

using UnityEngine;
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEditor.iOS.Xcode;
using System.IO;

public class PostProcessBuildScript {
    [PostProcessBuild]
    public static void OnPostprocessBuild(BuildTarget target, string path) {
        if (target == BuildTarget.iOS) {
            // Xcodeプロジェクトファイルのパス取得
            string projPath = PBXProject.GetPBXProjectPath(path);
            PBXProject proj = new PBXProject();
            proj.ReadFromFile(projPath);

            // ターゲットGUIDを、Unity2019以降の推奨メソッドで取得
            string targetGuid = proj.GetUnityMainTargetGuid();

            // UserNotifications.frameworkの追加
            proj.AddFrameworkToProject(targetGuid, "UserNotifications.framework", false);

            // Entitlementsファイルの作成
            string entitlementsFileName = "Unity-iPhone.entitlements";
            string entitlementsFilePath = Path.Combine(path, entitlementsFileName);
            PlistDocument entitlementsPlist = new PlistDocument();
            entitlementsPlist.root.SetString("aps-environment", "development"); // 本番の場合は "production"
            entitlementsPlist.WriteToFile(entitlementsFilePath);

            // EntitlementsファイルのパスをXcodeプロジェクトに設定
            proj.SetBuildProperty(targetGuid, "CODE_SIGN_ENTITLEMENTS", entitlementsFileName);

            // Info.plistの更新
            string plistPath = Path.Combine(path, "Info.plist");
            PlistDocument plist = new PlistDocument();
            plist.ReadFromFile(plistPath);

            // UIBackgroundModesにremote-notificationを追加
            PlistElementArray bgModes;
            if (plist.root.values.ContainsKey("UIBackgroundModes"))
                bgModes = plist.root["UIBackgroundModes"].AsArray();
            else
                bgModes = plist.root.CreateArray("UIBackgroundModes");

            bool alreadyAdded = false;
            foreach (var mode in bgModes.values) {
                if (mode.AsString() == "remote-notification") {
                    alreadyAdded = true;
                    break;
                }
            }
            if (!alreadyAdded) {
                bgModes.AddString("remote-notification");
            }

            // Info.plistにaps-environmentを設定
            plist.root.SetString("aps-environment", "development"); // 本番の場合は "production"
            plist.WriteToFile(plistPath);

            // 修正内容をXcodeプロジェクトファイルに書き戻す
            proj.WriteToFile(projPath);
        }
    }
}

 

以上でiOS用の下準備は完了です。

Androidの場合

GoogleのFirebaseを使う場合、iOSのような通知の証明書登録は必要ないですが、Android13以降からはiOSのようにプッシュ通知の受信をユーザーに許可してもらわないとプッシュ通知が受け取れなくなりました。

その受信許可ダイアログを表示するため、UnityのPackage Managerから「Mobile Notifications」パッケージをインストールしておきます。

受信許可ダイアログを表示するコードの書き方については以降の「スクリプトの実装」節で解説します。

 

スクリプトの実装

サーバープッシュを有効にするためのコードを実装していきます。

unitypackageのインストール

まずは次のリンク先からFirebaseの最新unitypackageをダウンロードします。

https://firebase.google.com/download/unity

解凍フィルダ内にはFirebaseの色々なunitypackageが詰め込まれているので、その中から
「FirebaseMessaging.unitypackage」
をインストールします。

登録トークンの受信処理と、プッシュ通知の受信処理を実装

登録トークン(プッシュ通知の送り先となるID)の登録&受信処理と、プッシュ通知の受信処理を実装します。

public void Start() {
  // 登録トークンの登録 & 受信処理
  Firebase.Messaging.FirebaseMessaging.TokenReceived += OnTokenReceived;
 // プッシュ通知の受信処理
  Firebase.Messaging.FirebaseMessaging.MessageReceived += OnMessageReceived;
}

public void OnTokenReceived(object sender, Firebase.Messaging.TokenReceivedEventArgs token) {
  UnityEngine.Debug.Log("Received Registration Token: " + token.Token);
}

public void OnMessageReceived(object sender, Firebase.Messaging.MessageReceivedEventArgs e) {
  UnityEngine.Debug.Log("Received a new message from: " + e.Message.From);
}

 

iOSだと「登録トークンの登録&受信処理」を書くだけで、次の写真のように受信許可を求めるダイアログが表示されるようになるので、これでiOSのための実装は完了です。

 

Android用、プッシュ通知の受信許可ダイアログの表示

前の節でも説明した通り、Android13以降からはiOSのようにプッシュ通知の受信をユーザーに許可してもらわないといけないので、次のコードを追加します。

#if UNITY_ANDROID
using UnityEngine.Android;
#endif

....


private async void Start()
    {

.....

#if UNITY_ANDROID
        // サーバープッシュの受信権限がない場合、リクエストする
        if (!Permission.HasUserAuthorizedPermission("android.permission.POST_NOTIFICATIONS"))
        {
            Permission.RequestUserPermission("android.permission.POST_NOTIFICATIONS");
        }
#endif

 

このコードが実行されると写真のように、プッシュ通知を受信する権限がoffの場合、プッシュ通知の許可を求めるダイアログが表示されるようになります。

プッシュ送信はFirebaseのMessaging欄から行えますが、マルチ言語には対応していないため、ユーザーに合わせてメッセージの言語を切り替えたい場合は別途、プッシュ用のサーバーを準備する必要があります。

Unity を使用して Firebase Cloud Messaging クライアント アプリを設定する
https://firebase.google.com/docs/cloud-messaging/unity/client?hl=ja