针对 Android 的推送通知

先决条件

配置 Android 通知通道

Firebase 设置

您必须使用并同步的 Google 网站有三个。 在 Google/Firebase 中同时具有项目和应用:

PlayFab 需要服务器私钥文件

  • 可以从 Firebase 控制台 获取此私钥文件
  • Firebase 控制台
    • 选择您的项目应用,然后查找 Settings 选项(有很多方式可执行此操作,所有这些方式都会将您引向同一位置)。
    • 在“服务帐户”选项卡中,选择“生成新的私钥”按钮以下载 JSON 文件。

使用私钥文件

  • 通过以下两种方式之一提供私钥文件:

    1. 将私钥文件直接上传到 Game Manager UI设置(针对你的游戏)>发布通知>Android
    2. 或者使用 Postman 或启用了 Server API 方法的 Unity 项目调用 SetupPushNotification
    • 名称:your_game_name

    • 平台:GCM

    • 凭据:(作为字符串的私钥文件内容):{ ... }

    • 覆盖 OldARN:true

    • 您会收到 HTTP 200 OK 响应,并且具有与以下类似的数据。

      // Postman JSON result output
      {
          "code": 200,
          "status": "OK",
          "data": { "ARN" : "arn:*******/GCM/your_game_name" }
      }
      
  • (使用任一方法)正确设置后,可以在以下位置查看:Game Manager UI设置(针对你的游戏)> 发布通知 > Android

    PlayFab Settings - Push Notifications - Android

入门:针对 Android + Unity 的推送通知

要设置您的 Unity 项目,请执行下列操作:

  • 创建新的 Unity 项目。

  • [可选] 导入 PlayFab Unity 编辑器扩展程序包。

  • 导入 Unity PlayFab SDK 程序包。

  • 按照 FCM Unity 指南安装 FCM 消息传送,并为推送通知设置项目。

    • 完成后,您可以继续按照该指南接收来自 PlayFab 的消息。
    • 我们将在以下示例中提供完整的 FCM 就绪型 monoBehaviour 脚本,该脚本结合了 FCM 和 PlayFab。
  • 在 FCM 指南中,您创建了一个设置 Firebase 插件的 monobehaviour 脚本。

    • 您可以继续使用该 monobehaviour 脚本,或者将其替换为随后示例中的脚本。

设置第一个推送通知

在 Unity 中,打开您在 FCM 教程中创建的脚本,然后替换内容。

using PlayFab;
using PlayFab.ClientModels;
using PlayFab.Json;
using UnityEngine;

public class MsgCatcher : MonoBehaviour
{
    public string pushToken;
    public string playFabId;
    public string lastMsg;

    // OnGUI should be deleted/replaced with your own gui - This is only provided for debugging
    public void OnGUI()
    {
        GUI.Label(new Rect(0, 0, Screen.width, 200), pushToken);
        GUI.Label(new Rect(0, 200, Screen.width, Screen.height - 200), lastMsg);
    }

    private void OnPfFail(PlayFabError error)
    {
        Debug.Log("PlayFab: api error: " + error.GenerateErrorReport());
    }

    public void Start()
    {
        // PlayFabSettings.TitleId = "TITLE_ID";
        Firebase.Messaging.FirebaseMessaging.TokenReceived += OnTokenReceived;
        Firebase.Messaging.FirebaseMessaging.MessageReceived += OnMessageReceived;
        LoginToPlayFab();
    }

    private void LoginToPlayFab()
    {
#if UNITY_ANDROID
        var request = new LoginWithAndroidDeviceIDRequest { AndroidDeviceId = SystemInfo.deviceUniqueIdentifier, CreateAccount = true, };
        PlayFabClientAPI.LoginWithAndroidDeviceID(request, OnPfLogin, OnPfFail);
#endif
    }

    private void OnPfLogin(LoginResult result)
    {
        Debug.Log("PlayFab: login successful");
        playFabId = result.PlayFabId;
        RegisterForPush();
    }

