SDK 账号系统包含用户登录、账号绑定、账号切换和账号注销等功能,流程图如下图所示:

1. 登录(必接)
目前支持游客登录、Google 登录、Facebook 登录和 Google Play游戏服务登录,需要在管理后台开启。登录属于异步操作,若游戏无需等待登录结果,便可直接推进后续流程,而不用停滞等待登录操作的反馈。
1.1 游客登录(必接)
需要在管理后台开启游客登录。
1.2 Google 登录(选接)
需要在管理后台开启Google登录并配置 Web Client ID。
1.3 Facebook 登录(选接)
需要在管理后台开启Facebook登录。
1.4 游戏服务登录(选接)
需要在管理后台开启Google Play游戏登录并配置 Web Client ID。
1.5 方法说明
游戏在游戏内引导玩家登录时,可以调用该方法,如果配置了静默登录,SDK 会直接进行游客登录,如果没有配置静默登录,SDK 会打开登录界面,登录成功或者失败会触发初始化监听器中的onLoginSuccess()/onLoginFailed()回调方法。代码示例如下:
SFPlatform.getInstance().login(activity);
// or
SFPlatform.getInstance().login(activity, showLoading);
如果需要指定登录方式,可以传入账号类型,代码示例如下:
SFPlatform.getInstance().loginAccount(activity, accountType);
accountType 是指要登录的账号类型,可以通过 AccountType 类指定:
- AccountType.Visitor:登录游客账号
- AccountType.Google:登录Google账号
- AccountType.Facebook:登录Facebook账号
- AccountType.PlayGames:登录PlayGames游戏账号
登录成功后,游戏需要调用服务端的账号验证接口验证用户登录信息的合法性。流程图如下:

1.6 无网络自动登录(必接)
在某些弱联网游戏中,不强制要求用户登录也可以正常进入游戏。如果在调用login()方法时用户的设备没有可用的网络,SDK会在用户设备恢复网络时自动触发登录操作,并在登录成功时触发初始化监听器中的onLoginSuccessWaitForNetwork()回调方法。如果登录成功时用户已经在游戏中,游戏端需要合理地处理用户的游戏进度和存档数据,尽量不影响用户的游戏体验。
[!TIP|labelVisibility:hidden|iconVisibility:hidden] 注意:回调方法
onLoginSuccess()和onLoginSuccessWaitForNetwork()不会同时被触发。
1.7 设置用户标识(选接)
若第三方 SDK 有设置用户标识的需求,可以在登录成功后,调用第三方 SDK 对应的方法来完成用户唯一标识的设置。
1.7.1 AppLovin
AppLovinSdk.getInstance(context).setUserIdentifier(userId);
1.7.2 AppsFlyer
AppsFlyerLib.getInstance().setCustomerUserId(userId);
1.7.3 Firebase
FirebaseAnalytics.getInstance(context).setUserId(userId);
[!TIP|labelVisibility:hidden|iconVisibility:hidden] 注意:Sofish SDK 在集成第三方 SDK 时,已实现设置用户标识的功能,因此使用 Sofish SDK 的开发者可直接忽略这一操作步骤。
2. 登出(必接)
游戏在游戏内引导玩家返回到游戏登陆界面时,可以调用该方法,让玩家登出 SDK,会触发初始化监听器中的 onLogout() 回调方法,此时游戏应该清除当前登录的用户信息,并返回到游戏登录页面。代码示例如下:
SFPlatform.getInstance().logout(activity);
3. 用户中心(选接)
3.1 账号绑定
游戏在游戏内引导玩家绑定账号时,可以调用该方法,让玩家进行账号绑定,绑定成功或者失败会触发初始化监听器中的 onLinkSuccess()/onLinkFailed()回调方法。代码示例如下:
SFPlatform.getInstance().linkAccount(activity, accountType);
accountType 是指要绑定的账号类型,可以通过 AccountType 类指定:
- AccountType.Google:绑定Google账号
- AccountType.Facebook:绑定Facebook账号
- AccountType.PlayGames:绑定PlayGames游戏账号
3.2 账号切换/账号登录
游戏在游戏内引导玩家切换账号时,可以调用该方法,让玩家进行账号切换,切换成功或者失败会触发初始化监听器中的 onLoginSuccess()/onLoginFailed()回调方法。代码示例如下:
SFPlatform.getInstance().switchAccount(activity, accountType);
accountType 是指要切换的账号类型,可以通过 AccountType 类指定:
- AccountType.Visitor:切换为游客账号
- AccountType.Google:切换为Google账号
- AccountType.Facebook:切换为Facebook账号
- AccountType.PlayGames:切换为PlayGames游戏账号
[!TIP|labelVisibility:hidden|iconVisibility:hidden] 账号切换成功后,游戏端只需要刷新游戏内当前登录的用户信息,不需要再次调用
login()方法。
4. 账号注销
游戏在游戏内引导玩家注销当前登录的账号时,可以调用该方法,让玩家进入账号注销流程,玩家成功提交账号注销申请后会触发初始化监听器中的 onDeleted()回调方法,此时游戏应该清除当前登录的用户信息,并返回到登录页面,账号注销功能仅限已登录用户使用。代码示例如下:
SFPlatform.getInstance().deleteAccount(activity);
5. 客服中心
游戏在游戏内引导玩家打开客服中心界面时,可以调用该方法,让玩家打开客服中心。代码示例如下:
SFPlatform.getInstance().service(activity);
如果需要在游戏内查询最近一条反馈的回复信息,可以调用该方法。代码示例如下:
SFPlatform.getInstance().requestLatestFeedbackReply(new SFRequestResultListener<SFFeedbackReply>() {
@Override
public void onSuccess(SFFeedbackReply data) {
// 查询成功,如果没有回复时data为null
}
@Override
public void onFailed(int code, String message) {
}
});
SFFeedbackReply 数据结构如下:
| 参数名称 | 参数类型 | 是否可为空 | 说明 |
|---|---|---|---|
| replyId | String | 否 | 回复ID |
| content | String | 否 | 回复内容 |
| questionId | String | 否 | 工单ID |
6. 玩家社区
游戏在游戏内引导玩家打开游戏社区时,可以调用该方法,目前支持打开 Discord、Facebook、Instagram、Twitter 和 Line 社区。代码示例如下:
SFPlatform.getInstance().community(communityType, new SFRequestListener() {
@Override
public void onSuccess() {
}
@Override
public void onFailed(int code, String message) {
}
});
communityType 可以通过 CommunityType 类指定,只能指定管理后台已配置的社区:
- CommunityType.Discord:Discord 社区
- CommunityType.Facebook:Facebook 社区
- CommunityType.Instagram:Instagram 社区
- CommunityType.Twitter:Twitter 社区
- CommunityType.Line:Line 社区
7. 提交玩家数据(必接)
游戏在玩家创建角色、进入游戏、等级提升/通关关卡、退出游戏等行为触发时,需要上报游戏中玩家数据,以便渠道后台统计用户数据。每个调用时机,SFRoleData.type 注意不要传错。代码示例如下:
private void submitGameData(int type) {
long currentTime = System.currentTimeMillis() / 1000;
SFRoleData data = new SFRoleData();
data.setType(type); // 调用时机
data.setServerID("1"); // 服务器ID
data.setServerName("test_server_1"); // 服务器名称
data.setRoleID("1"); // 角色ID
data.setRoleName("test_role_1"); // 角色名称
data.setRoleLevel(1); // 角色等级/通过关卡
data.setVipLevel(0); // 角色VIP等级
data.setLevelId(1); // 关卡ID(通关关卡时必须传入)
data.setCreateTime(currentTime); // 角色创建时间(单位:秒)
data.setLastLevelUpTime(currentTime); // 角色等级变化时间(单位:秒)
SFPlatform.getInstance().submit(this, data, listener);
}
SFRoleData 就是游戏内玩家的数据,type 就是该方法的调用时机,可以通过 RoleDataType 类指定,分为以下几种类型:
- RoleDataType.CREATE_ROLE:创建角色
- RoleDataType.ENTER_GAME:进入游戏
- RoleDataType.LEVEL_UP:等级提升/通关关卡
- RoleDataType.EXIT_GAME:退出游戏(用户主动点击退出按钮调用,应用关闭或者进程被杀死则无需调用)
SFRoleData 数据结构如下:
| 参数名称 | 参数类型 | 是否可为空 | 说明 |
|---|---|---|---|
| type | Int | 否 | 调用时机(1:创建角色;2:进入游戏;3:等级提升;4:退出游戏) |
| serverID | String | 否 | 玩家所在服务器的 ID |
| serverName | String | 否 | 玩家所在服务器的名称 |
| roleID | String | 否 | 玩家角色 ID,不能为空或 0 |
| roleName | String | 否 | 玩家角色名称 |
| roleLevel | Integer | 否 | 玩家角色等级/通关关卡 |
| vipLevel | Integer | 否 | 玩家 VIP 等级 |
| levelId | Integer | 否 | 关卡 ID(从1开始,通关关卡时必须传入) |
| createTime | long | 否 | 角色创建时间(单位:秒) |
| lastLevelUpTime | long | 否 | 角色等级变化时间(单位:秒) |
| extraData | String | 是 | 其他数据,没有可以留空 |
[!TIP|labelVisibility:hidden|iconVisibility:hidden] 玩家创建角色、进入游戏、等级提升/通关关卡、退出游戏等行为触发时,都需要上报当前玩家数据。对于关卡类游戏,玩家通关关卡时,需要通过
levelId字段上报玩家的正在通关的关卡。
8. 其他功能(选接)
8.1 刷新用户信息
游戏在游戏内需要刷新用户信息时,可以调用该方法,刷新成功后返回用户登录信息,详见 SFUser
SFPlatform.getInstance().refreshUser(new SFRequestResultListener<SFUser>() {
@Override
public void onSuccess(SFUser data) {
}
@Override
public void onFailed(int code, String message) {
}
});
8.2 查询用户个人资料
游戏在游戏内需要查询 Google、Facebook 账号个人资料时,可以调用该方法,查询成功后返回用户个人资料信息,详见 SFProfile。代码示例如下:
SFPlatform.getInstance().queryProfile(activity, new SFRequestResultListener<SFProfile>() {
@Override
public void onSuccess(SFProfile data) {
}
@Override
public void onFailed(int code, String message) {
}
});
SFProfile 数据结构如下:
| 参数名称 | 参数类型 | 是否可为空 | 说明 |
|---|---|---|---|
| accountType | int | 否 | 账号类型 |
| accountId | String | 否 | 账号 ID |
| name | String | 是 | 用户名 |
| String | 是 | 用户邮箱 | |
| picture | String | 是 | 用户头像 |