跳到主要内容

iOS

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

注意

由于 Discord SDK 已停止维护拉起 Discord App 的授权方式,后续可能会对 Discord App 授权造成影响。为确保 Discord 授权稳定可用,推荐使用 WebView 进行网页授权,详见配置 DISCORD_LOGIN_USING_WEB

警告

从 2024 年春季开始,对于需更新或上传至 Apple App Store Connect 的应用,开发者需明确 注明使用原因,以展示该应用如何使用 required reason API(需提交使用原因的 API)。更多信息,请参见 即将发布的第三方 SDK 要求

由于 Discord 的隐私清单尚未公布,目前 Player Network SDK 隐私清单中不包含对应的内容,详见 iOS 17 隐私清单

前提条件

1. 在 Discord 开发者平台 上配置应用
1. 创建 Discord 应用

创建 Discord 应用程序之前,请在 Discord 官方网站 上注册一个账号,并根据提示完成账号认证(通过电子邮件)。

  1. 进入 Discord 开发者平台
    首次登录时,用户可能需要验证自己不是机器人。您可以在电子邮件验证后完成。

  2. Applications 页面右上角,点击 New Application

    图片:创建应用

  3. 在弹出的应用程序创建窗口中,输入应用程序名称,然后点击 Create

  4. General Information 页面,查看 APPLICATION ID
    用户必须在 INTLConfig.ini 文件中配置 App ID。

    图片:获取 ID

2. 配置应用
  1. 进入 Discord Developer Platform

  2. Applications 页面,单击要配置的应用程序。

  3. 点击左侧导航栏中的 OAuth2,然后转到 OAuth2 > General

  4. Redirects 下配置下列重定向 URL,用于在 Discord 网页进行授权后接收回调,可点击 Add Another 增加单元格:

    图片:配置 Redirect

    注意

    在移动端如果想要使用 Discord app 而非 Discord 网页进行授权,还需要填写一个重定向 URL 用于 Discord app 授权后回调。 重定向 URL 规则:

    • 全部使用小写。
    • 方案应以 "intl" 开头。
    • URL 应包括主机和路径。

    例子: intlmoba://auth/callback

    注意

    对于 INTLConfig.ini 的 DISCORD_UNIVERSAL_LINK_IOS

    1. 配置 打开游戏的通用链接
    2. 将链接添加至 Redirect URL
    注意

    对于多商店渠道包:需要单独的 REDIRECT_URL_SCHEME

    支持多商店渠道包需要单独的 REDIRECT_URL_SCHEME。一个 App ID 支持 10 个重定向 URL(约 4 个多商店渠道包)。如果游戏需要多于 4 个多商店渠道包,请申请更多 App ID。要使用多个应用程序 ID,游戏需要INTLConfig.ini 中配置多个应用程序 ID在 Player Network 上注册多个 Discord 应用程序

  5. 点击左侧导航栏中的 Rich Presence,进入 Rich Presence Art Assets 页面。

  6. 点击 Add Image(s),配置应用程序的图片资源。

    图片:配置资源

    说明

    应用程序中使用的所有图片资源都必须在此页面进行配置,包括好友邀请函的封面照片。

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

步骤1:为 Discord 登录配置 SDK

Version Requirement

Discord SDK 仅与 iOS SDK 11 及更高版本兼容。

说明

Unreal Engine 应首先在 Plugins/INTLSDK/Source/INTLCore/INTLCore.Build.cs 文件中找到捆绑资源路径:

AdditionalBundleResources.Add(new BundleResource(Path.Combine(ModuleDirectory, "Libs/iOS/INTLCore/INTLSDK.bundle"), bShouldLog: false));

1. 加载所需的权限和插件

XUPorter 从 Unity 导出 Xcode 的时候,可以自动化配置 Xcode 工程,添加依赖库和源码文件,便于打包操作。

Player Network SDK 在原来的 XUPorter 基础上做了优化。如果业务也使用了 XUPorter 方案,Player Network SDK 的方案和业务的方案不会冲突。

  • 添加了 INTLSDKEditor 命名空间,避免其他组件也使用 XUPorter 时命名重复。
  • 更改了搜索 mods 文件的路径,让 Player Network SDK XUPorter 只搜索 Asset/INTLSDK/ 目录下的 mods 文件,不会重复添加其他组件的配置。
  • UnityAppController.mm 中增加生命周期。

