跳到主要内容

开发指南

监听用户状态变化

在执行登录接口前,需要先设置全局的用户状态变化回调,以方便游戏响应退出登录、第三方账号绑定/解绑成功等状态变更。

import com.xd.intl.account.XDGAccount;
import com.xd.intl.common.callback.XDGUserStatusChangeCallback;
import com.xd.intl.common.constants.Constants;

XDGAccount.addUserStatusChangeCallback(new XDGUserStatusChangeCallback(){
@Override
public void userStatusChange(int code,String message){
if(code == Constants.USER_STATUS_RESULT.LOGOUT_CODE){
// 用户退出登录
} else if (code == Constants.USER_STATUS_RESULT.BIND_CHANGE_CODE) {
// 绑定成功
} else if (code == Constants.USER_STATUS_RESULT.UNBIND_CHANGE_CODE) {
// 解绑成功
} else if (code == Constants.USER_STATUS_RESULT.PROTOCOL_AGREED_AFTER_LOGOUT_CODE) {
// 用户退出登录后点击同意协议
}
}
});

用户状态 code 码定义:

public class Constants {
// ...
public static class USER_STATUS_RESULT {

public final static int LOGOUT_CODE = 0x9001;

public final static int BIND_CHANGE_CODE = 0x1001;

public final static int UNBIND_CHANGE_CODE = 0x1002;

public final static int PROTOCOL_AGREED_AFTER_LOGOUT_CODE = 0x2001;
}
//...
}

发起登录

需要在初始化成功后才可使用登录相关功能。

普通登录

调用流程

  1. 调用 LoginByType(Default) 尝试进行自动登录,如果玩家之前已经登录过且还未过期,则能直接登录成功。
  2. 如果自动登录返回失败,则游戏需要绘制包含各类型登录按钮的登录页面,等待玩家选择登录方式。
  3. 玩家点击登录按钮时调用 LoginByType(targetType) ,需要传入对应的登录类型来触发对应的流程,等待接口回调。
  4. 登录成功后,需要尽早执行 XDGCommon.TrackUser,用于 TapDB 统计用户数据。
  5. 国内在登录成功后需要执行实名防沉迷的流程,请按照 TapSDK 文档 接入,当防沉迷系统返回可以进入时才能允许游戏进入游戏。
  6. XDSDK 登录成功时内建账户(TDSUser/LCUser)无法立即使用,需要执行 var tdsUser = await TDSUser.GetCurrent().Result.Fetch() 获取可用对象。
public enum LoginEntryType {
DEFAULT(-1, "Default"),
GUEST(0, "Guest"),
APPLE(2, "Apple"),
GOOGLE(3, "Google"),
FACEBOOK(4, "Facebook"),
TAP_TAP(5, "TapTap"),
LINE(6, "LINE"),
TWITTER(7, "Twitter"),
STEAM(10, "Steam"),
PHONE(11, "Phone"),
EMAIL(12, "Email");
}

import com.xd.intl.account.XDGAccount;
import com.xd.intl.common.base.XDGError;
import com.xd.intl.common.bean.XDGUser;
import com.xd.intl.common.callback.Callback;
import com.xd.intl.common.entities.LoginEntryType;

import java.util.Map;

XDGAccount.loginByType(LoginEntryType.DEFAULT, new Callback<XDGUser>() {
@Override
public void onCallback(XDGUser xdgUser, XDGError xdgError) {
if (xdgUser != null && xdgError == null) {
// 登录成功
String XDUserID = xdgUser.getId(); // 用户在 XD 账户系统的 XD User ID(用户唯一标识)
String avatarUrl = xdgUser.getAvatar();
String nickName = xdgUser.getNickName();
} else {
// 登录失败
if (xdgError != null) {
// 获取 error code、error 简述和 error 详细内容(详细内容一般是 json 格式,SDK 封装成了 map)
int code = xdgError.getCode();
String errorMsg = xdgError.getMessage();
Map<String,Object> errorDataMap = xdgError.getErrorDataMap();
}
}
}
});

主机登录

我们可以把「Steam/PS/Nintendo」等平台上发行的游戏称之为主机游戏,对于这些游戏,用户们会更习惯用该平台账号登录游戏。对于这类游戏,推荐使用这个接口来登录。

游戏如何正确的使用该接口,可以参考这里的方案

// 参考 https://github.com/xd-platform/xd_sdk_pc_upm 文档
XDGAccount.LoginByConsole(xdgUser => {
ResultText.text = $"Steam 主机登录成功:{xdgUser.nickName} userId: {xdgUser.userId} kid: {xdgUser.token.kid}";
}, null,
error => {
ResultText.text = $"Steam 主机登录失败:{error}";
}
);

在 TapTap 沙盒环境内实现无感登录

XDSDK 从 6.6.0 开始在 Android 上开始支持 TapTap 沙盒环境内的无感登录,需要将 XDConfig.json 中 tapsdkpermissions 内容改为只有一个 basic_info,这个权限代表游戏只能获取 Tap 授权后的 unionid 和 openid,此时在 TapTap 的沙盒环境中用户在点击 Tap 登录后将不需要在授权页点击确认,能直接获得授权成功。

提示
  1. basic_info 的权限只能单独使用,如果额外配上诸如 public_profile、user_friends 的权限,则不会有无感登录的效果。在无感登录的结果中,我们将无法提供用户昵称和头像的数据,如果业务需要使用相关数据,需要游戏自行另外调用 TDSUser 的登录接口,并传入相关的权限来重新触发授权。
  2. iOS 和沙盒外的 Android 环境也能使用 basic_info,但不会有无感登录的效果,会走正常用户手动确认的流程。
  3. PC SDK 目前不支持 basic_info。
XDConfig.json
{
xxx,
"tapsdk": {
xxx:xxx,
"permissions": [
"basic_info"
]
},
xxx
}

退出登录

如果需要退出当前账号,可以使用该接口。调用后 SDK 会重新弹出协议窗口并在用户状态回调中返回 LOGOUT_CODE 事件。在玩家点击同意协议后会返回 PROTOCOL_AGREED_AFTER_LOGOUT_CODE 事件。

import com.xd.intl.account.XDGAccount;

XDGAccount.logout();

获取当前用户信息

在用户已登录的情况下,调用此方法可获取当前已登录用户的信息:

import com.xd.intl.account.XDGAccount;
import com.xd.intl.common.base.XDGError;
import com.xd.intl.common.bean.XDGUser;
import com.xd.intl.common.callback.Callback;

XDGAccount.getUser(new Callback<XDGUser>() {
@Override
public void onCallback(XDGUser xdgUser, XDGError xdgError) {
String XDUserID = xdgUser.getId(); // 用户在 XD 账户系统的 XD User ID(用户唯一标识)
String avatarUrl = xdgUser.getAvatar();
String nickName = xdgUser.getNickName();
}
});

打开用户中心

在用户已登录的情况下,SDK 在用户中心展示了当前已登录用户的一些基本信息,在此页面,用户可操作绑定/解绑第三方登录平台进行帐户的关联。

import com.xd.intl.account.XDGAccount;

XDGAccount.openUserCenter();

打开个人信息页

在用户已登录的情况下,调用此接口可打开个人信息页面,在这个页面中会展示游戏和 SDK 收集的和玩家个人信息相关的内容。

import com.xd.intl.account.XDGAccount;
import com.xd.intl.account.v2.entity.RoleInfo;

XDGAccount.openUserDashboard(
RoleInfo.newBuilder()
.setRoleId(roleId)
.setRoleName(roleName)
.setServerId(serverId)
.setExtra(extra)
.build()
);

打开帐户注销页面

用户可通过此方法进行帐户的注销操作。当用户成功发起注销且关闭当前页面时,会在用户状态回调中返回退出登录的事件,游戏需要同步退出登录状态。此时玩家账号还未真正被删除,需要参考服务端通知对接完成对接后收到通知时在游戏侧删除相应账号的数据。

import com.xd.intl.account.XDGAccount;

XDGAccount.accountCancellation();

绑定第三方账号

当游戏通过一些报错信息得知用户的某个授权已经过期后,可以使用该接口让用户重新授权以正常使用某些第三方平台的数据。

备注

Added in v6.4.1

危险

绑定接口对于玩家来说如果授权了和之前授权不一样的账号的话,存在「换绑」的可能性,所以游戏需要谨慎使用该方法,使用前需要给到用户明确的提醒。参考 绑定账号接口 文档。

import com.xd.intl.account.XDGAccount;
import com.xd.intl.common.base.XDGError;
import com.xd.intl.common.callback.XDGBindResultCallback;
import com.xd.intl.common.entities.LoginEntryType;

XDGAccount.bindByType(LoginEntryType.FACEBOOK, new XDGBindResultCallback(){
@Override
public void onBindResult(boolean success,XDGError xdgError){
if(success){
// 绑定成功
} else {
// 绑定失败
}
}
});

检查本地某个平台的授权是否有效

备注
  • v6.4.1 支持 TapTap 和 Facebook

  • v6.7.0 新增支持 Twitter

import com.xd.intl.account.XDGAccount;
import com.xd.intl.common.entities.LoginEntryType;

boolean isTokenActive = XDGAccount.isTokenActiveWithType(LoginEntryType.TAP_TAP);