    private void RegisterForPush()
    {
        if (string.IsNullOrEmpty(pushToken) || string.IsNullOrEmpty(playFabId))
            return;

#if UNITY_ANDROID
        var request = new AndroidDevicePushNotificationRegistrationRequest {
            DeviceToken = pushToken,
            SendPushNotificationConfirmation = true,
            ConfirmationMessage = "Push notifications registered successfully"
        };
        PlayFabClientAPI.AndroidDevicePushNotificationRegistration(request, OnPfAndroidReg, OnPfFail);
#endif
    }

    private void OnPfAndroidReg(AndroidDevicePushNotificationRegistrationResult result)
    {
        Debug.Log("PlayFab: Push Registration Successful");
    }

    private void OnTokenReceived(object sender, Firebase.Messaging.TokenReceivedEventArgs token)
    {
        Debug.Log("PlayFab: Received Registration Token: " + token.Token);
        pushToken = token.Token;
        RegisterForPush();
    }

    private void OnMessageReceived(object sender, Firebase.Messaging.MessageReceivedEventArgs e)
    {
        Debug.Log("PlayFab: Received a new message from: " + e.Message.From);
        lastMsg = "";
        if (e.Message.Data != null)
        {
            lastMsg += "DATA: " + JsonWrapper.SerializeObject(e.Message.Data) + "\n";
            Debug.Log("PlayFab: Received a message with data:");
            foreach (var pair in e.Message.Data)
                Debug.Log("PlayFab data element: " + pair.Key + "," + pair.Value);
        }
        if (e.Message.Notification != null)
        {
            Debug.Log("PlayFab: Received a notification:");
            lastMsg += "TITLE: " + e.Message.Notification.Title + "\n";
            lastMsg += "BODY: " + e.Message.Notification.Body + "\n";
        }
    }
}

在设备上生成并运行您的 Unity 项目。 如果收到带有文本 Push notifications registered successfully 的推送通知,则一切都在正常运行。

注意

PlayFabSettings.TitleId = TITLE_ID. 您必须设置自己的 TitleId。 如果未更新此 TitleId,此示例将不起作用,因为我们的游戏是使用我们的 Firebase 密钥和设置注册的,而不是您的。 您可以通过取消注释此行并将 TITLE_ID 替换为您的 titleId 来执行此操作,或者您可以从上一节中提到的可选编辑器扩展插件中选择您的游戏。

对 Android 进行故障诊断

  • 确认您可以从 Firebase 控制台发送测试推送通知。

    • 如果不能,则表明 Firebase 插件未正确设置,请查看 Firebase 文档找到原因,或者联系 Firebase 支持人员。
  • 确保正确设置了 FCM 客户端 pushToken。

    • 应调用该示例中的 OnTokenReceived 函数,并且该函数应具有有效令牌。
    • 如果 调用此函数,则表明 Firebase 插件 正确设置,请查看 Firebase 文档找到原因,或者联系 Firebase 支持人员。
  • 确保将您的 titleId 设置为您拥有的游戏,并且已使用您 Firebase 项目中的服务器 API 密钥对其进行了注册。

高级功能

server.SendPushNotification 中,可使用 request.Package.CustomData 将任意数据传输到设备。 在先前示例中,其被传输到该部分,并具有以下注释。

 Debug.Log("PlayFab: Received a message with data:");

您可以自定义客户端接收器,以便随意使用这些数据。 CustomData 不向玩家显示,因此可用于将自定义游戏信息传输到客户端,或者使用 FCM 插件本地计划其他未来通知。

此外还可使用 request.Package.CustomData 或请求 AdvancedPlatformDelivery,以便传输到许多第三方插件。

注意

第三方插件传输不受支持或没有保障,但可用于高级用户。

附加支持

如果需要帮助、要了解示例错误和相关问题,请在我们的论坛中提出。

当前,我们仅支持针对本文档中所述的标准流程的服务。 如果您的团队需要其他常见推送服务或插件的更多功能,请告诉我们! 我们欢迎开发者社区的反馈。

有关通过 Amazon SNS 的推送有效负载的文档: