跳到主要内容

iOS

本文旨在介绍如何设置 Apple 身份验证,让您的游戏可以使用 Player Network 登录鉴权服务通过 Apple 渠道登录。

前提条件

1. 在 Apple Developer Center 上配置 iOS 应用
1. 创建 App ID

创建一个 client_id 作为向 Apple 发送请求的来源。
iOS 应用的 client_id 为 App ID(Bundle ID)。

  1. 登录 Apple 开发者平台

  2. 在侧边栏中,点击 Certificates, Identifiers & Profiles

  3. 在侧边栏中,点击 Identifiers,然后点击蓝色添加图标(+)。

    图片:Apple 标识符

  4. 选择 App IDs,然后点击 Continue

    图片:Apple App ID

  5. 输入 DescriptionBundle ID

    • Description:游戏应用的名称或描述。
    • Bundle ID:游戏应用的唯一标识符,包含在 App ID 中。

    图片:Apple bundle description

  6. Capabilities 下,选择 Sign in with Apple,然后点击 Continue

  7. 点击 Register 创建 App ID。

说明

对于现有的 App ID,找到该 App ID 后在 Capabilities 下选择 Sign in with Apple

2. 创建用于访问服务的密钥

创建用于计算 client_secret 的密钥和相应的 Key ID。

  1. Certificates, Identifiers & Profiles,点击侧边栏中的 Keys

  2. 点击蓝色添加图标(+)。

    图片:Apple 密钥

  3. Key Name 下,输入密钥的唯一名称。

  4. 选择 Sign in with Apple 旁边的复选框,然后点击 Configure

    图片:Apple Key Name

  5. Primary App ID 下,选择在 上一步 中创建的 App ID,然后点击 保存

    图片:Apple Save Primary Key

  6. 点击 Continue

  7. 点击 Register 生成密钥,并记下 Key ID

  8. 点击 Download 下载密钥文件(只能下载一次,切勿丢失),该文件保存为文件后缀 .p8 的文本文件。

3. 创建描述文件

创建并下载描述文件,然后,在开发或打包环境中安装下载的描述文件。

4. 获取 Team ID
  1. 登录 Apple 开发者平台

  2. 在侧边栏中,点击 Membership 来查看 Team ID

    图片:Apple Team ID

有关 Apple 开发者平台配置的更多信息,请参见 What the Heck is Sign In with Apple?

  1. 获取 Player Network 控制台登录账号
  2. 为游戏创建新项目,或加入已有项目
  3. 下载 SDK
  4. 接入 SDK
  5. 在 Player Network 控制台添加 Apple 为业务的登录鉴权方式

步骤1:为 Apple 登录配置 SDK

Version Requirement

iOS SDK 9 及更高版本

1. Swift SDK 的桥接

如果模块使用到的是 Swift 版本的 SDK,这里会涉及到 iOS 的 Swift 和 Objective-C 的混编问题。 Xcode 为了兼容混编需要有一个 bridge 的桥接层对齐两种语言的类名等,需要如下操作。

  1. 新建文件,选择 Swift File 类型。

    图片:Swift File 类型

  2. 按照需求命名并确保文件后缀是 .swift,然后点击 Create

    图片:创建 Swift 文件

  3. 点击 Create Bridging Header

注意

请确保选择 Create Bridging Header。否则,Xcode 将不会创建桥接层文件。

图片:创建桥接文档

  1. 确保 Xcode 工程中创建了两个文件(一份为第二步创建的 .swift 文件,另一份为自动创建的 project_name-Bridging-Header.h 文件)。
说明

文件内容无需更改。

图片:确定文档

不适用。

2. 在 Xcode 中添加功能

图片:Xcode Setting 1

3. 在 Xcode BuildPhases 中添加 AuthenticationServices.framework 并将 Status 设置为可选。

图片:Xcode Setting 2

Unity 的其他配置

  1. Check the configurations written in INTLCoreKit.projmods.

    {
    "group": "INTL",
    "libs": [],
    "frameworks": ["AuthenticationServices.framework:weak"],
    "files": [],
    "folders": [],
    "excludes": [],
    "headerpaths":[],
    "build_settings": {},
    "system_capabilities": {},
    "Info.plist":{}
    }
  2. 添加 entitlement 文件。
    要为 Unity 添加 entitlement 文件,请参见 Unity 论坛 上的解决方案。

    Sample: `INTLDevDemo.entitlements`

    ```xml
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
    <key>com.apple.developer.applesignin</key>
    <array>
    <string>Default</string>
    </array>
    </dict>
    </plist>
    ```

步骤2:添加 Apple 登录

警告
  1. Apple 登录是无法在重签包测试的,建议使用 TestFlight 或者 Dev 的打包。
  2. Apple 登录不提供 PictureUrl(用户头像 URL)。更多信息,请参见 Unity 引擎的 INTLAuthResult 或 Unreal Engine 的 FINTLAuthResult

Login 接口的登录权限参数传入 emailfullName

  • 在首次登录的界面中有编辑用户名和隐藏邮箱的选项(Fig 2)。在回调中可以获取 emailfullName
    • 玩家选择隐藏邮箱,获取的邮箱为随机邮箱地址
    • 玩家选择共享邮箱,获取到用户的真实邮箱地址
  • 后续登录不会获取到 emailfullName,登录界面(Fig 2),没有编辑用户名和隐藏邮箱选项。
  • 如果玩家停止 app 使用 Apple ID 后再次登录,会显示 Fig 1 所示选项。
说明

玩家可以选择 设置 > [您的用户名] > 密码和安全 > 使用 Apple ID > [应用名称] > 停止使用 Apple ID 来停止让 app 继续使用 Apple ID 登录。

Login 接口的登录权限参数传入空字符串时,登录界面没有编辑用户名和隐藏邮箱的选项(Fig 2)。在回调中 emailfullName 为空。

Fig 1:
图片:apple_login_permission

Fig 2:
图片:apple_login_permission2

  1. 注册登录相关回调。

    // Add callbacks
    public void AddAuthObserver()
    {
    INTLAPI.AddAuthResultObserver(OnAuthResultEvent);
    }

    // Remove callbacks
    public void RemoveAuthObserver()
    {
    INTLAPI.RemoveAuthResultObserver(OnAuthResultEvent);
    }

    // Process the INTLAuthResult callback
    public void OnAuthResultEvent(INTLAuthResult ret)
    {
    Debug.Log($"MethodID: {ret.MethodId}");

    string methodTag = "";
    if (authRet.MethodId == (int)INTLMethodID.INTL_AUTH_LOGIN)
    {
    methodTag = "Login";
    }
    else if (authRet.MethodId == (int)INTLMethodID.INTL_AUTH_BIND)
    {
    methodTag = "Bind";
    }
    else if (authRet.MethodId == (int)INTLMethodID.INTL_AUTH_AUTOLOGIN)
    {
    methodTag = "AutoLogin";
    }
    else if (authRet.MethodId == (int)INTLMethodID.INTL_AUTH_QUERY_USER_INFO)
    {
    methodTag = "QueryUserInfo";
    }
    else if (authRet.MethodId == (int)INTLMethodID.INTL_AUTH_GET_AUTH_RESULT)
    {
    methodTag = "GetAuthResult";
    }
    }
  2. 调用 AutoLogin 接口自动登录。

    INTLAPI.AutoLogin();
  3. 在自动登录失败时调用 Login 接口使玩家手动登录。

    INTLAPI.Login(INTLChannel.Apple); 
  4. 与游戏后台同步客户端身份验证状态,等待最终验证结果。

[可选] 设置 email 权限

注意

Apple 获取玩家邮箱需要玩家授权,如果玩家拒绝授权将无法获取到玩家邮箱,详见 Login 接口传入 emailfullName

要在 Apple 登录时获取玩家邮箱需先设置对应权限,开启后将在 AuthResultChannelInfo 中返回 email

  • 基于合规考虑,可针对特定来源对返回的 email 做 mask 处理,如有需求请联系 Player Network 助手 打开。
  • 可在后台流水日志中上报 hash 后的 base64(sha256(email)),如有需求请联系 Player Network 助手 打开。
  • 可用于验证玩家信息或绑定列表是否包含 email 信息,如有需求请联系 Player Network 助手 打开。
  • 可用于 iOS Firebase 的 Private Set Membership(PSM)功能,详见 Firebase iOS 工程配置
  1. 调用 Login 接口时,需要在 permissions 参数中添加 email 权限。

  2. Player Network 控制台 开启 email 返回功能,将 return_email 设置为 YES,详细步骤请参见 第三方渠道配置

步骤3:验收登录功能

在 Player Network SDK 日志中搜索关键字 "AuthResult" 确认渠道名称和 OpenID 是否正确返回。如果正确,则表明集成配置成功,登录功能已成功添加。

如果接入过程中遇到问题,请参见 常见问题