链接 Idp
Note
- 有關 AuthV4.Helper 的描述,請參閱 身份驗證 頁面。
在登錄後,用戶必須能夠顯示當前使用的 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
// Request the sync status of Hive SDK AuthV4
for( auto providerInfo : AuthV4::getPlayerInfo().providerInfoData ) {
cout<<"ProviderType : "<<ProviderInfo::stringProviderType(providerInfo.second.providerType)<<endl;
cout<<"ProviderUserId : "<<providerInfo.second.providerUserId<<endl;
}
API 參考: com.hive.AuthV4.getPlayerInfo
API 參考: HIVEAuthV4:getPlayerInfo
API 參考: AuthV4Interface.getPlayerInfo
建議 IdP 同步的短語¶
語言 | 片語 |
---|---|
Korean | 계정 연동을 통해 플레이 데이터를 안전하게 지키세요! |
English | Sync your account to protect your game data! |
Japanese | アカウントを連動してプレイデータを守りましょう! |
Chinese (Simplified) | 绑定账号,保护游戏数据安全吧! |
Chinese (Traditional) | 綁定帳號,保護帳號資料安全! |
French | Synchronise ton compte afin de protéger tes données de jeu ! |
German | Synchronisiere dein Konto, um deine Spieldaten zu schützen! |
Russian | Синхронизируйте аккаунт, чтобы обезопасить игровые данные. |
Spanish | ¡Sincronicen su cuenta para proteger sus datos del juego! |
Portuguese | Sincronize sua conta para proteger seus dados de jogo! |
Indonesian | Hubungkan akunmu untuk mengamankan data game milikmu! |
Vietnamese | 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! |
Thai | ซิงค์บัญชีเพื่อปกป้องข้อมูลเกมของคุณ! |
Italian | Sincronizza il tuo account per proteggere i tuoi dati di gioco. |
Turkish | Oyun verilerini korumak için hesabınızı senkronize ediniz. |
Arabic | زامن حسابك لحماية بيانات اللعبة الخاصة بك! |
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 整合,請使用您想要使用的 ProviderType
作為參數來調用 connect ()
方法。以下是實現 IdP 同步的示例代碼。
API 參考: hive.AuthV4.Helper.connect
// Hive SDK AuthV4 Request to sync with IdP
AuthV4.Helper.connect (providerType, delegate (ResultAPI result, AuthV4.PlayerInfo playerInfo) {
switch(result.code) {
case ResultAPI.Code.Success:
// Success to sync IdP
break;
case ResultAPI.Code.AuthV4ConflictPlayer:
// Account conflict
break;
default:
// Exceptional case
break;
}
});
#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 Request to sync with 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 參考: AuthV4Interface.connect
處理與 IdP 同步的帳戶衝突¶
當呼叫 connect()
以進行 IdP 整合時,如果用戶嘗試連接的 IdP 帳戶已經與另一個 PlayerID 相關聯,則會發生帳戶衝突。為了進一步解釋,我們假設以下情況。
- CurrentPlayer: 用戶當前登錄的帳戶的玩家(訪客帳戶或 IdP 帳戶)
- ConflictPlayer: 用戶想要鏈接的 IdP 帳戶中已經存在的玩家
當ConflictPlayer的遊戲紀錄存在於遊戲伺服器中¶
在這種情況下,當發生帳戶衝突時,ConflictPlayer 的遊戲資訊會通知用戶,並顯示選擇 ConflictPlayer 的 UI。要使用 Hive SDK 提供的 UI,請配置 ConflictPlayer 資訊以適合遊戲,並將 ConflictPlayer 資訊作為參數調用 showConflict()
方法。當調用時,您可以轉換為 ConflictPlayer 或選擇取消以繼續使用 CurrentPlayer 玩遊戲。在下面的 UI 圖像示例中,點擊檢查按鈕會切換到 ConflictPlayer,點擊 X 按鈕則繼續使用 CurrentPlayer 玩遊戲。
Note
帳戶選擇 UI 可以是由 Hive SDK 提供的 UI,也可以由遊戲方自定義。要自定義帳戶選擇 UI,請參考 在 IdP 衝突中自定義。
當ConflictPlayer的遊戲記錄在遊戲伺服器中不存在時¶
有時,只有ConflictPlayer的玩家識別碼(PlayerId)存在,但在遊戲伺服器上沒有實際的遊玩記錄。在這種情況下,調用resolveConflict(CB)
以選擇CurrentPlayer的PlayerID並繼續遊戲。當帳戶衝突發生時,顯示以下UI。
-
當 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
: ConflictPlayer 的玩家 IDgame_data
: 以Map<String, Object >;
格式组织游戏数据,例如角色名称、游戏货币数量和等级
以下是組成ConflictPlayer數據的示例代碼。
從 Hive SDK 實現帳戶選擇 UI(帶遊戲數據)¶
一旦您完成了配置 ConflictPlayer 数据,showConflict () 方法将被调用以暴露 SDK 提供的用户界面,用户的选择将作为结果返回。如果结果成功并且用户选择了 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:
// 這是因為設備驗證失敗而取消登錄的情況。請嘗試使用 AUTO 重新登錄,或登出。
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
// create game info object of the conflicted account
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 引擎的用戶
// 例如) 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
// create game info object of the conflicted account
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: 實現應用程序的終止。
// ex) 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: implement the termination of the app.
// ex) System.exit(0);
} else {
switch(result.code) {
case AuthV4PlayerChange:
// account switching: game restart required
break;
case AuthV4CancelDialog:
// keep current user
break;
case AuthV4NotRegisteredDevice:
// 這是因為設備身份驗證失敗而取消登錄的情況。請嘗試使用AUTO重新登錄,或登出。
break;
default:
// handle other exceptions
break;
}
}
}
});
API 參考: HIVEAuthV4Helper::showConflict:handler:
// create game info object of the conflicted account
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:
// 處理其他異常
break
}
}
}
API Reference: 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: implement the termination of the app.
// ex) exit(0);
} else {
switch(result.code) {
case kAuthV4PlayerChange:
// account switching: game restart required
break;
case kAuthV4CancelDialog:
// keep current user
break;
case kAuthV4NotRegisteredDevice:
// 這是因為設備認證失敗而取消登錄的情況。嘗試使用 AUTO 重新登錄,或登出。
break;
default:
// handle other exceptions
break;
}
}
}];
從 Hive SDK 實現帳戶選擇 UI(無遊戲數據或數據未知)¶
如果您在显示账户选择 UI 时无法验证游戏数据或仅通知登录的更改,则简化的 UI 适用于这种情况。当用户跳过或未能选择账户时,结果返回失败,在这种情况下,请确保继续游戏。然而,如果在切换账户时未能验证设备(AuthV4NotRegisteredDevice
),游戏必须返回到初始页面以便重新登录。这会导致 SDK 登录被取消,并且 isAutoSignIn 返回 true
。
以下是實現 Hive SDK 提供的 UI 的示例代碼,通過隱藏衝突的 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 引擎的用戶
// ex) 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: 實現應用退出功能
// 例如) 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: implement app exit functionality
// 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 Reference: HIVEAuthV4Helper ::showConflict:
// Hive SDK AuthV4:Helper account selection UI request
[[HIVEAuthV4 helper] showConflict:^(HIVEResultAPI *result, HIVEPlayerInfo *playerInfo) {
if (result. needExit) {
// TODO: implement app exit functionality
// ex) exit(0);
} else {
switch(result.code) {
case kAuthV4PlayerChange:
// account switching: game restart required
break;
case kAuthV4CancelDialog:
// keep current user
break;
case kAuthV4NotRegisteredDevice:
// 這是因為設備驗證失敗而取消登錄的情況。請嘗試使用自動登錄或登出後重新登錄。
break;
default:
// 處理其他例外情況
break;
}
}
}];
在 IdP 衝突的情況下的自定義¶
如果在 IdP 同步过程中发生 IdP 冲突,您可以使用返回的冲突 PlayerID 配置游戏数据,并在游戏中直接实现账户选择 UI。如果用户在选择 UI 上选择了一个账户,请使用所选账户的 PlayerID 作为参数实现 selectConflict()
方法。
在以下描述中,当前登录的账户称为 CurrentPlayer,发生冲突的账户称为 ConflictPlayer。在自定义账户选择 UI 时,需要检查用户选择的操作差异,并在 UI 配置中通知适当的注意事项。当 IdP 冲突时,可能会根据用户选择发生以下问题。
- 選擇 ConfilctPlayer:
selectConflict(ConfilctPlayer, CB)
被呼叫。- 如果 CurrentPlayer 是來賓,CurrentPlayer 將無法搜尋。
- 選擇 CurrentPlayer:
selectConflict(CurrentPlayer, CB)
被呼叫。- CurrentPlayer 與 IdP 同步,因此 ConfilctPlayer 失去同步。
- 如果 ConflictPlayer 與其他 IdP 失去同步,所謂的來賓狀態,可能會導致 ConflictPlayer 無法搜尋。
- 如果取消(用戶只是關閉選擇頁面):
resolveConflict(CB)
被呼叫。- 繼續與 CurrentPlayer 玩遊戲,IdP 同步不會有任何變化。
您需要在配置帐户选择用户界面时配置适当的警告声明,因为在某些情况下,未选择的数据可能无法在访客状态中找到。此外,如果您希望在帐户冲突的情况下配置不更改 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 引擎的用戶
// ex) 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: 實現應用退出功能
// ex) 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
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 帳戶的連結
語言 | 片語 |
---|---|
Korean | 最後一個帳號解除綁定時,將轉換為訪客狀態。轉換為訪客狀態後,重置設備或重新安裝遊戲時,遊戲數據將被刪除。您確定要繼續解除帳號綁定嗎? |
English | 如果您解除最後一個帳號的綁定,您將轉換為訪客帳號。一旦您成為訪客,當您重置設備或重新安裝遊戲時,您的遊戲數據將被刪除。您確定要繼續解除帳號綁定嗎? |
Japanese | 最後的帳號解除綁定時,將切換為訪客帳號。當您成為訪客時,當您重置設備或重新安裝遊戲時,您的遊戲數據將被刪除。您確定要繼續解除帳號綁定嗎? |
Chinese (Simplified) | 解除最后一个账号关联时,将转换为游客状态。转换为游客状态后,重置设备或重装游戏时,游戏数据将被删除。确定要继续解除关联吗? |
Chinese (Traditional) | 解除最後一個綁定的帳號時,將會切換為訪客帳號。使用訪客帳號時,若重置裝置或重新安裝遊戲,將會刪除遊戲數據。 確定要繼續解除帳號綁定? |
French | 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 ? |
German | 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? |
Russian | Если Вы отключите синхронизацию с последним аккаунтом, Ваша игровая учетная запись будет преобразована в гостевую. Если Вы используете гостевой аккаунт, Ваши игровые данные будут удалены при сбросе настроек устройства или переустановке игры. Вы действительно хотите отключить синхронизацию? |
Spanish | 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? |
Portuguese | 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? |
Indonesian | 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? |
Vietnamese | 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? |
Thai | หากคุณยกเลิกการซิงค์บัญชีล่าสุด บัญชีของคุณจะย้อนกลับไปเป็นบัญชี Guest หากบัญชีคุณกลายเป็นบัญชี Guest ข้อมูลเกมของคุณจะถูกลบเมื่อคุณรีเซ็ตอุปกรณ์เล่นเกมหรือติดตั้งเกมใหม่อีกครั้ง ดำเนินการต่อโดยไม่ซิงค์บัญชีหรือไม่? |
Italian | 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? |
Turkish | 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? |
Arabic | إذا ألغيت مزامنة الحساب الأخير ، فسيتم نقلك إلى حساب ضيف. وبمجرد أن تصبح ضيفًا ، سيتم حذف بيانات اللعبة عند إعادة ضبط الجهاز أو إعادة تثبيت اللعبة. هل أنت متأكد أنك تريد متابعة حساب غير متزامن؟ |
如果用户选择解除账户链接,即使上述短语被公开,也要调用 disconnect()
。当用户账户变为访客账户时,以下短语可以被公开。
- 如果用戶帳戶在與最後一個連結的身份提供者斷開連接後變為訪客帳戶
語言 | 短語 |
---|---|
Korean | 게스트 상태로 전환되었습니다. 계정 연동을 하시면 게임 데이터를 안전하게 지킬 수 있습니다. |
English | You've been transferred to a guest account. By synchronizing your account, you can secure your game data. |
Japanese | ゲストアカウントに切り替わりました。 アカウントを連動することでゲームデータを守ることができます。 |
Chinese (Simplified) | 已转换为游客状态。 关联账号时,有助于保护游戏数据。 |
Chinese (Traditional) | 已切換為訪客帳號。 請綁定帳號,保護您的遊戲數據。 |
French | Vous êtes passé en compte ""invité"". En liant votre compte, vous pourrez garantir la protection de vos données de jeu. |
German | Dein Konto wurde in ein Gastkonto umgewandelt. Du kannst deine Spieldaten sichern, indem du dein Konto synchronisierst. |
Russian | Ваш аккаунт был преобразован в гостевой. Синхронизовав аккаунт, Вы можете защитить свои игровые данные. |
Spanish | Has cambiado a la cuenta de invitado. Al vincular tu cuenta, podrás garantizar la protección de los datos de tu juego. |
Portuguese | Você foi transferido para uma conta de convidado. Ao sincronizar a sua conta, você pode proteger os dados do seu jogo. |
Indonesian | Statusmu telah diubah menjadi guest. Dengan mensinkronisasikan akun, kamu bisa menjaga data permainanmu agar tetap aman. |
Vietnamese | Bạn đã được chuyển sang tài khoản Khách. Bạn có thể bảo vệ dữ liệu chơi game của mình bằng cách đồng bộ tài khoản. |
Thai | บัญชีคุณย้อนกลับไปเป็นบัญชี Guest แล้ว คุณสามารถรักษาข้อมูลเกมของคุณให้ปลอดภัยด้วยการซิงค์บัญชีของคุณ |
Italian | Sei stato/a trasferito/a a un account ospite. Sincronizzando il tuo account, puoi proteggere i tuoi dati di gioco. |
Turkish | Hesabınız misafir hesap olarak değiştirildi. Hesabınızı bağlayarak oyun verilerinizi güvende tutabilirsiniz. |
Arabic | لقد تم نقلك إلى حساب ضيف. من خلال مزامنة حسابك ، يمكنك تأمين سجلات لعبتك . |
斷開與 IdP 帳戶的連結:保持至少 1 個帳戶連結¶
遊戲工作室可能會強迫用戶至少保持一個 IdP 帳戶連結。當用戶解除所有 IdP 帳戶的連結時,用戶帳戶將轉換為訪客帳戶,如果訪客帳戶因初始化或重新安裝遊戲而丟失,則該帳戶無法恢復。因此,如果只有一個連結的 IdP 的用戶嘗試解除該 IdP 的連結,您可以使用以下短語實施限制通知。請注意,即使其相應的 IdP 被解除連結,PlayerID 也不會登出。
- 如果您想解除最後一個連結的 IdP 帳戶
語言 | 短語 |
---|---|
Korean | 最少需要保持1個帳號連動。 |
English | 你必須至少保持1個帳號同步。 |
Japanese | 至少要有1個帳號是連動的。 |
Chinese (Simplified) | 需要绑定至少1个账号。 |
Chinese (Traditional) | 至少要有1個帳號是綁定的! |
French | 你必須保持至少1個帳號同步。 |
German | 你必須至少同步1個帳號。 |
Russian | 至少需要有1個帳號同步。 |
Spanish | 你必須至少保持1個帳號同步。 |
Portuguese | 你必須至少同步1個帳號。 |
Indonesian | 你必須至少有1個帳號連接。 |
Vietnamese | 你需要保持至少1個帳號連接。 |
Thai | 必須至少同步1個帳號。 |
Italian | 你必須至少保持1個帳號同步。 |
Turkish | 你必須至少同步1個帳號。 |
Arabic | 你必須至少保持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:
// sync success
break
case .authV4ConflictPlayer:
// account conflict
guard let customProviderInfoData = playerInfo?.customProviderInfoData,
let providerInfo = customProviderInfoData["CUSTOM_TWITTER"] else {
// No sync information for the user, failure handling
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)。
彈出訊息¶
確認帳戶刪除的彈出消息¶
用戶在刪除帳戶時出現的帳戶刪除確認彈出窗口的文本如下。
語言 | Android | iOS |
---|---|---|
韓文 | 刪除帳號時,綁定的數據將被刪除。 刪除部分遊戲數據最長需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天的時間。 * 結帳相關諮詢請至App Store或[Company Name]客服中心。 |
德文 | Wenn du dein Konto löschst, werden alle verknüpften Daten gelöscht. Die Löschung einiger Spieldaten kann bis zu 90 Tage dauern. * Bei zahlungsbezogenen Fragen wende dich bitte an den [Company Name] Kundenservice. | Wenn du dein Konto löschst, werden alle verknüpften Daten gelöscht. Die Löschung einiger Spieldaten kann bis zu 90 Tage dauern. * Bei zahlungsbezogenen Fragen wende dich bitte an den App-Store oder den [Company Name] Kundenservice. |
法文 | Si vous supprimez votre compte, les données associées seront également supprimées. La suppression de certaines données de jeu peut prendre jusqu'à 90 jours. * Pour toute demande relative aux paiements, veuillez contacter le service client [Company Name]. | Si vous supprimez votre compte, les données associées seront également supprimées. La suppression de certaines données de jeu peut prendre jusqu'à 90 jours. * Pour toute demande relative aux paiements, veuillez contacter le service client de l'App Store ou de [Company Name]. |
俄文 | Если Вы удалите свой аккаунт, привязанные к нему данные будут также удалены. Удаление некоторых игровых данных может занять до 90 дней. * По вопросам, связанным с оплатой, пожалуйста, обратитесь в службу поддержки [Company Name]. | Если Вы удалите свой аккаунт, привязанные к нему данные будут также удалены. Удаление некоторых игровых данных может занять до 90 дней. * По вопросам, связанным с оплатой, пожалуйста, обратитесь в App Store или службу поддержки [Company Name]. |
西班牙文 | Se eliminarán los datos asociados cuando elimine la cuenta. La eliminación de algunos datos del juego puede demorarse hasta 90 días. * Por favor, póngase en contacto con el servicio de atención al cliente de [Company Name] para consultas relacionadas con el pago. | Se eliminarán los datos asociados cuando elimine la cuenta. La eliminación de algunos datos del juego puede demorarse hasta 90 días. * Por favor, póngase en contacto con el App Store o con el servicio de atención al cliente de [Company Name] para consultas relacionadas con el pago. |
葡萄牙文 | Os dados vinculados à conta serão excluídos quando você excluir a conta. A exclusão de alguns dados do jogo pode levar até 90 dias. * Entre em contato com o Suporte ao Cliente do(a) [Company Name] para consultas relacionadas a pagamentos. | Os dados vinculados à conta serão excluídos quando você excluir a conta. A exclusão de alguns dados do jogo pode levar até 90 dias. * Entre em contato com a App Store ou com o Suporte ao Cliente do(a) [Company Name] para consultas relacionadas pagamentos. |
印尼文 | Data yang terhubung akan dihapus ketika kamu menghapus akun. Beberapa penghapusan data game akan memakan waktu hingga 90 hari. * Silakan hubungi Customer Support [Company Name] untuk melaporkan permasalahan terkait pembayaran. | Data yang terhubung akan dihapus ketika kamu menghapus akun. Beberapa penghapusan data game akan memakan waktu hingga 90 hari. * Silakan hubungi Customer Support App Store atau [Company Name] untuk melaporkan permasalahan terkait pembayaran. |
泰文 | ถ้าคุณลบบัญชีของคุณ ข้อมูลที่เชื่อมต่อไว้จะถูกลบไปด้วย การลบข้อมูลเกมบางส่วนอาจใช้เวลาสูงสุดถึง 90 วัน * กรุณาติดต่อฝ่ายลูกค้าสัมพันธ์ [Company Name] หากต้องการส่งคำร้องหรือมีข้อสงสัยเกี่ยวกับการชำระเงิน | ถ้าคุณลบบัญชีของคุณ ข้อมูลที่เชื่อมต่อไว้จะถูกลบไปด้วย การลบข้อมูลเกมบางส่วนอาจใช้เวลาสูงสุดถึง 90 วัน * กรุณาติดต่อ App Store หรือฝ่ายลูกค้าสัมพันธ์ [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 | سيستمر فرض رسوم على الاشتراكات التلقائية حتى إذا قمت بحذف حسابك ، وتحتاج إلى إلغاء الاشتراك يدويًا. |
完成帳戶刪除時的彈出消息¶
語言 | 短語 |
---|---|
Korean | 계정 삭제가 완료되었습니다. |
English | The account has been deleted. |
Japanese | アカウント削除が完了しました。 |
Chinese (Simplified) | 已删除账号。 |
Chinese (Traditional) | 已成功刪除帳號。 |
German | Das Konto wurde gelöscht. |
French | La suppression du compte a été effectuée |
Russian | Аккаунт удален. |
Spanish | La cuenta se ha suprimido. |
Portuguese | A conta foi excluída. |
Indonesian | Akun telah dihapus. |
Thai | บัญชีถูกลบแล้ว |
Vietnamese | Đã hoàn thành xóa tài khoản. |
Italian | L'account è stato cancellato. |
Turkish | Hesap silme tamamlandı. |
Arabic | تم حذف حسابك بنجاح. |
帳戶刪除失敗時的彈出消息¶
語言 | 短語 |
---|---|
韓文 | 계정 삭제가 실패되었습니다. 잠시 후 다시 진행해 주세요. |
英文 | 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. |
阿拉伯文 | فشل حذف الحساب. يرجى إعادة المحاولة في وقت لاحق. |