Android
本文旨在介绍如何设置 Discord 身份验证,让您的游戏可以使用 Player Network 登录鉴权服务通过 Discord 渠道登录。
由于 Discord SDK 已停止维护拉起 Discord App 的授权方式,后续可能会对 Discord App 授权造成影响。为确保 Discord 授权稳定可用,推荐使用 WebView 进行网页授权,详见配置 DISCORD_LOGIN_USING_WEB。
前提条件
1. 在 Discord 开发者平台 上配置应用
1. 创建 Discord 应用
创建 Discord 应用程序之前,请在 Discord 官方网站 上注册一个账号,并根据提示完成账号认证(通过电子邮件)。
进入 Discord 开发者平台。
首次登录时,用户可能需要验证自己不是机器人,可在电子邮件验证后完成。在 Applications 页面右上角,点击 New Application。
在弹出的应用程序创建窗口中,输入应用程序名称,然后点击 Create。
在 General Information 页面,查看 APPLICATION ID。
用户必须在 INTLConfig.ini 文件中配置 App ID。
2. 配置应用
在 Applications 页面,单击要配置的应用程序。
点击左侧导航栏中的 OAuth2,然后转到 OAuth2 > General。
在 Redirects 下配置下列重定向 URL,用于在 Discord 网页进行授权后接收回调,可点击 Add Another 增加单元格:
- https://common-web.intlgame.com/jssdk/discordlogincallback.html
- https://test-common-web.intlgame.com/jssdk/discordlogincallback.html
注意在移动端如果想要使用 Discord app 而非 Discord 网页进行授权,还需要填写一个重定向 URL 用于 Discord app 授权后回调。 重定向 URL 规则:
- 全部使用小写。
- 方案应以 "intl" 开头。
- URL 应包括主机和路径。
例子: intlmoba://auth/callback
注意对于多商店渠道包:
支持多商店渠道包需要单独的
REDIRECT_URL_SCHEME
。一个 App ID 支持10个重定向 URL(约4个多商店渠道包)。如果游戏需要多于4个多商店渠道包,请申请更多 App ID。要使用多个应用程序 ID,游戏需要 在INTLConfig.ini
中配置多个应用程序 ID 和 在 Player Network 上注册多个 Discord 应用程序。点击左侧导航栏中的 Rich Presence,进入 Rich Presence Art Assets 页面。
点击 Add Image(s),配置应用程序的图片资源。
说明应用程序中使用的所有图片资源都必须在此页面进行配置,包括好友邀请函的封面照片。
步骤1:为 Discord 登录配置 SDK
由于 Discord SDK 仅与 minSdkVersion
>=23 或更高版本兼容,因此在 Android 6.0 或更早版本上运行可能会出现问题。请为游戏设置 minSdkVersion
>= 23。
- 在
AndroidManifest
文件中,确保添加了所需权限。Discord 需要网络访问权限。
<uses-permission android:name="android.permission.INTERNET"/>
打开项目的 INTLConfig.ini 文件:
[Android LifeCycle]
LIFECYCLE = Discord
[Discord]
DISCORD_APP_ID = {INTL_DISCORD_APP_ID}
DISCORD_REDIRECT_URL = {INTL_DISCORD_REDIRECT_URL}- 在
LIFECYCLE
中添加 Discord。有关更多信息,请参见 SDK 环境。 - 将
{INTL_DISCORD_APP_ID}
替换为游戏的 Discord App ID。 - 将
{INTL_DISCORD_REDIRECT_URL}
替换为平台上配置的 Redirect URL。
- 在
完成 Gradle 配置。
- Unity
- Unreal Engine
在 mainTemplate.gradle
中,添加 DISCORD_APP_ID
、DISCORD_REDIRECT_SCHEME
、DISCORD_REDIRECT_HOST
、DISCORD_REDIRECT_PATH
。
android {
defaultConfig {
manifestPlaceholders = [
"DISCORD_APP_ID":"{INTL_DISCORD_APP_ID}",
"DISCORD_REDIRECT_SCHEME":"{INTL_DISCORD_REDIRECT_SCHEME}",
"DISCORD_REDIRECT_HOST":"{INTL_DISCORD_REDIRECT_HOST}",
"DISCORD_REDIRECT_PATH":"{INTL_DISCORD_REDIRECT_PATH}"
]
}
}
由于 Discord 要求应用程序的 minSdkVersion
至少为 23,因此 UE 项目在打包时必须将 minSdkVersion
配置更新为至少 23。
在 INTLCore_UPL.xml
中,添加 DISCORD_APP_ID
、DISCORD_REDIRECT_SCHEME
、DISCORD_REDIRECT_HOST
和 DISCORD_REDIRECT_PATH
。
<buildGradleAdditions>
<insert>
<![CDATA[
android{
defaultConfig {
manifestPlaceholders = [
"DISCORD_APP_ID":"{INTL_DISCORD_APP_ID}",
"DISCORD_REDIRECT_SCHEME":"{INTL_DISCORD_REDIRECT_SCHEME}",
"DISCORD_REDIRECT_HOST":"{INTL_DISCORD_REDIRECT_HOST}",
"DISCORD_REDIRECT_PATH":"{INTL_DISCORD_REDIRECT_PATH}"
]
}
}
]]>
</insert>
</buildGradleAdditions>
- 将
{INTL_DISCORD_APP_ID}
替换为游戏的 Discord App ID。 - 将
{INTL_DISCORD_REDIRECT_SCHEME}
替换为 Redirect URL 中配置的方案。 - 将
{INTL_DISCORD_REDIRECT_HOST}
替换为为游戏配置的 Redirect URL 的主机。 - 将
{INTL_DISCORD_REDIRECT_PATH}
替换为游戏 Redirect URL 的路径。
例如,如果在 Discord 开发者平台上配置的 Redirect URL 是 intlsample://auth/callback
:
{INTL_DISCORD_REDIRECT_SCHEME}
= intlsample{INTL_DISCORD_REDIRECT_HOST}
= auth{INTL_DISCORD_REDIRECT_PATH}
= callback
步骤2:添加 Discord 登录
Discord 登录前无需安装应用程序。如果已安装应用,会打开应用登录,否则会打开 Web 界面登录。在 Discord 应用已安装的情况下,如果玩家尝试使用 Discord 登录,但随后取消了登录,他们仍会被重定向到游戏,因为系统无法立即回复 "已取消"。玩家需要等待登录超时,系统才会回复 "超时"。
Discord 登录 permission
需要添加 identify
。如果需要集成 Discord 共享功能,则也需添加 relationships.read,activities.write
。
注册登录相关回调。
- Unity
- Unreal Engine
// 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";
}
}C++ Event Handling (above v1.15)
//configure callback
FINTLAuthEvent authEvent;
authEvent.AddUObject(this, &OnAuthResult_Implementation);
UINTLSDKAPI::SetAuthResultObserver(authEvent);
// Remove callbacks
UINTLSDKAPI::GetAuthResultObserver().Clear();void OnAuthResult_Implementation(FINTLAuthResult ret)
{
UE_LOG(LogTemp, Warning, TEXT("MethodID: %d"), ret.MethodId);
}Unreal Event Handling
void OnAuthResult_Implementation(FINTLAuthResult ret)
{
UE_LOG(LogTemp, Warning, TEXT("MethodID: %d"), ret.MethodId);
}调用
AutoLogin
接口自动登录。- Unity
- Unreal Engine
INTLAPI.AutoLogin();
UINTLSDKAPI::AutoLogin();
在自动登录失败时调用
Login
接口使玩家手动登录。- Unity
- Unreal Engine
INTLAPI.Login(INTLChannel.Discord, "identify", "");
INTLAPI.Login(INTLChannel.Discord, "identify,relationships.read,activities.write", ""); //Friend functionsUINTLSDKAPI::Login(EINTLLoginChannel::Discord, "identify", "");
UINTLSDKAPI::Login(EINTLLoginChannel::Discord, "identify,relationships.read,activities.write", ""); //Friend functions与游戏后台同步客户端身份验证状态,等待最终验证结果。
步骤3:验收登录功能
在 Player Network SDK 日志中搜索关键字 "AuthResult" 确认渠道名称和 OpenID 是否正确返回。如果正确,则表明集成配置成功,登录功能已成功添加。
如果接入过程中遇到问题,请参见 常见问题。