推送通知快速入门

可以通过链接以下三个主要系统来启用 PlayFab 推送通知:

  1. 玩家设备操作系统(Android、iOS 等)
  2. 供应商特定通道(Google、Apple 等)
  3. 跨平台消息路由(通过 Amazon Simple Notification Service [SNS] 的 PlayFab)。

注意

如果取消链接上述系统中的任何一个,客户端将停止收到通知。 这三个系统都很容易发生意外更改,导致链接失效。 此外,在流程中的任何一个点,很难知道是否所有系统都配置正确。

PlayFab 推送路由系统

每个 PlayFab 游戏都可以在给定时间启用 Google (GCM) 和 Apple Push(APNS、APNS_SANDBOX)通知通道。 可以通过以下两种方式之一配置上述通道:

  1. 使用 Game Manager 中的 UI (位于“设置”-“>推送通知”下)。
  2. 使用 PlayFab 管理 API - SetupPushNotification

有关更详细的设置信息,请阅读以下教程:

游戏内推送消息

推送消息将根据开发引擎/平台而有所不同。 但是,接收推送通知的最简单方法是将 Unity 项目与我们的 SDK 和适用于 Android 的 Firebase Cloud Messaging (FCM) 插件一起使用,或使用 Unity for iOS。

  • 在 Android 上接收推送 - 需要使用插件。 支持的最佳插件是本机 FCM 插件。
  • 在 iOS 上接收推送 - 基本推送消息无需使用 插件。

提示

有关如何设置 FCM Unity 插件或在 Android Studio 上推送的说明,请参阅 FCM 文档。

测试设置

配置游戏和客户端后,可以使用 PlayFab 服务器 API 测试配置 - SendPushNotification。 此 API 允许您发送任意数量的推送通知,并且没有额外费用。

您可以将 PlayFab CloudScript 服务用作快速安全的服务器 API 环境。 从那里,可以根据需要发送推送通知。

要使用此方法测试配置,请将以下示例中的代码上传或附加到游戏的 CloudScript 中。

示例

请考虑以下方案:

  • 游戏中的玩家可以访问基于排名统计数据的排行榜。

  • 每位玩家可以支付 1 CH 货币来挑战与当前玩家相差最多 5 个排名的其他玩家。

首先,考虑虚拟货币,如下面的示例屏幕截图所示(有关如何定义虚拟货币的信息,请参阅货币教程)。

PlayFab Economy - Currencies - New Currency

接下来,考虑为每位玩家定义的以下统计数据(有关如何生成测试排行榜的信息,请参阅访问已存档的锦标赛结果教程)。

PlayFab 玩家统计数据 - 排名

设置完上述先决条件后,可以设置推送通知质询系统。

以下客户端代码将调用 CloudScript ChallengePlayer

public void ChallengeRandomClosePlayer(string currentPlayerId) {
    PlayFabClientAPI.GetLeaderboardAroundPlayer(new GetLeaderboardAroundPlayerRequest() {
        MaxResultsCount = 10,
        StatisticName = "Rank",
        PlayFabId = currentPlayerId,
    }, result => OnLeaderboardLoaded(result,currentPlayerId),OnPlayFabError);
}

private void OnLeaderboardLoaded(GetLeaderboardAroundPlayerResult leaderboard, string currentPlayerId) {
    var index = (int)(UnityEngine.Random.value * (leaderboard.Leaderboard.Count-1));
    if (leaderboard.Leaderboard[index].PlayFabId == currentPlayerId)
        index = (index + 1) % leaderboard.Leaderboard.Count;
    var targetId = leaderboard.Leaderboard[index].PlayFabId;

    PlayFabClientAPI.ExecuteCloudScript(new ExecuteCloudScriptRequest() {
        FunctionName = "ChallengePlayer",
        FunctionParameter = new Dictionary<string, object>() {
            { "TargetId", targetId }
        }
    }, null, OnPlayFabError);
}

public void OnPlayFabError(PlayFabError obj) {
    Debug.Log(obj.GenerateErrorReport());
}

ChallengePlayer CloudScript 代码将处理请求、验证排行榜状态并将质询推送通知发送给目标。

handlers.ChallengePlayer = function (args) {
    var targetId = args.TargetId;
    var leaderboard = server.GetLeaderboardAroundUser({
        MaxResultsCount : 10,
        PlayFabId : currentPlayerId,
        StatisticName : "Rank"
    });

    for(var i = 0; i < leaderboard.Leaderboard.length; i++) {
        var target = leaderboard.Leaderboard[i];
        if(target.PlayFabId !== targetId) continue;

        // subtract virtual currency from current player
        server.SubtractUserVirtualCurrency({
            VirtualCurrency : "CH",
            PlayFabId : currentPlayerId,
            Amount : 1
        });

        // get current player profile
        var profile = server.GetPlayerProfile({
            PlayFabId : currentPlayerId
        }).PlayerProfile;

        // try to send push notification
        try {
            server.SendPushNotification({
                Recipient : targetId,
                Package : {
                    Message : `${profile.DisplayName} challenges you for a battle!`,
                    Title: "You have been challenged",
                }
            });
        } catch (ex) {
            // Target player has not registered for Push Notifications
        }
        return;
    }
}

推送通知用法

能够使用推送通知是一种很棒的功能。 但是,如果滥用 通知,可能会导致用户选择不再接收新通知 - 甚至彻底离开游戏

反过来,如果谨慎使用,推送通知可以成为构建和维护游戏社区的最佳工具之一。

推送通知是一种发后不理(即不保证送达)的消息协议。

注意

请注意,不保证 玩家将接收、打开或与您的消息互动。 考虑到这一点,将消息用作附加 功能而不是作为游戏循环的关键部分是一种很好的做法。

对于 iOS 平台,操作系统向应用提供一次性对话框提示,允许用户确定推送通知的状态。 用户进行初始选择后,设置将持续生效,直到:

  • 更新或重新安装此应用。

  • 用户通过手机的设置菜单更改此设置。

对于 Android 应用,默认启用通知,并且可以从客户端随意打开和关闭通知。

提示

在每个会话中重新初始化通知侦听器是一种很好的做法。

资源

以下资源提供有关此快速入门中的主题的其他信息: