苹果游戏中心

最低 SDK 版本:2.4.0

本文指导您使用苹果游戏中心玩家标识符在游戏中为玩家设置身份验证时的以下场景

  • 设置苹果游戏中心登录
  • 登录返回用户或创建新用户。
  • 通过苹果游戏中心帐户将用户从匿名登录更新到平台登录。

要为游戏中的玩家提供苹果游戏中心登录选项,请设置您的应用程序以启用使用苹果游戏中心登录。

您可以在 Unity 编辑器中直接添加苹果游戏中心,也可以在 Unity 云控制面板 中添加。

设置苹果游戏中心登录

  1. 设置并安装苹果游戏套件 Unity 插件,该插件位于 苹果 Unity 插件 存储库中。 GameKit 框架用于实现苹果游戏中心功能,包括玩家身份。

  2. 将苹果游戏中心添加为 Unity 的 ID 提供程序

    1. 在 Unity 编辑器菜单中,转到 **编辑** > **项目设置…**,然后从导航菜单中选择 **服务** > **身份验证**。
    2. 将 **ID 提供程序** 设置为 **苹果游戏中心**,然后选择 **添加**。
    3. 在 **Bundle ID** 文本字段中输入 Apple 开发者控制台中的 **Bundle ID**,然后选择 **保存**。Bundle ID 应类似于: "com.something.somethingelse"。

注意:引用的软件包并非由 Unity 开发、拥有或运营。请参阅我们的 最佳实践,了解如何使用非 Unity 软件包。

重要:出于安全原因,Unity 身份验证的 timestamp 输入仅在 10 分钟内有效。在调用 SignInWithAppleGameCenterAsync 或 LinkWithAppleGameCenterAsync 之前,请调用 Apple 的 FetchItems API 以接收新的输入。成功调用 SignInWithAppleGameCenterAsync 或 LinkWithAppleGameCenterAsync 一次后,无需再调用这些 API。

安装所需的插件并设置 ID 提供程序后,您可以使用以下示例代码检索身份验证参数

using System;
using System.Threading.Tasks;
using UnityEngine;
using Apple.GameKit;

public class AppleGameCenterExampleScript : MonoBehaviour
{
    string Signature;
    string TeamPlayerID;
    string Salt;
    string PublicKeyUrl;
    string Timestamp;

    // Start is called before the first frame update
    async void Start()
    {
        await Login();
    }

    public async Task Login()
    {
        if (!GKLocalPlayer.Local.IsAuthenticated)
        {
            // Perform the authentication.
            var player = await GKLocalPlayer.Authenticate();
            Debug.Log($"GameKit Authentication: player {player}");

            // Grab the display name.
            var localPlayer = GKLocalPlayer.Local;
            Debug.Log($"Local Player: {localPlayer.DisplayName}");

            // Fetch the items.
            var fetchItemsResponse =  await GKLocalPlayer.Local.FetchItems();

            Signature = Convert.ToBase64String(fetchItemsResponse.GetSignature());
            TeamPlayerID = localPlayer.TeamPlayerId;
            Debug.Log($"Team Player ID: {TeamPlayerID}");

            Salt = Convert.ToBase64String(fetchItemsResponse.GetSalt());
            PublicKeyUrl = fetchItemsResponse.PublicKeyUrl;
            Timestamp = fetchItemsResponse.Timestamp.ToString();

            Debug.Log($"GameKit Authentication: signature => {Signature}");
            Debug.Log($"GameKit Authentication: publickeyurl => {PublicKeyUrl}");
            Debug.Log($"GameKit Authentication: salt => {Salt}");
            Debug.Log($"GameKit Authentication: Timestamp => {Timestamp}");
        }
        else
        {
            Debug.Log("AppleGameCenter player already logged in.");
        }
    }
}

登录返回玩家或创建新玩家

