Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

使用 Unity 設置 Firebase Cloud Messaging 客戶端應用程序

要編寫跨平台使用Unity火力地堡雲消息客戶端應用中,從火力地堡雲端通訊API。 Unity SDK 適用於 Android 和 iOS,每個平台都需要一些額外的設置。

在你開始之前

先決條件

  • 安裝 Unity 2017.4 或更高版本。早期版本也可能兼容,但不會得到積極支持。

  • (僅適用於iOS)安裝的情況如下:

    • Xcode 9.4.1 或更高版本
    • CocoaPods 1.10.0 或更高版本
  • 確保您的 Unity 項目滿足以下要求:

    • 對於iOS -針對iOS的10或更高版本
    • 對於Android的-目標API級別16(果凍豆)或更高版本

  • 設置設備或使用模擬器來運行您的 Unity 項目。

    • 對於iOS -建立物理iOS設備來運行你的應用程序,並完成以下任務:

      • 獲得蘋果推送通知驗證密鑰為您的蘋果開發者賬號
      • 啟用應用下XCode中推送通知>能力
    • 對於Android的-仿真器必須使用與谷歌玩模擬器圖像。

如果您還沒有一個統一的項目,只是想嘗試一個火力地堡的產品,你可以下載我們的一個入門示例

第 1 步:創建 Firebase 項目

在將 Firebase 添加到 Unity 項目之前,您需要創建一個 Firebase 項目以連接到您的 Unity 項目。參觀了解火力地堡項目,詳細了解項目的火力地堡。

第 2 步:向 Firebase 註冊您的應用

您可以註冊一個或多個應用或遊戲以連接到您的 Firebase 項目。

  1. 轉至火力地堡控制台

  2. 在項目概述頁面的中心,點擊圖標團結 )啟動安裝工作流程。

    如果您已經添加的應用程序到你的火力地堡項目,單擊添加應用程序,以顯示平台的選擇。

  3. 選擇您要註冊的 Unity 項目的哪個構建目標,或者您甚至可以選擇現在同時註冊兩個目標。

  4. 輸入您的 Unity 項目特定於平台的 ID。

    • 對於iOS -在輸入您的統一項目的iOS ID的iOS捆綁ID字段。

    • 對於Android的-在輸入您的統一項目的Android ID Android包名稱字段。
      術語包名稱應用程序ID常常可互換地使用。

  5. (可選)輸入您的統一項目的特定於平台的綽號。
    這些暱稱是內部的便利標識符,只有您在 Firebase 控制台中才能看到。

  6. 點擊註冊應用

第 3 步:添加 Firebase 配置文件

  1. 在 Firebase 控制台設置工作流中獲取特定於平台的 Firebase 配置文件。

    • 對於iOS -點擊下載GoogleService-Info.plist中

    • 對於Android的-點擊下載Google-services.json。

  2. 打開團結項目的項目窗口,然後將你的配置文件(S)到Assets的文件夾。

  3. 早在火力地堡控制台,在設置工作流程,然後單擊下一步

第 4 步:添加 Firebase Unity SDK

  1. 在火力地堡控制台,點擊下載火力地堡統一SDK,然後解壓縮SDK方便的地方。

  2. 在打開的團結項目,導航到資產>導入包>自定義套餐

  3. 從解壓縮後的SDK,選擇支持的火力地堡產品要在您的應用程序使用。

    對於火力地堡雲端通訊獲得最佳體驗,我們建議讓谷歌Analytics(分析)在您的項目。此外,作為設置 Analytics 的一部分,您需要將用於 Analytics 的 Firebase 包添加到您的應用中。

    啟用分析

    • 添加火力地堡包谷歌分析: FirebaseAnalytics.unitypackage
    • 添加包火力地堡雲消息: FirebaseMessaging.unitypackage

    未啟用分析

    添加包火力地堡雲消息: FirebaseMessaging.unitypackage

  4. 導入統一包窗口,單擊導入

  5. 早在火力地堡控制台,在設置工作流程,然後單擊下一步

第 5 步:確認 Google Play 服務版本要求

在火力地堡統一SDK為Android要求谷歌播放服務,它必須跟上時代的可使用的SDK之前。