Player Network SDK XUPorter 方案

INTL{Plugin}Kit.projmods 是 Player Network SDK 的 Info.plist 配置文件。Player Network SDK 通过读取 INTLSDK/Editor/XUPorter/Mods 目录中的 INTL{Plugin}Kit.projmods 文件,在 Xcode 中增加所导入的 bundle,framework 等依赖包。

每个插件都有一个对应的 INTL{Plugin}Kit.projmods 文件,游戏要根据所需的插件配置对应的文件,并以 INTLConfig.ini 配置文件中的值替换 {占位符} 文本。

例如,根据需求更新 INTLDiscordKit.projmods

INTLDiscordKit.projmods
"Info.plist":{
"LSApplicationQueriesSchemes":
[
"com.hammerandchisel.discord"
],
"NSAppTransportSecurity":
{
"NSAllowsArbitraryLoads":true
},
"CFBundleURLTypes" :
[
{
"CFBundleTypeRole":"Editor",
"CFBundleURLName":"Discord",
"CFBundleURLSchemes":["{INTL_DISCORD_REDIRECT_SCHEME}"]
}
]
}

iOS 使用说明

根据 iOS 权限要求,在申请敏感权限时,填写 使用说明,系统会弹出提示用户填写此信息。

  1. Assets/INTLSDK/Editor/XUPorter/Mods~/INTLCoreKit.projmods,下列权限已升级:

    "NSPhotoLibraryUsageDescription"
    "NSCameraUsageDescription"
    "NSLocationWhenInUseUsageDescription"
    "NSPhotoLibraryAddUsageDescription"
    "NSMicrophoneUsageDescription"

    在接入时,用户可以根据需要修改内容。

  2. Assets/INTLSDK/Editor/XUPorter/Mods~/INTLADTrackingKit.projmods,下列权限已升级:

    "NSUserTrackingUsageDescription"
    警告

    接入时,用户可以根据需要修改内容,并与法律团队确认内容是否合规。如果无修改, 将 INTLSample 替换为游戏名称。

2. 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 将不会创建桥接层文件。

    图片:创建桥接文档

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

    说明

    文件内容无需更改。

    图片:确定文档

不适用。

3. 完成 Player Network SDK 配置

  1. 打开项目的 INTLConfig.ini 文件:

    [Discord channel configuration]
    DISCORD_APP_ID = {INTL_DISCORD_APP_ID}
    DISCORD_REDIRECT_URL = {INTL_DISCORD_REDIRECT_URL}
    DISCORD_UNIVERSAL_LINK_IOS = {INTL_DISCORD_UNIVERSAL_LINK_IOS}
  • {INTL_DISCORD_APP_ID} 替换为游戏的 Discord App ID。
  • {INTL_DISCORD_REDIRECT_URL} 替换为平台上配置的 Redirect URL。
  • {INTL_DISCORD_UNIVERSAL_LINK_IOS} 替换为在开发者平台上配置的 重定向 通用链接。
  1. 将 Discord 添加到 Info.plist 文件中。

使用 Unity 导出 Xcode 项目时,请配置 .projmods 文件。

注意

Player Network SDK 已经将这些配置写入了 INTLCoreKit.projmods 文件,因此游戏团队只需检查配置即可。

{
"group": "INTL",
"Info.plist":{
"CFBundleURLTypes" :
[
{
"CFBundleTypeRole":"Editor",
"CFBundleURLName":"Discord",
"CFBundleURLSchemes":["{INTL_DISCORD_REDIRECT_SCHEME}"]
}
]
},
}

{INTL_DISCORD_REDIRECT_SCHEME} 替换为重定向 URL 中配置的方案。

注意

例如,如果在 Discord Developer Platform 上配置的 Redirect URL 是 intlsample://auth/callback

{INTL_DISCORD_REDIRECT_SCHEME} = intlsample

步骤2:添加 Discord 登录

Discord 登录前无需安装应用程序。如果已安装应用,会打开应用登录,否则会打开 Web 界面登录。

Discord 登录 permission 需要添加 identify。如果需要集成 Discord 共享功能,则也需添加 relationships.read,activities.write

  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.Discord, "identify", "");
    INTLAPI.Login(INTLChannel.Discord, "identify,relationships.read,activities.write", ""); //Friend functions
  4. 与游戏后台同步客户端身份验证状态,等待最终验证结果。

步骤3:验收登录功能

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

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