您可以使用 SignInWithAppleGameCenterAsync 方法来:

  • 使用苹果游戏中心凭据创建新的 Unity 身份验证玩家。
  • 使用苹果游戏中心凭据登录现有玩家。

如果项目中没有与凭据关联的 Unity 身份验证玩家,则 SignInWithAppleGameCenterAsync 将创建一个新的玩家。如果项目中与凭据关联的 Unity 身份验证玩家,则 SignInWithAppleCenterAsync 将登录该玩家的帐户。此函数不考虑缓存的玩家,并且 SignInWithAppleGameCenterAsync 将替换缓存的玩家。

async Task SignInWithAppleGameCenterAsync(string signature, string teamPlayerId, string   publicKeyURL, string salt, ulong timestamp)
{
    try
    {
        await AuthenticationService.Instance.SignInWithAppleGameCenterAsync(signature, teamPlayerId, publicKeyURL, salt, timestamp);
        Debug.Log("SignIn is successful.");
    }
    catch (AuthenticationException ex)
    {
        // Compare error code to AuthenticationErrorCodes
        // Notify the player with the proper error message
        Debug.LogException(ex);
    }
    catch (RequestFailedException ex)
    {
        // Compare error code to CommonErrorCodes
        // Notify the player with the proper error message
        Debug.LogException(ex);
    }
}

有关缓存玩家的更多信息,请参阅 登录缓存用户

将玩家从匿名更新到苹果游戏中心帐户

设置匿名身份验证后,如果玩家想从匿名升级到创建苹果游戏中心帐户并使用苹果游戏中心登录,您的游戏应提示玩家触发苹果游戏中心登录并从 GameKit 获取 ID 验证参数。然后,调用 LinkWithAppleGameCenterAsync API 将玩家链接到苹果游戏中心的 teamPlayerID。

如果 SDK 上存在缓存的玩家,您可以将缓存的玩家链接到苹果游戏中心帐户。

  1. 使用 SignInAnonymouslyAsync 登录缓存的玩家的帐户。
  2. 使用 LinkWithAppleGameCenterAsync 将缓存的玩家的帐户链接到苹果帐户。

有关缓存玩家的更多信息,请参阅 登录缓存用户

async Task LinkWithAppleGameCenterAsync(string signature, string teamPlayerId, string   publicKeyURL, string salt, ulong timestamp)
{
    try
    {
        await AuthenticationService.Instance.LinkWithAppleGameCenterAsync(signature, teamPlayerId, publicKeyURL, salt, timestamp);
        Debug.Log("Link is successful.");
    }
    catch (AuthenticationException ex) when (ex.ErrorCode == AuthenticationErrorCodes.AccountAlreadyLinked)
    {
        // Prompt the player with an error message.
        Debug.LogError("This user is already linked with another account. Log in instead.");
    }
    catch (AuthenticationException ex)
    {
        // Compare error code to AuthenticationErrorCodes
        // Notify the player with the proper error message
        Debug.LogException(ex);
    }
    catch (RequestFailedException ex)
    {
        // Compare error code to CommonErrorCodes
        // Notify the player with the proper error message
        Debug.LogException(ex);
    }
}

使用 UnlinkAppleGameCenterAsync API,以便您的玩家可以取消链接其苹果游戏中心帐户。取消链接后,如果其帐户未链接到任何其他身份,则会转换为匿名帐户。

async Task UnlinkAppleGameCenterAsync(string idToken)
{
   try
   {
       await AuthenticationService.Instance.UnlinkAppleGameCenterAsync(idToken);
       Debug.Log("Unlink is successful.");
   }
   catch (AuthenticationException ex)
   {
       // Compare error code to AuthenticationErrorCodes
       // Notify the player with the proper error message
       Debug.LogException(ex);
   }
   catch (RequestFailedException ex)
   {
       // Compare error code to CommonErrorCodes
       // Notify the player with the proper error message
       Debug.LogException(ex);
   }
}