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 用户名
email String 用户邮箱
picture String 用户头像

results matching ""

    No results matching ""