在應用程序的開頭添加以下代碼。在調用 SDK 中的任何其他方法之前,您可以檢查並選擇將 Google Play 服務更新為 Firebase Unity SDK 所需的版本。

Firebase.FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith(task => {
  var dependencyStatus = task.Result;
  if (dependencyStatus == Firebase.DependencyStatus.Available) {
    // Create and hold a reference to your FirebaseApp,
    // where app is a Firebase.FirebaseApp property of your application class.
       app = Firebase.FirebaseApp.DefaultInstance;

    // Set a flag here to indicate whether Firebase is ready to use by your app.
  } else {
    UnityEngine.Debug.LogError(System.String.Format(
      "Could not resolve all Firebase dependencies: {0}", dependencyStatus));
    // Firebase Unity SDK is not safe to use here.
  }
});

您的 Unity 項目已註冊並配置為使用 Firebase。

第 7 步:添加用戶通知框架

  1. 點擊Xcode中的項目,然後選擇編輯區域常規選項卡。

  2. 向下滾動到鏈接的框架和庫,然後單擊+按鈕來添加一個框架。

  3. 在窗口出現,滾動到UserNotifications.framework,單擊該條目,然後單擊添加

第 8 步:啟用推送通知

  1. 點擊Xcode中的項目,然後選擇編輯區域功能選項卡。

  2. 切換推送通知

  3. 向下滾動到背景模式,然後將其轉換為

  4. 選擇背景下的方式遠程通知複選框。

初始化 Firebase 雲消息傳遞

增加對兩種處理程序時,火力地堡雲信息庫將被初始化TokenReceivedMessageReceived事件。

初始化時,會為客戶端應用程序實例請求註冊令牌。該應用程序將接收令牌與OnTokenReceived事件,這應該緩存供以後使用。如果您想針對此特定設備發送消息,則需要此令牌。

此外,您將需要為註冊OnMessageReceived事件,如果你希望能夠接收傳入的消息。

整個設置如下所示:

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);
}

配置 Android 入口點 Activity

在Android上,火力地堡雲端通訊捆綁了一個自定義的入口點的活動,替換默認UnityPlayerActivity 。如果您不使用自定義入口點,則此替換會自動發生,您無需採取任何其他操作。不使用默認的入口點的活動或提供應用自己的Assets/Plugins/AndroidManifest.xml需要額外的配置。

Android 上的 Firebase Cloud Messaging Unity 插件捆綁了兩個附加文件:

  • Assets/Plugins/Android/libmessaging_unity_player_activity.jar包含稱為活動MessagingUnityPlayerActivity它取代了標準UnityPlayerActivity
  • Assets/Plugins/Android/AndroidManifest.xml指示該應用使用MessagingUnityPlayerActivity為切入點,以應用。

提供這些文件,因為在默認UnityPlayerActivity不處理onStoponRestart活動週期的轉變或實現onNewIntent這是必要的火力地堡雲消息傳遞正確處理傳入的消息。

配置自定義入口點活動

如果您的應用程序不使用默認的UnityPlayerActivity你將需要刪除所提供的AndroidManifest.xml ,並確保您的自定義活動妥善處理的所有過渡的Android活動的生命週期(如何做到這一點的示例如下所示)。如果您的自定義活動擴展UnityPlayerActivity可以代替延長com.google.firebase.MessagingUnityPlayerActivity它實現了所有必要的方法。

如果您使用的是自定義的活動,而不是延長com.google.firebase.MessagingUnityPlayerActivity ,你應該在你的活動如下片段。

/**
 * Workaround for when a message is sent containing both a Data and Notification payload.
 *
 * When the app is in the background, if a message with both a data and notification payload is
 * received the data payload is stored on the Intent passed to onNewIntent. By default, that
 * intent does not get set as the Intent that started the app, so when the app comes back online
 * it doesn't see a new FCM message to respond to. As a workaround, we override onNewIntent so
 * that it sends the intent to the MessageForwardingService which forwards the message to the
 * FirebaseMessagingService which in turn sends the message to the application.
 */
@Override
protected void onNewIntent(Intent intent) {
  Intent message = new Intent(this, MessageForwardingService.class);
  message.setAction(MessageForwardingService.ACTION_REMOTE_INTENT);
  message.putExtras(intent);
  message.setData(intent.getData());
  // For older versions of Firebase C++ SDK (< 7.1.0), use `startService`.
  // startService(message);
  MessageForwardingService.enqueueWork(this, message);
}

