链接 Idp
Note
- 有关 AuthV4.Helper 的描述,请参阅 Authentication 页面。
登录后,用户必须能够显示当前使用的 PlayerID 的链接状态,并提供与其他 IdP(身份提供者,以下简称 IdP)链接的能力。
请配置用户界面,以在游戏的设置菜单中显示 IdP 集成状态,并允许 IdP 集成和断开连接。
检查 IdP 集成状态信息¶
您可以使用AuthV4类的getPlayerInfo()
方法检查与当前登录的PlayerID关联的IdP列表。请配置用户界面以显示在游戏设置屏幕中链接的IdP,并公开提示IdP集成的文本。
在游戏内设置屏幕中,用户的PlayerID必须与IdP集成信息一起显示。PlayerID应标示为CS代码,并应暴露当前登录用户的PlayerID值。
以下通过从setup()
返回的providerTypeList检查当前应用中可用的IdP列表,然后使用下面的示例代码检查与PlayerID关联的IdP列表并显示关联状态。
API 参考: hive.AuthV4.getPlayerInfo
API 参考: AuthV4::getPlayerInfo
API 参考: com.hive.AuthV4.getPlayerInfo
API 参考: HIVEAuthV4:getPlayerInfo
API 参考: AuthV4Interface.getPlayerInfo
建议 IdP 同步的短语¶
语言 | 短语 |
---|---|
韩语 | 계정 연동을 통해 플레이 데이터를 안전하게 지키세요! |
英语 | Sync your account to protect your game data! |
日语 | アカウントを連動してプレイデータを守りましょう! |
中文(简体) | 绑定账号,保护游戏数据安全吧! |
中文(繁体) | 綁定帳號,保護帳號資料安全! |
法语 | Synchronise ton compte afin de protéger tes données de jeu ! |
德语 | Synchronisiere dein Konto, um deine Spieldaten zu schützen! |
俄语 | Синхронизируйте аккаунт, чтобы обезопасить игровые данные. |
西班牙语 | ¡Sincronicen su cuenta para proteger sus datos del juego! |
葡萄牙语 | Sincronize sua conta para proteger seus dados de jogo! |
印尼语 | Hubungkan akunmu untuk mengamankan data game milikmu! |
越南语 | Vui lòng liên kết tài khoản để bảo vệ an toàn cho dữ liệu game của bạn! |
泰语 | ซิงค์บัญชีเพื่อปกป้องข้อมูลเกมของคุณ! |
意大利语 | Sincronizza il tuo account per proteggere i tuoi dati di gioco. |
土耳其语 | Oyun verilerini korumak için hesabınızı senkronize ediniz. |
阿拉伯语 | زامن حسابك لحماية بيانات اللعبة الخاصة بك! |
IdP 同步¶
当前登录的 PlayerID 可以与新的 IdP 同步。但是当用户尝试与链接到不同 PlayerID 的 IdP 同步时,会发生错误。如果同步成功,请检查同步状态信息并更新同步信息 UI。
Note
要插入 IdP 图标或徽标,请查看我们针对每个 IdP 的指南。
Warning
iOS Steam 登录支持 iOS 14 及以上版本。 有人怀疑与 Steam 登录页面的渲染问题有关,用户名和密码输入字段在 iOS 14 以下版本的 Safari 浏览器和 WKWebView 中不显示。
Warning
从2020年3月起,Apple App Store警告使用UIWebView(ITMS-90809),并要求在2020年4月之前删除与UIWebView相关的代码,适用于2019年9月之后发布的应用和游戏。我们确认从Hive SDK v4.14.0添加的Twitter框架使用了与UIWebView相关的类,并且每当提交游戏时,它会持续发出App Center警告。为了保护不被拒绝,Twitter框架暂时被删除,直到没有UIWebView的新框架可用。简而言之,游戏工作室需要对用户使用Twitter登录时调用相关API的情况做出响应,ResultAPI接收到NotSupportedProviderType代码。
来自 Hive SDK v4.14.4,新的框架可用于响应与 UIWebView 相关的警告,适用于早于 2019.3 的 Unity。 如果您的游戏需要 Unity 2019.3 及更高版本,Twitter 将无法进行身份验证,因此,请确保按照以下设置删除并防止 Hive SDK 引用与 Twitter 相关的框架。
- 通过外部依赖设置删除 Twitter 框架
- 在 Xcode 项目中删除 ProviderTwitter.framework
Warning
- 确保以英文书写Google和Apple产品的名称。
- 新的身份提供者,Apple应以Sign In with Apple的英文形式表示,并以Apple로 로그인的韩文形式表示。图标上的文本布局应为居中对齐。
- 有关在身份验证中应用的多语言登录按钮名称,请点击 这里。
当您要在 IdP 连接中添加的 IdP 与另一个 PlayerID 关联时,这称为账户冲突情况。要解决此冲突情况,请参阅 处理与 IdP 相关的账户冲突。
对于 IdP 集成,调用 connect ()
方法,并将您要使用的 ProviderType
作为参数。以下是实现 IdP 同步的示例代码。
API 参考: hive.AuthV4.Helper.connect
#include "HiveAuthV4.h"
EHiveProviderType ProviderType = EHiveProviderType::HIVE;
FHiveAuthV4::Helper::Connect(ProviderType, FHiveAuthV4HelperDelegate::CreateLambda([this](const FHiveResultAPI& Result, const TOptional<FHivePlayerInfo>& PlayerInfo) {
switch (Result.Code) {
case FHiveResultAPI::ECode::Success:
// 成功同步 IdP
break;
case FHiveResultAPI::ECode::AuthV4ConflictPlayer:
// 账户冲突
break;
default:
// 异常情况
break;
}
}));
API 参考: AuthV4::Helper::connect
// Hive SDK AuthV4 请求以与 IdP 同步
AuthV4::Helper::connect(ProviderInfo::providerTypeFromString(providerType), [=](ResultAPI const & result, std::shared_ptr playerInfo) {
switch (result.code) {
case ResultAPI::Success:
// 成功同步 IdP
break;
case ResultAPI::AuthV4ConflictPlayer:
// 账户冲突
break;
default:
// 异常情况
break;
}
});
API 参考: com.hive.AuthV4.Helper.connect
// Hive SDK AuthV4 请求以与 IdP 同步
AuthV4.Helper.connect(ProviderType providerType, new AuthV4.Helper.AuthV4HelperListener() {
@Override
public void onAuthV4Helper(ResultAPI result, AuthV4.PlayerInfo playerInfo) {
switch(result.code) {
case Success:
// 成功同步 IdP
break;
case AuthV4ConflictPlayer:
// 账户冲突
break;
default:
// 异常情况
break;
}
}
});
API Reference: HIVEAuthV4Helper::connect:handler:
API 参考: AuthV4Interface.connect
处理与 IdP 同步的帐户冲突¶
当为 IdP 集成调用 connect()
时,如果用户尝试连接的 IdP 账户已经链接到另一个 PlayerID,则会发生账户冲突。为了进一步解释,我们假设以下情况。
- CurrentPlayer: 用户当前登录的账户的玩家(访客账户或 IdP 账户)
- ConflictPlayer: 用户想要链接的 IdP 账户中已存在的玩家
当ConflictPlayer的游戏记录存在于游戏服务器中¶
在这种情况下,当发生账户冲突时,ConflictPlayer 的播放信息会通知用户,并且会显示选择 ConflictPlayer 的 UI。要使用 Hive SDK 提供的 UI,请配置适合游戏的 ConflictPlayer 信息,并调用 showConflict()
方法,将 ConflictPlayer 信息作为参数。当调用时,您可以切换到 ConflictPlayer,或者选择取消以继续使用 CurrentPlayer 玩游戏。在下面的 UI 图像示例中,单击勾选按钮会切换到 ConflictPlayer,单击 X 按钮则继续使用 CurrentPlayer 玩游戏。
Note
账户选择 UI 可以是 Hive SDK 提供的 UI,也可以由游戏方自定义。有关自定义账户选择 UI 的信息,请参阅 在 IdP 冲突中自定义。
当ConflictPlayer的游戏记录在游戏服务器中不存在时¶
有时,只有冲突玩家的标识符(PlayerId)存在,但游戏服务器上没有实际的游戏记录。在这种情况下,调用 resolveConflict(CB)
以选择当前玩家的 PlayerID 并继续游戏。当发生账户冲突时,显示以下用户界面。
-
当 CurrentPlayer 是访客账户而 ConflictPlayer 是 IdP 账户时
-
当 CurrentPlayer 是 IdP 账户 1(例如:Facebook),而 ConflictPlayer 是 IdP 账户 2(例如:Google Play)时
当 ConflictPlayer 是受限账户¶
当ConflictPlayer(IdP账户)处于受限状态时,如果CurrentPlayer(IdP账户或访客账户)尝试使用AuthV4.connect
在另一台设备上连接,将不会出现账户冲突,而是会显示一个限制弹窗。 如果应用用户关闭限制弹窗,AuthV4.connect
将返回错误,CurrentPlayer尝试连接此IdP将失败。
示例 1:当 CurrentPlayer 是 IdP 账户时¶
如果之前链接的 Facebook IdP 账户(ConflictPlayer)处于暂停状态,而用户尝试链接 Google IdP(CurrentPlayer),则会出现暂停弹出窗口。关闭弹出窗口将注销 Facebook IdP。
示例 2:当 CurrentPlayer 是访客帐户¶
如果之前链接的 Facebook IdP 账户(ConflictPlayer)处于暂停状态,而用户尝试使用访客账户(CurrentPlayer)链接到 Facebook IdP,则会出现暂停弹出窗口。关闭弹出窗口将注销 Facebook IdP。
关于账户选择的说明¶
如果用户选择了ConflictPlayer,而CurrentPlayer处于访客状态,则找不到CurrentPlayer。如果CurrentPlayer在访客状态下有来自另一个游戏服务器的数据,该游戏数据也将无法找到。因此,您应该防止用户在访客状态下对游戏服务器进行更改,以避免此问题。如果用户在SDK提供的账户选择页面点击X按钮,则账户同步将被取消。
游戏数据的组成¶
ConflictPlayer 数据由两个基本键组成,player_id
和 game_data
。
player_id
: 冲突玩家的玩家IDgame_data
: 以Map<String, Object >;
格式组织游戏数据,例如角色名称、游戏货币数量和等级
以下是组合ConflictPlayer数据的示例代码。
从 Hive SDK 实现账户选择 UI(带游戏数据)¶
一旦您完成了对ConflictPlayer数据的配置,将调用showConflict()方法以暴露SDK提供的UI,用户的选择将作为结果返回。如果结果成功且用户选择了ConflictPlayer,则需要重新加载游戏数据。当用户跳过或未能选择账户时,结果返回失败,在这种情况下,请确保继续游戏。但是,如果在切换账户时未能对设备进行身份验证(AuthV4NotRegisteredDevice
),游戏必须返回到初始页面以便重新登录。这会导致对SDK的登录被取消,并且isAutoSignIn返回true
。
以下是实现 Hive SDK 提供的 UI 的示例代码,通过配置冲突的 PlayerID 的游戏数据。
API 参考: hive .AuthV4.Helper.showConflict
// 创建冲突账户的游戏信息对象
AuthV4.Helper.ConflictSingleViewInfo conflictInfo = new AuthV4.Helper.ConflictSingleViewInfo(playerId);
conflictInfo.setValue("Gold", 2048);
conflictInfo.setValue("Gem", 220);
// 请求 Hive SDK AuthV4.Helper 账户选择 UI
AuthV4.Helper.showConflict (conflictInfo, (ResultAPI result, AuthV4.PlayerInfo playerInfo) =>; {
if (result. needExit()) {
// TODO: 实现应用程序的终止。
// 示例) Application.Quit();
} else {
switch(result.code) {
case ResultAPI.Code.AuthV4PlayerChange:
// 账户切换:需要重新启动游戏
break;
case ResultAPI.Code.AuthV4PlayerResolved:
// 保持当前用户
break;
case ResultAPI.Code.AuthV4NotRegisteredDevice:
// 这是由于设备认证失败而取消登录的情况。尝试使用自动登录,或注销。
break;
default:
// 处理其他异常
break;
}
}
});
#include "HiveAuthV4.h"
int64 玩家ID = 12345678;
FHiveConflictSingleViewData 视图数据 = FHiveConflictSingleViewData(玩家ID);
视图数据.SetData(TEXT("金币"), TEXT("2048"));
视图数据.SetData(TEXT("宝石"), TEXT("220"));
FHiveAuthV4::Helper::ShowConflict(ViewData, FHiveAuthV4HelperDelegate::CreateLambda([this](const FHiveResultAPI& Result, const TOptional<FHivePlayerInfo>& PlayerInfo) {
if (Result.NeedExit()) {
// TODO: implement the termination of the app.
// Example) Application.Quit();
} else {
switch (Result.Code) {
case FHiveResultAPI::ECode::AuthV4PlayerChange:
// 账户切换:需要重新启动游戏
break;
case FHiveResultAPI::ECode::AuthV4PlayerResolved:
// 保持当前用户
break;
case FHiveResultAPI::ECode::AuthV4NotRegisteredDevice:
// 这是由于设备认证失败而取消登录的情况。尝试使用AUTO重新登录,或登出。
break;
default:
// 处理其他异常
break;
}
}
}));
API 参考: AuthV4 ::Helper::showConflict
// 创建冲突账户的游戏信息对象
ConflictSingleViewInfo* conflictInfo = new ConflictSingleViewInfo(playerId);
conflictInfo->;SetValue("Gold", 2048);
conflictInfo->;SetValue("Gem", 220);
// Hive SDK AuthV4::Helper 账户选择 UI 请求
AuthV4::Helper::showConflict(*conflictInfo, [=](ResultAPI const & result, std::shared_ptr playerInfo) {
if (result. needExit()) {
// TODO: 实现应用程序的终止。
// Cocos2d-x 引擎的用户
// ex) exit(0);
// 虚幻引擎用户
// 示例) UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit, false);
} else {
switch(result.code) {
case ResultAPI::AuthV4PlayerChange:
// 账户切换:需要重新启动游戏
break;
case ResultAPI::AuthV4PlayerResolved:
// 保持当前用户
break;
case ResultAPI::Code::AuthV4NotRegisteredDevice:
// 这是由于设备认证失败而取消登录的情况。尝试使用AUTO重新登录,或注销。
break;
default:
// 处理其他异常
break;
}
}
});
API 参考: com.hive.AuthV4.Helper.showConflict
// 创建冲突账户的游戏信息对象
val conflictInfo = AuthV4.Helper.ConflictSingleViewInfo(playerId)
conflictInfo.setValue("Gold", 2048)
conflictInfo.setValue("Gem", 220)
// 请求 Hive SDK AuthV4.Helper 账户选择 UI
AuthV4.Helper.showConflict(conflictInfo, object : AuthV4.Helper.AuthV4HelperListener {
override fun onAuthV4Helper(result: ResultAPI, playerInfo: AuthV4.PlayerInfo?) {
if (result. needExit()) {
// TODO: 实现应用程序的终止。
// 例如) exitProcess(0)
} else {
when (result.code) {
ResultAPI.Code.AuthV4PlayerChange ->; {
// 账户切换:需要重新启动游戏
}
ResultAPI.Code.AuthV4CancelDialog ->; {
// 保持当前用户
}
ResultAPI.Code.AuthV4NotRegisteredDevice ->; {
// 这是由于设备身份验证失败而取消登录的情况。请尝试使用 AUTO 重新登录,或注销。
}
else ->; {
// 处理其他异常
}
}
}
}
})
API 参考: com .hive.AuthV4.Helper.showConflict
// create game info object of the conflicted account
AuthV4.Helper.ConflictSingleViewInfo conflictInfo = new AuthV4.Helper.ConflictSingleViewInfo(playerId);
conflictInfo.setValue("Gold", 2048);
conflictInfo.setValue("Gem", 220);
// 请求 Hive SDK AuthV4.Helper 账户选择 UI
AuthV4.Helper.showConflict(conflictInfo, new AuthV4.Helper.AuthV4HelperListener() {
@Override
public void onAuthV4Helper(ResultAPI result, AuthV4.PlayerInfo playerInfo) {
if (result. needExit()) {
// TODO: 实现应用程序的终止。
// ex) System.exit(0);
} else {
switch(result.code) {
case AuthV4PlayerChange:
// 账户切换:需要重新启动游戏
break;
case AuthV4CancelDialog:
// 保持当前用户
break;
case AuthV4NotRegisteredDevice:
// 这是由于设备认证失败而取消登录的情况。尝试使用AUTO重新登录,或注销。
break;
default:
// 处理其他异常
break;
}
}
}
});
API 参考: HIVEAuthV4Helper::showConflict:handler:
// 创建冲突账户的游戏信息对象
let conflictInfo = ConflictSingleViewInfo(playerId: 12345678)
conflictInfo.setValue("Gold", intValue: 2048)
conflictInfo.setValue("Gem", intValue: 220)
// Hive SDK AuthV4:Helper 账户选择 UI 请求
AuthV4Interface.helper().showConflict(conflictInfo) { (result, playerInfo) in
if result.needExit() {
// TODO: implement the termination of the app.
// ex) exit(0)
} else {
switch result.getCode() {
case .authV4PlayerChange:
// account switching: game restart required
case .authV4CancelDialog:
// keep current user
case .authV4NotRegisteredDevice:
// 这是由于设备认证失败而取消登录的情况。请尝试使用AUTO重新登录,或注销。
default:
// handle other exceptions
break
}
}
}
API 参考: HIVEAuthV4Helper ::showConflict:handler:
// 创建冲突账户的游戏信息对象
HIVEConflictSingleViewInfo *conflictInfo = [[HIVEConflictSingleViewInfo alloc] initWithPlayerId:12345678];
[conflictInfo setValue:@"Gold" intValue:2048];
[conflictInfo setValue:@"Gem" intValue:220];
// Hive SDK AuthV4:Helper 账户选择 UI 请求
[[HIVEAuthV4 helper] showConflict:conflictInfo handler:^(HIVEResultAPI *result, HIVEPlayerInfo *playerInfo) {
if (result. needExit) {
// TODO: 实现应用程序的终止。
// 例如) exit(0);
} else {
switch(result.code) {
case kAuthV4PlayerChange:
// 账户切换:需要重新启动游戏
break;
case kAuthV4CancelDialog:
// 保持当前用户
break;
case kAuthV4NotRegisteredDevice:
// 这是由于设备认证失败而取消登录的情况。尝试使用AUTO重新登录,或注销。
break;
default:
// 处理其他异常
break;
}
}
}];
从 Hive SDK 实现账户选择 UI(没有游戏数据或数据未知)¶
如果您无法在显示账户选择 UI 时验证游戏数据,或者只是通知登录的更改,则简化的 UI 适用于这些情况。当用户跳过或未能选择账户时,结果返回失败,在这种情况下,请确保继续游戏。但是,如果在切换账户时未能验证设备(AuthV4NotRegisteredDevice
),游戏必须返回到初始页面以便重新登录。这会导致 SDK 的登录被取消,并且 isAutoSignIn 返回 true
。
以下是实现 Hive SDK 提供的用户界面的示例代码,通过隐藏冲突的 PlayerID 的游戏数据。
API 参考: hive .AuthV4.Helper.showConflict
// 请求 Hive SDK AuthV4.Helper 账户选择 UI
AuthV4.Helper.showConflict ((ResultAPI result, AuthV4.PlayerInfo playerInfo) =>; {
if (result. needExit()) {
// TODO: 实现应用退出功能
// 示例) Application.Quit();
} else {
switch(result.code) {
case ResultAPI.Code.AuthV4PlayerChange:
// 账户切换:需要重新启动游戏
break;
case ResultAPI.Code.AuthV4PlayerResolved:
// 保持当前用户
break;
case ResultAPI.Code.AuthV4NotRegisteredDevice:
// 这是由于设备认证失败而取消登录的情况。尝试使用 AUTO 重新登录或注销。
break;
default:
// 处理其他异常
break;
}
}
});
#include "HiveAuthV4.h"
FHiveAuthV4::Helper::ShowConflict(FHiveAuthV4HelperDelegate::CreateLambda([this](const FHiveResultAPI& Result, const TOptional<FHivePlayerInfo>& PlayerInfo) {
if (Result.NeedExit()) {
// TODO: implement app exit functionality
// Users of the Cocos2d-x engine
// ex) exit(0);
// Unreal engine users
// Example) UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit, false);
} else {
switch (Result.Code) {
case FHiveResultAPI::ECode::AuthV4PlayerChange:
// account switching: game restart required.
break;
case FHiveResultAPI::ECode::AuthV4PlayerResolved:
// keep current user
break;
case FHiveResultAPI::ECode::AuthV4NotRegisteredDevice:
// This is the case when login is canceled due to device authentication failure. Try logging back in with AUTO or log out.
break;
default:
// handle other exceptions
break;
}
}
}));
API 参考: AuthV4 ::Helper::showConflict
// Hive SDK AuthV4::Helper 账户选择 UI 请求
AuthV4::Helper::showConflict([=](ResultAPI const & result, std::shared_ptr playerInfo) {
if (result. needExit()) {
// TODO: 实现应用退出功能
// Cocos2d-x 引擎的用户
// 例如) exit(0);
// Unreal 引擎用户
// 示例) UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit, false);
} else {
switch(result.code) {
case ResultAPI::AuthV4PlayerChange:
// 账户切换: 需要重新启动游戏
break;
case ResultAPI::AuthV4PlayerResolved:
// 保持当前用户
break;
case ResultAPI::Code::AuthV4NotRegisteredDevice:
// 这是由于设备认证失败而取消登录的情况。尝试使用 AUTO 重新登录或注销。
break;
default:
// 处理其他异常
break;
}
}
});
API 参考: com.hive.AuthV4.Helper.showConflict
// 请求 Hive SDK AuthV4.Helper 账户选择 UI
AuthV4.Helper.showConflict(object : AuthV4.Helper.AuthV4HelperListener {
override fun onAuthV4Helper(result: ResultAPI, playerInfo: AuthV4.PlayerInfo?) {
if (result. needExit()) {
// TODO: 实现应用退出功能
// ex) exitProcess(0)
} else {
when (result.code) {
ResultAPI.Code.AuthV4PlayerChange ->; {
// 账户切换:需要重新启动游戏
}
ResultAPI.Code.AuthV4CancelDialog ->; {
// 保持当前用户
}
ResultAPI.Code.AuthV4NotRegisteredDevice ->; {
// 这是由于设备认证失败而取消登录的情况。尝试使用 AUTO 重新登录或注销。
}
else ->; {
// 处理其他异常
}
}
}
}
})
API 参考: com .hive.AuthV4.Helper.showConflict
// 请求 Hive SDK AuthV4.Helper 账户选择 UI
AuthV4.Helper.showConflict(new AuthV4.Helper.AuthV4HelperListener() {
@Override
public void onAuthV4Helper(ResultAPI result, AuthV4.PlayerInfo playerInfo) {
if (result. needExit()) {
// TODO: 实现应用退出功能
// ex) System.exit(0);
} else {
switch(result.code) {
case AuthV4PlayerChange:
// 账户切换:需要重新启动游戏
break;
case AuthV4CancelDialog:
// 保持当前用户
break;
case AuthV4NotRegisteredDevice:
// 当由于设备认证失败而取消登录时的情况。尝试使用 AUTO 重新登录或注销。
break;
default:
// 处理其他异常
break;
}
}
}
});
API 参考: HIVEAuthV4Helper::showConflict:
// Hive SDK AuthV4:Helper account selection UI request
AuthV4Interface.helper().showConflict() { (result, playerInfo) in
if result.needExit() {
// TODO: 实现应用退出功能
// ex) exit(0)
} else {
switch result.getCode() {
case .authV4PlayerChange:
// 账户切换:需要重新启动游戏
case .authV4CancelDialog:
// 保持当前用户
case .authV4NotRegisteredDevice:
// 这是由于设备认证失败而取消登录的情况。尝试使用AUTO重新登录或注销。
default:
// 处理其他异常
break
}
}
}
API 参考: HIVEAuthV4Helper ::showConflict:
// Hive SDK AuthV4:Helper account selection UI request
[[HIVEAuthV4 helper] showConflict:^(HIVEResultAPI *result, HIVEPlayerInfo *playerInfo) {
if (result. needExit) {
// TODO: 实现应用退出功能
// ex) exit(0);
} else {
switch(result.code) {
case kAuthV4PlayerChange:
// 账户切换:需要重新启动游戏
break;
case kAuthV4CancelDialog:
// 保持当前用户
break;
case kAuthV4NotRegisteredDevice:
// 这是由于设备认证失败而取消登录的情况。尝试使用AUTO重新登录或注销。
break;
default:
// 处理其他异常
break;
}
}
}];
在 IdP 冲突情况下的自定义¶
如果在 IdP 同步过程中出现 IdP 冲突,您可以使用返回的冲突 PlayerID 配置游戏数据,并直接在游戏中实现账户选择 UI。如果用户在选择 UI 上选择了一个账户,请使用所选账户的 PlayerID 作为参数实现 selectConflict()
方法。
在以下描述中,当前登录的账户称为CurrentPlayer,而发生冲突的账户称为ConflictPlayer。在自定义账户选择UI时,需要检查用户选择的操作差异,并在UI配置中通知适当的注意事项。当IdP发生冲突时,可能会根据用户选择出现以下问题。
- 选择冲突玩家:
selectConflict(ConfilctPlayer, CB)
被调用。- 如果 CurrentPlayer 是访客,CurrentPlayer 将无法搜索。
- 选择当前玩家:
selectConflict(CurrentPlayer, CB)
被调用。- CurrentPlayer 与 IdP 同步,因此冲突玩家不同步。
- 如果冲突玩家与其他 IdP 不同步,所谓的访客状态可能导致冲突玩家无法搜索。
- 如果取消(用户只是关闭选择页面):
resolveConflict(CB)
被调用。- 继续与 CurrentPlayer 玩游戏,IdP 同步没有任何变化。
在配置账户选择 UI 时,您需要配置适当的警告声明,因为在某些情况下,未选择的数据可能无法在访客状态中找到。此外,如果您希望在账户冲突的情况下配置不更改 IdP 关联的信息,请确保选择 ConflictPlayer 的游戏数据或设计可用于取消账户选择的 UI。
一旦用户在账户选择界面选择了一个账户,使用所选账户的 PlayerID 作为参数实现 selectConflict()
方法。如果用户取消账户选择,请确保在不调用任何 API 的情况下继续游戏。在玩家选择 ConflictPlayer 并收到成功回调后,请确保重新加载游戏数据。
以下是由于账户冲突而选择账户的示例代码。
API 参考: AuthV4::Conflict
long long selectedPlayerId = 1234567890;
// Select Hive SDK AuthV4 Account Conflict
AuthV4::selectConflict(selectedPlayerId, [=](ResultAPI const & result,PlayerInfo const & playerInfo) {
if (result. isSuccess()) {
//账户选择成功
} else if (result. needExit()) {
// TODO: 实现应用退出功能
// Cocos2d-x 引擎的用户
// 例如) exit(0);
// Unreal 引擎用户
// 示例) UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit, false);
}
});
#include "HiveAuthV4.h"
int64 SelectedPlayerId = 12345678;
FHiveAuthV4::SelectConflict(SelectedPlayerId,
FHiveAuthV4OnSignInDelegate::CreateLambda([this](const FHiveResultAPI& Result, const FHivePlayerInfo& PlayerInfo) {
if (Result.IsSuccess()) {
// 账户选择成功
} else if (Result.NeedExit()) {
// TODO: 实现应用退出功能
// ex) exitProcess(0)
}
}));
API 参考: com.hive.AuthV4.selectConflict
val selectedPlayerId: Long = 1234567890
// 选择 Hive SDK AuthV4 账户冲突
AuthV4.selectConflict(selectedPlayerId, object : AuthV4.AuthV4SignInListener {
override fun onAuthV4SignIn(result: ResultAPI, playerInfo: AuthV4.PlayerInfo?) {
if (result. isSuccess) {
// 账户选择成功
} else if (result. needExit()) {
// TODO: 实现应用退出功能
// 例如) exitProcess(0)
}
}
})
API 参考: com.hive.AuthV4.selectConflict
long selectedPlayerId = 1234567890;
// 选择 Hive SDK AuthV4 账户冲突
AuthV4.selectConflict(selectedPlayerId, new AuthV4.AuthV4SignInListener() {
@Override
public void onAuthV4SignIn(ResultAPI result, AuthV4.PlayerInfo playerInfo) {
if(result. isSuccess()) {
//账户选择成功
}
else if (result. needExit()) {
// TODO: 实现应用退出功能
// ex) System.exit(0);
}
}
});
API 参考: HIVEAuthV4:selectConflict
API 参考: HIVEAuthV4:selectConflict
从 IdP 账户断开连接¶
您可以允许用户在 IdP 账户列表 UI 上解除链接的 IdP 账户。如果用户在 IdP 账户列表 UI 上解除链接特定的 IdP 账户,游戏工作室会调用带有 ProviderType
参数的 disconnect()
方法,该参数是特定类型的 IdP,以断开与 IdP 账户的连接。在调用 disconnect()
方法后,您需要检查用户的连接状态,然后更新 UI 上的同步 IdP 列表。
Note
Windows环境不支持访客登录,与移动设备不同。因此,如果您尝试在仅同步一个IdP时调用断开连接API,将返回AuthV4LastProviderCantDisconnect作为结果API代码,并保持同步状态。
API 参考: hive .AuthV4.Helper.disconnect
#include "HiveAuthV4.h"
EHiveProviderType ProviderType = EHiveProviderType::HIVE;
FHiveAuthV4::Helper::Disconnect(ProviderType, FHiveAuthV4HelperDelegate::CreateLambda([this](const FHiveResultAPI& Result, const TOptional<FHivePlayerInfo>& PlayerInfo) {
switch (Result.Code) {
case FHiveResultAPI::ECode::Success:
// Provider disconnection successful
break;
default:
// other exception situations
break;
}
}));
API 参考: AuthV4 ::Helper::disconnect
#include <HIVE_SDK_Plugin/HIVE_CPP.h>
using namespace std;
using namespace hive;
AuthV4::Helper::disconnect(ProviderType::HIVE, [=](ResultAPI const & result, shared_ptr playerInfo) {
switch (result.code) {
case ResultAPI::Success:
// Provider disconnection successful
break;
default:
// other exception situations
break;
}
});
API 参考: Helper.disconnect
import com.hive.AuthV4
import com.hive.ResultAPI
AuthV4.Helper.disconnect(AuthV4.ProviderType.HIVE, object : AuthV4.Helper.AuthV4HelperListener {
override fun onAuthV4Helper(result: ResultAPI, playerInfo: AuthV4.PlayerInfo?) {
when (result.code) {
ResultAPI.Code.Success -> {
// 提供者断开连接成功
}
else -> {
// 其他异常情况
}
}
}
})
API 参考: .disconnect
游戏工作室在实施 IdP 断开连接时可以选择以下政策。 1. 取消所有 IdP 账户的链接,并允许使用访客账户。 2. 强制至少保持一个 IdP 账户链接。
从 IdP 账户断开连接:允许解除所有 IdP 账户¶
游戏工作室可以允许用户解除所有 IdP 账户的链接并使用访客账户。如果用户使用访客账户,则如果由于游戏的初始化或重新安装而丢失该访客账户,则无法恢复该账户。因此,如果用户尝试解除最后一个链接的 IdP,请使用下面的短语弹出关于访客用户的指导,以便该用户可以重新考虑解除链接。请注意,即使其对应的 IdP 被解除链接,PlayerID 也不会被登出。
- 如果您想取消链接最后一个关联的 IdP 账户
语言 | 短语 |
---|---|
韩语 | 最后一个账号解除关联时,将转换为游客状态。转换为游客状态后,重置设备或重装游戏时,游戏数据将被删除。确定要继续解除关联吗? |
英语 | 如果您解除最后一个账号的同步,您将被转移到游客账号。一旦您成为游客,当您重置设备或重新安装游戏时,您的游戏数据将被删除。您确定要继续解除账号同步吗? |
日语 | 最後のアカウントの連動を解除すると、ゲストアカウントに切り替わります。ゲストアカウントに切り替わると、端末初期化またはゲームの再インストール時にゲームデータが削除されます。 アカウントの連動を解除しますか? |
简体中文 | 解除最后一个账号关联时,将转换为游客状态。转换为游客状态后,重置设备或重装游戏时,游戏数据将被删除。确定要继续解除关联吗? |
繁体中文 | 解除最後一個綁定的帳號時,將會切換為訪客帳號。使用訪客帳號時,若重置裝置或重新安裝遊戲,將會刪除遊戲數據。 確定要繼續解除帳號綁定? |
法语 | Si vous dissociez le dernier compte, votre compte sera converti en ""invité"". Si vous devenez ""invité"", votre historique de jeu sera supprimé lors de toute réinitialisation de votre appareil ou suppression du jeu. Êtes-vous sûr de vouloir procéder à la dissociation du compte ? |
德语 | Wenn du die Synchronisation des letzten Kontos aufhebst, wird dein Konto in ein Gastkonto umgewandelt. Sobald du ein Gast bist, werden deine Spieldaten gelöscht, wenn du dein Gerät zurücksetzt oder das Spiel neu installierst. Bist du sicher, dass du die Synchronisation des Kontos aufheben möchtest? |
俄语 | Если Вы отключите синхронизацию с последним аккаунтом, Ваша игровая учетная запись будет преобразована в гостевую. Если Вы используете гостевой аккаунт, Ваши игровые данные будут удалены при сбросе настроек устройства или переустановке игры. Вы действительно хотите отключить синхронизацию? |
西班牙语 | Si desvinculas la última cuenta, tu cuenta se convertirá en invitado. Si te conviertes en invitado, los datos del juego se eliminará cada vez que reinicies tu dispositivo o elimines el juego. ¿Estás seguro de que deseas desvincular la cuenta? |
葡萄牙语 | Se você dessincronizar a sua última conta, você será transferido para uma conta de convidado. Ao se tornar um convidado, os dados do seu jogo serão excluídos quando você resetar o aparelho ou reinstalar o jogo. Tem certeza de que deseja cancelar a sincronização da conta? |
印尼语 | Jika kamu batal sinkronisasi akun terakhir, akunn kamu akan diganti menjadi akun guest. Ketika kamu menjadi guest, data permainanmu akan dihapus ketika kamu mereset perangkat atau menginstall ulang game. Apakah kamu yakin mau membatalkan sinkronisasi akun? |
越南语 | Nếu bạn hủy đồng bộ tài khoản cuối cùng, bạn sẽ được chuyển sang tài khoản Khách. Khi bạn trở thành Khách, dữ liệu chơi game của bạn sẽ bị xóa khi bạn reset thiết bị hoặc cài đặt lại game. Bạn có chắc chắn muốn tiếp tục hủy đồng bộ tài khoản? |
泰语 | หากคุณยกเลิกการซิงค์บัญชีล่าสุด บัญชีของคุณจะย้อนกลับไปเป็นบัญชี Guest หากบัญชีคุณกลายเป็นบัญชี Guest ข้อมูลเกมของคุณจะถูกลบเมื่อคุณรีเซ็ตอุปกรณ์เล่นเกมหรือติดตั้งเกมใหม่อีกครั้ง ดำเนินการต่อโดยไม่ซิงค์บัญชีหรือไม่? |
意大利语 | Annullando la sincronizzazione dell'ultimo account, verrai trasferito/a a un account ospite. Una volta trasferito/a a un account ospite, i tuoi dati di gioco verranno eliminati in caso di ripristino di dispositivo o di reinstallazione del gioco. Sei sicuro/a di voler procedere con l'annullamento della sincronizzazione dell'account? |
土耳其语 | Son hesap senkronizasyonunu kaldırırsanız, misafir hesabına geçersiniz. Hesabınız misafire dönüştürüldüğünde, cihazı sıfırladığınızda veya oyunu yeniden yüklediğinizde oyun verileriniz silinir. Hesap senkronizasyonunu kaldırma işlemine devam etmek istediğinizden emin misiniz? |
阿拉伯语 | إذا ألغيت مزامنة الحساب الأخير ، فسيتم نقلك إلى حساب ضيف. وبمجرد أن تصبح ضيفًا ، سيتم حذف بيانات اللعبة عند إعادة ضبط الجهاز أو إعادة تثبيت اللعبة. هل أنت متأكد أنك تريد متابعة حساب غير متزامن؟ |
如果用户选择解除链接账户,即使上述短语被暴露,调用 disconnect()
。当用户账户变为访客账户时,以下短语可以被暴露。
- 如果用户账户在与最后一个关联的身份提供者断开连接后变为访客账户
语言 | 短语 |
---|---|
韩语 | 已转换为游客状态。 关联账号时,有助于保护游戏数据。 |
英语 | 您已被转移到游客账户。 通过同步您的账户,您可以保护您的游戏数据。 |
日语 | ゲストアカウントに切り替わりました。 アカウントを連動することでゲームデータを守ることができます。 |
中文(简体) | 已转换为游客状态。 关联账号时,有助于保护游戏数据。 |
中文(繁体) | 已切換為訪客帳號。 請綁定帳號,保護您的遊戲數據。 |
法语 | 您已切换到“访客”账户。通过绑定您的账户,您可以确保保护您的游戏数据。 |
德语 | 您的账户已转换为访客账户。通过同步您的账户,您可以保护您的游戏数据。 |
俄语 | 您的账户已转换为访客账户。通过同步账户,您可以保护您的游戏数据。 |
西班牙语 | 您已切换到访客账户。通过绑定您的账户,您可以确保保护您的游戏数据。 |
葡萄牙语 | 您已被转移到访客账户。通过同步您的账户,您可以保护您的游戏数据。 |
印度尼西亚语 | 您的状态已更改为访客。通过同步您的账户,您可以保护您的游戏数据。 |
越南语 | 您已被转移到访客账户。通过同步您的账户,您可以保护您的游戏数据。 |
泰语 | 您的账户已切换为访客账户。通过同步您的账户,您可以保护您的游戏数据。 |
意大利语 | 您已被转移到访客账户。通过同步您的账户,您可以保护您的游戏数据。 |
土耳其语 | 您的账户已转换为访客账户。通过绑定您的账户,您可以保护您的游戏数据。 |
阿拉伯语 | 您已被转移到访客账户。通过同步您的账户,您可以保护您的游戏数据。 |
从 IdP 账户断开连接:保持至少 1 个链接的账户¶
游戏工作室可能会强制用户保持至少一个 IdP 账户链接。当用户解除所有 IdP 账户的链接时,用户账户将转换为访客账户,如果由于初始化或重新安装游戏而丢失访客账户,则无法恢复该账户。因此,如果只有一个 IdP 链接的用户尝试解除该 IdP 的链接,您可以使用以下短语实现限制通知。请注意,即使其对应的 IdP 被解除链接,PlayerID 也不会被注销。
- 如果您想解除链接最后一个 IdP 账户
语言 | 短语 |
---|---|
韩语 | 最少需要保持1个账户的连接。 |
英语 | 你必须保持至少1个账户同步。 |
日语 | 至少必须连动1个账户。 |
中文(简体) | 需要绑定至少1个账号。 |
中文(繁体) | 至少要有1個帳號是綁定的! |
法语 | 你必须保持至少1个账户同步。 |
德语 | 你必须至少同步1个账户。 |
俄语 | 至少1个账户必须同步。 |
西班牙语 | 必须保持至少1个账户同步。 |
葡萄牙语 | 至少需要同步1个账户。 |
印尼语 | 你必须至少有一个连接的账户。 |
越南语 | 你需要保持至少1个账户的连接。 |
泰语 | 至少要同步1个账户。 |
意大利语 | 你必须保持至少1个账户同步。 |
土耳其语 | 至少需要同步1个账户。 |
阿拉伯语 | 你必须至少保持1个账户同步。 |
自定义 IdP 同步¶
自定义 IdP 同步是一个自定义功能,使游戏能够实现自定义 IdP,而不是使用 Hive SDK 提供的 IdP。 在调用自定义登录 API 后,您可以通过访问作为回调结果传递的 PlayerInfo 类实例中的 customProviderInfoData 数据来检查已登录用户的自定义 IdP 信息。customProviderInfoData 的 ProviderType(枚举)被设置为 CUSTOM,并可以通过 ProviderName(字符串)进行区分。
以下是实现自定义 IdP 同步的示例代码。
// Twitter sync that is implemented by the game itself.
Game.Connect"CUSTOM_TWITTER", (string authKey) =>; {
AuthV4.connectWithAuthKey(authKey, (ResultAPI result, PlayerInfo playerInfo) =>; {
switchresult.code) {
case ResultAPI.Code.Success:
// 同步成功
break;
case ResultAPI.Code.AuthV4ConflictPlayer:
// 账户冲突
Dictionary<string, ProviderInfo>; customProviderInfoData = playerInfo.customProviderInfoData;
ProviderInfo providerInfo = customProviderInfoData["CUSTOM_TWITTER"];
// 检查以下用户的同步信息
providerInfo.providerType; // ProviderType.CUSTOM,providerType 固定为 ProviderType.CUSTOM。要区分,请使用 providerName。
providerInfo.providerName; // "CUSTOM_TWITTER"
providerInfo.providerUserId; // Twitter 登录的用户 ID,由游戏本身实现。
break;
default:
// 其他异常
break;
}
});
});
#include "HiveAuthV4.h"
// Twitter同步由游戏本身实现。
void GameConnect(const FString& AuthKey)
{
FHiveAuthV4::ConnectWithAuthKey(AuthKey, FHiveAuthV4OnConnectDelegate::CreateLambda([this](const FHiveResultAPI& Result, const FHivePlayerInfo& ConflictPlayerInfo) {
switch(Result.Code) {
case FHiveResultAPI::ECode::Success:
// 同步成功
break;
case FHiveResultAPI::ECode::AuthV4ConflictPlayer: {
// 账户冲突
TMap<FString, FHiveProviderInfo> CustomProviderInfoData = ConflictPlayerInfo.CustomProviderInfoData;
if (const FHiveProviderInfo* ProviderInfo = CustomProviderInfoData.Find(TEXT("CUSTOM_TWITTER"))) {
// 检查用户的以下同步信息
EHiveProviderType ProviderType = ProviderInfo->ProviderType; // ProviderType::CUSTOM,providerType固定为ProviderType::CUSTOM。要区分,请使用providerName。
FString ProviderName = ProviderInfo->ProviderName; // "CUSTOM_TWITTER"
FString ProviderUserId = ProviderInfo->ProviderUserId; // Twitter登录的用户ID,由游戏本身实现。
}
}
break;
default:
// 其他异常
break;
}
}));
}
// Twitter sync that is implemented by the game itself.
Game::Connect"CUSTOM_TWITTER", [=]string authKey) {
AuthV4::connectWithAuthKeyauthKey, [=]ResultAPI const & result, PlayerInfo const & playerInfo) {
switch (result.code) {
case ResultAPI::Success:
// 同步成功
break;
case ResultAPI::AuthV4ConflictPlayer:
// 账户冲突
map<string, ProviderInfo>; customProviderInfoData = playerInfo.customProviderInfoData;
ProviderInfo providerInfo = customProviderInfoData["CUSTOM_TWITTER"];
// 检查以下用户的同步信息
providerInfo.providerType; // ProviderType::CUSTOM,providerType 固定为 ProviderType::CUSTOM。要区分,请使用 providerName。
providerInfo.providerName; // "CUSTOM_TWITTER"
providerInfo.providerUserId; // Twitter 登录的用户 ID,由游戏本身实现。
break;
default:
// 其他异常
break;
}
});
});
// 由游戏本身实现的Twitter同步。
Game.Connect"CUSTOM_TWITTER") { authKey: String ->;
AuthV4.connectWithAuthKeyresponse.authKey, object : AuthV4.AuthV4ConnectListener {
override fun onAuthV4Connectresult: ResultAPI, conflictPlayer: AuthV4.PlayerInfo?) {
whenresult.code) {
case ResultAPI.Code.Success ->; {
// 同步成功
}
case ResultAPI.Code.AuthV4ConflictPlayer ->; {
// 账户冲突
playerInfo.customProviderInfoData["CUSTOM_TWITTER"]?.let { providerInfo ->;
providerInfo.providerType // ProviderType.CUSTOM,providerType 固定为 ProviderType.CUSTOM。要区分,请使用 providerName。
providerInfo.providerName // "CUSTOM_TWITTER"
providerInfo.providerUserId // Twitter 登录的用户 ID,由游戏本身实现。
}
else ->; {
// 其他异常
}
}
}
}
}
// Twitter sync that is implemented by the game itself.
Game.Connect"CUSTOM_TWITTER", new Callback) {
@Override
public void onResponseString authKey) {
com.hive.AuthV4.INSTANCE.connectWithAuthKeyauthKey, new com.hive.AuthV4.AuthV4ConnectListener) {
@Override
public void onAuthV4ConnectResultAPI result, PlayerInfo conflictPlayer) {
switch (result.getCode)) {
case ResultAPI.Code.Success:
// 同步成功
break;
case ResultAPI.Code.AuthV4ConflictPlayer:
// 账户冲突
ProviderInfo providerInfo = conflictPlayer.getCustomProviderInfoData().get("CUSTOM_TWITTER");
providerInfo.getProviderType(); // ProviderType.CUSTOM,providerType 固定为 ProviderType.CUSTOM。要区分,请使用 providerName。
providerInfo.getProviderName(); // "CUSTOM_TWITTER"
providerInfo.getProviderUserId(); // Twitter 登录的用户 ID,由游戏本身实现。
break;
default:
// 其他异常
break;
}
}
});
}
});
// Twitter sync that is implemented by the game itself.
Game.connect"CUSTOM_TWITTER") { (authKey) in
AuthV4Interface.connectWithAuthKeyauthKey) { result, conflictPlayer in
switch(result.getCode()){
case .success:
// 同步成功
break
case .authV4ConflictPlayer:
// 账户冲突
guard let customProviderInfoData = playerInfo?.customProviderInfoData,
let providerInfo = customProviderInfoData["CUSTOM_TWITTER"] else {
// 用户没有同步信息,失败处理
return
}
// 检查以下用户的同步信息
providerInfo.providerType // HIVEProviderTypeCustom,providerType 固定为 HIVEProviderTypeCustom。要区分,请使用 providerName。
providerInfo.providerName // "CUSTOM_TWITTER"
providerInfo.providerUserID // Twitter 登录的用户 ID,由游戏本身实现。
break
default:
// 其他异常
break
}
}
}
// Twitter sync that is implemented by the game itself.
[Game connect:@"CUSTOM_TWITTER" handler:^NSString* authKey) {
[HIVEAuthV4 connectWithAuthKey:authKey handler:^HIVEResultAPI* result, HIVEPlayerInfo* playerInfo) {
switch(result.code) {
case kSuccess:
// 同步成功
break;
case kAuthV4ConflictPlayer:
// 账户冲突
NSDictionary<NSString*, HIVEProviderInfo*>;* customProviderInfoData = playerInfo.customProviderInfoData;
ProviderInfo* providerInfo = [customProviderInfoData objectForKey:@"CUSTOM_TWITTER"];
// 检查以下用户的同步信息
providerInfo.providerType;
providerInfo.providerType // HIVEProviderTypeCustom,providerType 固定为 HIVEProviderTypeCustom。要区分,请使用 providerName。
providerInfo.providerName; // "CUSTOM_TWITTER"
providerInfo.providerUserId; // Twitter 登录的用户 ID,由游戏本身实现。
break;
default:
// 其他异常
break;
}
}];
}];
取消链接自定义 IdP¶
您可以禁用与自定义 IdP 的同步。基本上,过程与断开 IdP 的过程相同,但它需要 providerName 来请求断开连接。
Note
注意所有 IdP 同步断开连接的情况。请参阅 IdP 断开连接部分的注意事项。
以下示例代码展示了如何实现自定义 IdP 断开连接。
删除 IdP 和访客帐户¶
您需要配置用户界面,以便用户可以在游戏中删除他们的帐户。
Warning
从2022年6月30日起,提交到App Store的支持账户创建的应用程序必须允许用户在应用程序内启动删除其账户。如果您正在更新应用程序或提交具有账户创建的新应用程序,则必须实现账户删除API,以防止审核延迟。有关从App Store删除应用程序的更多信息,请参见Apple政策指南。
在游戏中配置并显示弹出窗口,以确认用户是否继续删除账户。您可以查看下面的弹出窗口短语。
如果确认删除账户的请求,您可以使用 Hive SDK API 或 Hive 服务器 API 删除此 Authentication v4 账户。
- 删除账户的步骤
* **使用 Hive 服务器 API 删除时**: <br>
一旦在游戏客户端删除了帐户,游戏服务器应调用 Hive 服务器 API [删除身份验证 v4 帐户](../../api/hive-server-api/auth/authv4-account-deletion.md) 将已删除帐户的信息发送到身份验证服务器。身份验证服务器接收此信息并删除帐户。删除后,身份验证服务器将帐户删除的结果发送给游戏服务器,游戏服务器将此结果传递给游戏客户端。一旦游戏客户端收到帐户删除的结果,它应提供弹出窗口,通知帐户已被删除。在游戏客户端(Hive SDK)中,无论帐户是<u>**基于 IdP 还是访客帐户**</u>,在帐户被删除后调用 `signOut()`。
* **使用 Hive SDK API 删除时**: <br>
一旦在游戏客户端删除了玩家的账户,游戏服务器应该调用 `playerDelete()
` 将被删除账户的信息发送到认证服务器。如果您收到了来自认证服务器的账户删除回调结果,您应该在游戏端提供弹出窗口,通知账户已被删除。
以下是通过 Hive SDK API 删除帐户的 AuthV4 示例代码。
API 参考: AuthV4.playerDelete
API 参考:AuthV4::playerDelete
API 参考: AuthV4.playerDelete
API 参考: AuthV4.INSTANCE.playerDelete
以下是通过 Hive SDK API 删除帐户的 AuthV4.Helper 示例代码。
API 参考: AuthV4.playerDelete
API 参考:AuthV4::playerDelete
API 参考: AuthV4.playerDelete
API 参考: AuthV4.INSTANCE.playerDelete
当用户看到游戏标题屏幕时,显示 IdP 列表以让该用户登录(如果您不使用 Hive 平台提供的登录 UI,请显示您特定于游戏的登录 UI)。
弹出消息¶
确认账户删除的弹出消息¶
用户在删除账户时出现的账户删除确认弹出窗口的文本如下。
语言 | 安卓 | iOS |
---|---|---|
韩语 | 删除账户时,绑定的数据将被删除。 删除部分游戏数据最多需要90天时间。 * 付费相关咨询请联系[Company Name]客服中心。 | 删除账户时,绑定的数据将被删除。 删除部分游戏数据最多需要90天时间。 * 付费相关咨询请联系应用商店或[Company Name]客服中心。 |
英语 | 删除账户时,绑定的数据将被删除。 删除部分游戏数据最多需要90天时间。 * 付费相关咨询请联系[Company Name]客服中心。 | 删除账户时,绑定的数据将被删除。 删除部分游戏数据最多需要90天时间。 * 付费相关咨询请联系应用商店或[Company Name]客服中心。 |
日语 | 删除账户时,绑定的数据将被删除。 删除部分游戏数据最多需要90天时间。 * 付费相关咨询请联系[Company Name]客服中心。 | 删除账户时,绑定的数据将被删除。 删除部分游戏数据最多需要90天时间。 * 付费相关咨询请联系应用商店或[Company Name]客服中心。 |
中文(简体) | 删除账户时,绑定的数据将被删除。 删除部分游戏数据最多需要90天时间。 * 付费相关咨询请联系[Company Name]客服中心。 | 删除账户时,绑定的数据将被删除。 删除部分游戏数据最多需要90天时间。 * 付费相关咨询请联系应用商店或[Company Name]客服中心。 |
中文(繁体) | 刪除帳號時也將刪除綁定的數據。 刪除部分遊戲數據最長需90天的時間。 * 結帳相關諮詢請至[Company Name]客服中心。 | 刪除帳號時也將刪除綁定的數據。 刪除部分遊戲數據最長需90天的時間。 * 結帳相關諮詢請至App Store或[Company Name]客服中心。 |
德语 | 删除账户时,绑定的数据将被删除。 删除部分游戏数据最多需要90天时间。 * 付费相关咨询请联系[Company Name]客服中心。 | 删除账户时,绑定的数据将被删除。 删除部分游戏数据最多需要90天时间。 * 付费相关咨询请联系应用商店或[Company Name]客服中心。 |
法语 | 删除账户时,绑定的数据将被删除。 删除部分游戏数据最多需要90天时间。 * 付费相关咨询请联系[Company Name]客服中心。 | 删除账户时,绑定的数据将被删除。 删除部分游戏数据最多需要90天时间。 * 付费相关咨询请联系应用商店或[Company Name]客服中心。 |
俄语 | 删除账户时,绑定的数据将被删除。 删除部分游戏数据最多需要90天时间。 * 付费相关咨询请联系[Company Name]客服中心。 | 删除账户时,绑定的数据将被删除。 删除部分游戏数据最多需要90天时间。 * 付费相关咨询请联系应用商店或[Company Name]客服中心。 |
西班牙语 | 删除账户时,绑定的数据将被删除。 删除部分游戏数据最多需要90天时间。 * 付费相关咨询请联系[Company Name]客服中心。 | 删除账户时,绑定的数据将被删除。 删除部分游戏数据最多需要90天时间。 * 付费相关咨询请联系应用商店或[Company Name]客服中心。 |
葡萄牙语 | 删除账户时,绑定的数据将被删除。 删除部分游戏数据最多需要90天时间。 * 付费相关咨询请联系[Company Name]客服中心。 | 删除账户时,绑定的数据将被删除。 删除部分游戏数据最多需要90天时间。 * 付费相关咨询请联系应用商店或[Company Name]客服中心。 |
印度尼西亚语 | 删除账户时,绑定的数据将被删除。 删除部分游戏数据最多需要90天时间。 * 付费相关咨询请联系[Company Name]客服中心。 | 删除账户时,绑定的数据将被删除。 删除部分游戏数据最多需要90天时间。 * 付费相关咨询请联系应用商店或[Company Name]客服中心。 |
泰语 | 删除账户时,绑定的数据将被删除。 删除部分游戏数据最多需要90天时间。 * 付费相关咨询请联系[Company Name]客服中心。 | 删除账户时,绑定的数据将被删除。 删除部分游戏数据最多需要90天时间。 * 付费相关咨询请联系应用商店或[Company Name]客服中心。 |
| 越南语 | 如果您删除帐户,连接的数据将被删除。某些游戏数据的删除可能需要最长90天。 * 有关付款的任何疑问,请联系[公司名称]的客户支持中心。 | 如果您删除帐户,连接的数据将被删除。某些游戏数据的删除可能需要最长90天。 * 有关付款的任何疑问,请联系[公司名称]或App Store的客户支持中心。 | | 意大利语 | 删除帐户时,相关数据也将被删除。删除某些游戏数据可能需要长达90天。 * 请联系[公司名称]客户支持以获取与付款相关的请求。 | "删除帐户时,相关数据也将被删除。删除某些游戏数据可能需要长达90天。 * 请联系App Store或[公司名称]客户支持以获取与付款相关的请求。 | | 土耳其语 | 删除帐户时,连接的数据将被删除。某些游戏数据的删除可能需要长达90天。 * 有关付款的任何问题,请联系[公司名称]客户支持。 | 删除帐户时,连接的数据将被删除。某些游戏数据的删除可能需要长达90天。 * 有关付款的任何问题,请联系App Store或[公司名称]客户支持。 | | 阿拉伯语 | 删除帐户时,相关数据将被删除。某些游戏数据的删除可能需要长达90天。 * 有关付款的任何疑问,请联系[公司名称]的客户支持中心。 | 删除帐户时,相关数据将被删除。某些游戏数据的删除可能需要长达90天。 * 有关付款的任何疑问,请联系App Store或[公司名称]的客户支持中心。 |
Note
在文本中输入您游戏公司客户服务中心的名称,[公司名称]。
提供订阅的游戏需要在确认账户删除的弹出消息中添加短语“即使您删除账户,自动订阅仍会被收费,您需要手动取消订阅。”(以及以下表格中其他语言的短语)。
Korean | 即使删除账号,自动订阅商品也会按期收取费用,因此必须手动解除订阅。 |
---|---|
English | Automatic subscriptions will still be charged even if you delete your account, and you need to unsubscribe manually. |
Japanese | アカウントを削除しても定期購入商品は解約されず料金が請求されますので、手動で解約してください。 |
Chinese (Simplified) | 即使删除账号,自动订阅商品也会按期收取费用,因此必须手动解除订阅。 |
Chinese (Traditional) | 即使刪除帳號,自動訂閱商品仍會繼續扣款,需親自解除訂閱。 |
German | Automatische Abonnements werden auch dann noch berechnet, wenn du dein Konto gelöscht hast. Du musst dich manuell abmelden. |
French | Les abonnements automatiques seront toujours facturés même si vous supprimez votre compte, vous devrez donc vous désabonner vous-même. |
Russian | Автоматическая подписка будет по-прежнему взимать плату даже при удалении аккаунта, поэтому Вам необходимо отменить подписку отдельно. |
Spanish | Las suscripciones automáticas aún se cobrarán incluso si elimina su cuenta, y debe darlas de baja manualmente. |
Portuguese | As assinaturas automáticas ainda serão cobradas mesmo se você excluir sua conta, sendo necessário que você as cancele manualmente. |
Indonesian | Berlangganan otomatis akan tetap dikenakan biaya meskipun kamu menghapus akun, kamu harus membatalkan berlangganan secara manual. |
Thai | การสมัครแพ็กเกจต่าง ๆ โดยอัตโนมัติจะยังมีผลอยู่แม้ว่าคุณลบบัญชีไปแล้ว และคุณต้องยกเลิกการสมัครแพ็กเกจเหล่านั้นด้วยตัวเอง |
Vietnamese | Bạn vẫn sẽ phải trả phí cho các vật phẩm đã đăng ký thanh toán tự động kể cả khi đã xóa tài khoản, vì thế bạn cần phải trực tiếp hủy bỏ đăng ký. |
Italian | Gli abbonamenti automatici verranno comunque addebitati anche dopo aver eliminato l'account, quindi bisogna annullare le rispettive iscrizioni separatamente. |
Turkish | Hesabınızı silseniz bile otomatik abonelikler ücretlendirilecektir ve manuel olarak abonelikten çıkmanız gerekir. |
Arabic | سيستمر فرض رسوم على الاشتراكات التلقائية حتى إذا قمت بحذف حسابك ، وتحتاج إلى إلغاء الاشتراك يدويًا. |
完成账户删除时的弹出消息¶
语言 | 短语 |
---|---|
韩语 | 계정 삭제가 완료되었습니다. |
英语 | The account has been deleted. |
日语 | アカウント削除が完了しました。 |
中文(简体) | 已删除账号。 |
中文(繁体) | 已成功刪除帳號。 |
德语 | Das Konto wurde gelöscht. |
法语 | La suppression du compte a été effectuée |
俄语 | Аккаунт удален. |
西班牙语 | La cuenta se ha suprimido. |
葡萄牙语 | A conta foi excluída. |
印度尼西亚语 | Akun telah dihapus. |
泰语 | บัญชีถูกลบแล้ว |
越南语 | Đã hoàn thành xóa tài khoản. |
意大利语 | L'account è stato cancellato. |
土耳其语 | Hesap silme tamamlandı. |
阿拉伯语 | تم حذف حسابك بنجاح. |
账户删除失败时的弹出消息
语言 | 短语 |
---|---|
韩语 | 계정 삭제가 실패되었습니다. 잠시 후 다시 진행해 주세요. |
英语 | Failed to delete the account. Please try again later. |
日语 | アカウント削除に失敗しました。しばらくしてからもう一度お試しください。 |
中文(简体) | 账号删除失败。请稍后再试。 |
中文(繁体) | 帳號刪除失敗,請稍後再試。 |
德语 | Das Konto konnte nicht gelöscht werden. Bitte versuche es später erneut. |
法语 | La suppression du compte a échoué. Veuillez réessayer dans quelques instants. |
俄语 | Не удалось удалить аккаунт. Пожалуйста, попробуйте позже. |
西班牙语 | Hubo un error al eliminar la cuenta. Por favor, inténtelo de nuevo más tarde. |
葡萄牙语 | Falha ao excluir a conta. Por favor, tente novamente mais tarde. |
印尼语 | Gagal menghapus akun. Silakan coba lagi nanti. |
泰语 | การลบบัญชีล้มเหลว กรุณาลองใหม่ภายหลัง |
越南语 | Xóa tài khoản thất bại. Vui lòng thử lại sau. |
意大利语 | Eliminazione dell'account fallito. Riprova più tardi. |
土耳其语 | Hesap silme başarısız. Daha sonra tekrar deneyiniz. |
阿拉伯语 | فشل حذف الحساب. يرجى إعادة المحاولة في وقت لاحق. |