/**
 * Dispose of the mUnityPlayer when restarting the app.
 *
 * This ensures that when the app starts up again it does not start with stale data.
 */
@Override
protected void onCreate(Bundle savedInstanceState) {
  if (mUnityPlayer != null) {
    mUnityPlayer.quit();
    mUnityPlayer = null;
  }
  super.onCreate(savedInstanceState);
}

火力地堡C ++ SDK(7.1.0起)使用的新版本JobIntentService這需要額外的修改AndroidManifest.xml文件。

<service android:name="com.google.firebase.messaging.MessageForwardingService"
     android:permission="android.permission.BIND_JOB_SERVICE"
     android:exported="false" >
</service>

關於 Android 消息傳遞的注意事項

當應用程序根本沒有運行並且用戶點擊通知時,默認情況下,消息不會通過 FCM 的內置回調路由。在這種情況下,消息的有效載荷被通過接收Intent用於啟動該應用程序。

應用程序在後台時收到的消息將其通知字段的內容用於填充系統托盤通知,但該通知內容不會傳達給 FCM。也就是說, FirebaseMessage.Notification將是一個空。

總之:

應用狀態通知數據兩個都
前景Firebase.Messaging.FirebaseMessaging.MessageReceived Firebase.Messaging.FirebaseMessaging.MessageReceived Firebase.Messaging.FirebaseMessaging.MessageReceived
背景系統托盤Firebase.Messaging.FirebaseMessaging.MessageReceived通知:系統托盤
數據:在意圖的附加內容中。

防止自動初始化

FCM 生成用於設備定位的註冊令牌。生成令牌後,庫會將標識符和配置數據上傳到 Firebase。如果您想在使用令牌之前獲得明確的選擇加入,您可以通過禁用 FCM(在 Android 上,分析)來防止在配置時生成。要做到這一點,元數據值添加到您Info.plist (不是你的GoogleService-Info.plist )在iOS上,或者你AndroidManifest.xml Android上:

安卓

<?xml version="1.0" encoding="utf-8"?>
<application>
  <meta-data android:name="firebase_messaging_auto_init_enabled"
             android:value="false" />
  <meta-data android:name="firebase_analytics_collection_enabled"
             android:value="false" />
</application>

IOS

FirebaseMessagingAutoInitEnabled = NO

要重新啟用 FCM,您可以進行運行時調用:

Firebase.Messaging.FirebaseMessaging.TokenRegistrationOnInitEnabled = true;

設置後,此值在應用程序重新啟動後保持不變。

FCM 允許發送包含應用程序深層鏈接的消息。要接收包含深層鏈接的消息,您必須向處理應用深層鏈接的 Activity 添加新的 Intent 過濾器。意圖過濾器應捕獲域的深層鏈接。如果您的消息不包含深層鏈接,則不需要此配置。在 AndroidManifest.xml 中:

<intent-filter>
  <action android:name="android.intent.action.VIEW"/>
  <category android:name="android.intent.category.DEFAULT"/>
  <category android:name="android.intent.category.BROWSABLE"/>
  <data android:host="CHANGE_THIS_DOMAIN.example.com" android:scheme="http"/>
  <data android:host="CHANGE_THIS_DOMAIN.example.com" android:scheme="https"/>
</intent-filter>

還可以指定通配符以使意圖過濾器更加靈活。例如:

<intent-filter>
  <action android:name="android.intent.action.VIEW"/>
  <category android:name="android.intent.category.DEFAULT"/>
  <category android:name="android.intent.category.BROWSABLE"/>
  <data android:host="*.example.com" android:scheme="http"/>
  <data android:host="*.example.com" android:scheme="https"/>
</intent-filter>

當用戶點擊包含指向您指定的方案和主機的鏈接的通知時,您的應用程序將使用此 Intent 過濾器啟動 Activity 以處理該鏈接。

下一步

設置客戶端應用程序後,您就可以使用 Firebase 發送下游和主題消息。要了解更多信息,請參閱快速啟動示例這表明此功能。

要將其他更高級的行為添加到您的應用程序,請參閱從應用程序服務器發送消息的指南:

請記住,你需要一個服務器實現以利用這些功能。