Idpのリンク
Note
- AuthV4.Helperに関する詳細は、認証ページを参照してください。
サインイン後、ユーザーが現在使用しているPlayerIDの同期状況を表示し、他のIDプロバイダー(IdP)とリンクできる機能を提供します。 ゲーム設定メニューにIdPの同期状況を表示し、ユーザーがIdPに接続および切断できるようにUIを構成します。
IdP同期ステータスの情報を確認する¶
現在ログインしているPlayerIDと同期されたIdPリストを見るには、AuthV4クラスのgetPlayerInfo()
メソッドを使用できます。ゲーム設定画面では、どのIdPが同期されているかを確認できるようにUIを設定し、IdP同期を提案するフレーズを公開してください。
ゲーム設定画面では、各ユーザーのPlayerIDをIdP同期情報とともに表示する必要があります。PlayerIDはCSコードの形式で、現在ログインしているユーザーの値で表示してください。
以下は、setup()
から返されるproviderTypeListを通じて現在のアプリによって提供されるIdPのリストです。PlayerIDにリンクされたIdPのリストを確認し、指定された例のコードを使用してリンク状況を表示してください。
APIリファレンス: hive.AuthV4.getPlayerInfo
APIリファレンス: AuthV4::getPlayerInfo
// Hive SDK AuthV4の同期ステータスをリクエストする
for( auto providerInfo : AuthV4::getPlayerInfo().providerInfoData ) {
cout<<"プロバイダータイプ : "<<ProviderInfo::stringProviderType(providerInfo.second.providerType)<<endl;
cout<<"プロバイダーユーザーID : "<<providerInfo.second.providerUserId<<endl;
}
APIリファレンス: com.hive.AuthV4.getPlayerInfo
APIリファレンス: HIVEAuthV4: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 LoginはiOSバージョン14以上でサポートされています。 SafariブラウザおよびiOSバージョン14未満のWKWebViewで、ユーザー名とパスワード入力フィールドが表示されないレンダリングの問題があると疑われています。
Warning
2020年3月から、Apple App StoreはUIWebViewの使用に警告を発し(ITMS-90809)、2019年9月以降に公開されたアプリやゲームに対して、2020年4月までにUIWebView関連のコードを削除することを要求しています。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製品の名前は英語で記述するようにしてください。
- 新しいIdPでは、Appleは英語でSign In with Apple、韓国語でApple로 로그인と表示されるべきです。アイコン上のテキストの配置は中央揃えにする必要があります。
- 認証に適用される多言語ログインボタン名については、こちらをクリックしてください。
IdP接続に追加したいIdPが別のPlayerIDにリンクされている場合、これはアカウントの競合状況と呼ばれます。この競合状況を解決するには、IdPを使用してアカウントの競合を処理するを参照してください。
IdP統合のために、connect ()
メソッドを呼び出し、作業したいProviderType
をパラメータとして渡します。以下は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 Request to sync with 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リファレンス: HIVEAuthV4Helper::connect:handler:
IdP Syncによるアカウントの競合処理¶
IdP統合のためにconnect()
が呼び出されると、ユーザーが接続しようとしている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を表示します。
-
現在のプレイヤーがゲストアカウントで、対立するプレイヤーがIdPアカウントの場合
-
現在のプレイヤーがIdPアカウント1(例:Facebook)で、コンフリクトプレイヤーが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
の2つの重要なキーで構成されています。
player_id
: ConflictPlayerのPlayerID\ngame_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:
// これはデバイス認証の失敗によりログインがキャンセルされた場合です。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: アプリの終了を実装する。
// 例) 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 エンジンのユーザー
// 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
// 矛盾したアカウントのゲーム情報オブジェクトを作成する
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: アプリの終了を実装する。
// 例) System.exit(0);
} else {
switch(result.code) {
case AuthV4PlayerChange:
// アカウント切り替え: ゲームの再起動が必要
break;
case AuthV4CancelDialog:
// 現在のユーザーを維持
break;
case AuthV4NotRegisteredDevice:
// これはデバイス認証の失敗によってログインがキャンセルされた場合です。AUTOで再ログインするか、ログアウトしてください。
break;
default:
// 他の例外を処理する
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: アプリの終了を実装する。
// 例) exit(0)
} else {
switch result.getCode() {
case .authV4PlayerChange:
// アカウント切り替え: ゲームの再起動が必要
case .authV4CancelDialog:
// 現在のユーザーを保持
case .authV4NotRegisteredDevice:
// これはデバイス認証の失敗によりログインがキャンセルされた場合です。AUTOで再度ログインを試みるか、ログアウトしてください。
default:
// 他の例外を処理
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: 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:
// This is the case that the login is canceled due to device authentication failure. Try logging in back with AUTO, or log out.
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 エンジンのユーザー
// 例) 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: アプリ終了機能を実装する
// 例) 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: アプリ終了機能を実装する
// 例) 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の競合が発生した場合、ユーザーの選択に応じて以下の問題が発生する可能性があります。
- ConfilctPlayerを選択中:
selectConflict(ConfilctPlayer, CB)
が呼び出されます。- CurrentPlayerがゲストの場合、CurrentPlayerは検索できません。
- CurrentPlayerを選択中:
selectConflict(CurrentPlayer, CB)
が呼び出されます。- CurrentPlayerはIdPと同期しているため、ConfilctPlayerは同期していません。
- ConflictPlayerが他のIdPと同期していない場合、いわゆるゲストステータスがConflictPlayerの検索不可を引き起こす可能性があります。
- キャンセルされた場合(ユーザーが選択ページを閉じた場合):
resolveConflict(CB)
が呼び出されます。- IdPの同期に変更を加えずにCurrentPlayerでゲームを続けます。
アカウント選択UIを設定する際には、適切な注意事項を設定する必要があります。なぜなら、特定の状況下では、未選択のデータがゲスト状態に見つからない場合があるからです。また、アカウントの競合が発生した場合にIdPリンク情報を変更しないように設定したい場合は、ConflictPlayerのゲームデータを選択するか、アカウント選択をキャンセルできるUIを設計することを確認してください。
ユーザーがアカウント選択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: アプリ終了機能を実装する
// 例) System.exit(0);
}
}
});
APIリファレンス: HIVEAuthV4:selectConflict
APIリファレンス: HIVEAuthV4:selectConflict
IdPアカウントからの切断¶
ユーザーがIdPアカウントリストUIでリンクされたIdPアカウントのリンクを解除できるようにすることができます。ユーザーがIdPアカウントリストUIで特定のIdPアカウントのリンクを解除すると、ゲームスタジオは特定のIdPの種類であるProviderType
引数を持つdisconnect()
メソッドを呼び出して、IdPアカウントから切断します。disconnect()
メソッドを呼び出した後、ユーザーの接続状態を確認し、その後UI上の同期されたIdPリストを更新する必要があります。
Note
Windows環境はモバイルとは異なり、ゲストログインをサポートしていません。したがって、IdPが1つだけ同期されている状態でDisconnect APIを呼び出そうとすると、AuthV4LastProviderCantDisconnectがResult API Codeとして返され、同期状態が維持されます。
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:
// プロバイダーの切断に成功しました
break;
default:
// その他の例外状況
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リファレンス: com .hive.AuthV4.Helper.disconnect
API リファレンス: .disconnect
APIリファレンス: HIVEAuthV4Helper ::disconnect:handler:
ゲームスタジオは、IdP切断を実装する際に以下のポリシーから選択できます。 1. すべてのIdPアカウントのリンクを解除し、ゲストアカウントの使用を許可する。 2. 少なくとも1つのIdPアカウントをリンクしたままにする。
IdPアカウントからの切断: すべてのIdPアカウントのリンク解除を許可する¶
ゲームスタジオは、ユーザーがすべてのIdPアカウントのリンクを解除し、ゲストアカウントを使用できるようにすることができます。ユーザーがゲストアカウントを使用する場合、そのアカウントはゲームの初期化や再インストールによって失われた場合に回復できません。したがって、ユーザーが最後のIdPリンクを解除しようとする場合、以下のフレーズを使用してゲストユーザーに関するガイダンスをポップアップし、このユーザーがリンク解除を再考できるようにします。なお、PlayerIDは、対応するIdPがリンク解除されてもログアウトされることはありません。
- 最後の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から切断された後、ゲストアカウントになる場合
言語 | フレーズ |
---|---|
韓国語 | ゲスト状態に切り替えられました。アカウントを連携させることで、ゲームデータを安全に保つことができます。 |
英語 | あなたはゲストアカウントに転送されました。アカウントを同期することで、ゲームデータを保護できます。 |
日本語 | ゲストアカウントに切り替わりました。 アカウントを連動することでゲームデータを守ることができます。 |
中国語(簡体字) | 已转换为游客状态。 关联账号时,有助于保护游戏数据。 |
中国語(繁体字) | 已切換為訪客帳號。 請綁定帳號,保護您的遊戲數據。 |
フランス語 | Vous êtes passé en compte ""invité"". En liant votre compte, vous pourrez garantir la protection de vos données de jeu. |
ドイツ語 | Dein Konto wurde in ein Gastkonto umgewandelt. Du kannst deine Spieldaten sichern, indem du dein Konto synchronisierst. |
ロシア語 | Ваш аккаунт был преобразован в гостевой. Синхронизовав аккаунт, Вы можете защитить свои игровые данные. |
スペイン語 | Has cambiado a la cuenta de invitado. Al vincular tu cuenta, podrás garantizar la protección de los datos de tu juego. |
ポルトガル語 | Você foi transferido para uma conta de convidado. Ao sincronizar a sua conta, você pode proteger os dados do seu jogo. |
インドネシア語 | Statusmu telah diubah menjadi guest. Dengan mensinkronisasikan akun, kamu bisa menjaga data permainanmu agar tetap aman. |
ベトナム語 | 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. |
タイ語 | บัญชีคุณย้อนกลับไปเป็นบัญชี Guest แล้ว คุณสามารถรักษาข้อมูลเกมของคุณให้ปลอดภัยด้วยการซิงค์บัญชีของคุณ |
イタリア語 | Sei stato/a trasferito/a a un account ospite. Sincronizzando il tuo account, puoi proteggere i tuoi dati di gioco. |
トルコ語 | Hesabınız misafir hesap olarak değiştirildi. Hesabınızı bağlayarak oyun verilerinizi güvende tutabilirsiniz. |
アラビア語 | لقد تم نقلك إلى حساب ضيف. من خلال مزامنة حسابك ، يمكنك تأمين سجلات لعبتك . |
IdPアカウントからの切断: 1つ以上のリンクされたアカウントを維持する¶
ゲームスタジオは、ユーザーに少なくとも1つのIdPアカウントをリンクさせることを強制する場合があります。ユーザーがすべてのIdPアカウントのリンクを解除すると、ユーザーアカウントはゲストアカウントに変換され、ゲストアカウントがゲームの初期化や再インストールによって失われた場合、そのアカウントは回復できません。したがって、単一のリンクされたIdPを持つユーザーがそのIdPのリンクを解除しようとした場合、以下のフレーズを使用してこれを制限する通知を実装できます。なお、対応するIdPがリンク解除されても、PlayerIDはログアウトされません。
- 最後のIdPアカウントのリンクを解除したい場合
言語 | フレーズ |
---|---|
韓国語 | 최소 1개의 계정 연동을 유지해야 합니다. |
英語 | You must keep at least 1 of your accounts synced. |
日本語 | 少なくとも1つのアカウントを連動しなければなりません。 |
中国語 (簡体字) | 需要绑定至少1个账号。 |
中国語 (繁体字) | 至少要有1個帳號是綁定的! |
フランス語 | Tu dois garder au moins l'un de tes comptes synchronisés. |
ドイツ語 | Du musst mindestens 1 deiner Konten synchronisieren. |
ロシア語 | Хотя бы 1 из аккаунтов должен быть синхронизирован. |
スペイン語 | Debe de mantener al menos 1 de sus cuentas sincronizada. |
ポルトガル語 | É necessário sincronizar pelo menos 1 das suas contas. |
インドネシア語 | Kamu harus punya paling tidak satu akun yang terhubung. |
ベトナム語 | Bạn cần phải duy trì ít nhất 1 liên kết tài khoản. |
タイ語 | ต้องซิงค์บัญชีอย่างหน่อย 1 บัญชี |
イタリア語 | Devi mantenere almeno 1 dei tuoi account sincronizzato. |
トルコ語 | En az 1 hesabınızı senkronize etmeniz gerekmektedir. |
アラビア語 | يجب أن تحتفظ على الأقل بحساب واحد متزامن من بين حساباتك。 |
カスタム 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.connectWithAuthKeyauthKey, (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同期。
[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切断部分のNOTEを参照してください。
以下の例コードは、カスタムIdPの切断を実装する方法を示しています。
IdPおよびゲストアカウントの削除¶
ユーザーがゲーム内でアカウントを削除できるように、UIを設定する必要があります。
Warning
2022年6月30日以降、アカウント作成をサポートするApp Storeに提出されたアプリは、ユーザーがアプリ内でアカウントの削除を開始できるようにする必要があります。アプリを更新する場合やアカウント作成機能を持つ新しいアプリを提出する場合は、レビューの遅延を防ぐためにアカウント削除APIを実装することが必要です。アプリの削除に関する詳細は、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 Reference: AuthV4.playerDelete
API リファレンス: AuthV4.INSTANCE.playerDelete
APIリファレンス: AuthV4Interface.helper().playerDelete
ユーザーがゲームタイトル画面を見ると、IdPリストを表示してこのユーザーがログインできるようにします(Hive プラットフォームが提供するログインUIを使用しない場合は、ゲーム特有のログインUIを表示してください)。
ポップアップメッセージ¶
アカウント削除の確認ポップアップメッセージ¶
アカウント削除の確認ポップアップウィンドウに表示されるテキストは、ユーザーがアカウントを削除する手続きを進めるときに次のようになります。
言語 | Android | iOS |
---|---|---|
韓国語 | 계정을 삭제할 경우 연결된 데이터는 삭제됩니다. 일부 게임 데이터 삭제는 최대 90일의 시간이 소요될 수 있습니다. * 결제 관련 문의는 [Company Name] 고객센터로 연락바랍니다. | 계정을 삭제할 경우 연결된 데이터는 삭제됩니다. 일부 게임 데이터 삭제는 최대 90일의 시간이 소요될 수 있습니다. * 결제 관련 문의는 앱스토어 또는 [Company Name] 고객센터로 연락바랍니다. |
英語 | アカウントを削除すると連動データも削除されます。 一部ゲームデータの削除には時間がかかる場合があります。(最大90日) *決済に関するお問い合わせは[Company Name]サポートセンターにご連絡ください。 | アカウントを削除すると連動データも削除されます。 一部ゲームデータの削除には時間がかかる場合があります。(最大90日) *決済に関してはApp Storeまたは[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日かかる場合があります。 * 支払いに関するお問い合わせは、[Company Name]のカスタマーサポートにご連絡ください。 | 接続されたデータはアカウントを削除すると削除されます。ゲームデータの削除には最大90日かかる場合があります。 * 支払いに関するお問い合わせは、[Company Name]またはApp Storeにご連絡ください。 |
イタリア語 | アカウントを削除すると、関連するデータも削除されます。ゲームデータの削除には最大90日かかる場合があります。 * 支払いに関するリクエストについては、[Company Name]のカスタマーサポートにお問い合わせください。 | "アカウントを削除すると、関連するデータも削除されます。ゲームデータの削除には最大90日かかる場合があります。 * 支払いに関するリクエストについては、App Storeまたは[Company Name]のカスタマーサポートにお問い合わせください。 |
トルコ語 | Hesabı sildiğinizde bağlantılı veriler silinecektir. Bazı oyun verilerinin silinmesi 90 gün kadar sürebilir. * Ödemeyle ilgili sorularınız için lütfen [Company Name] Müşteri Desteği ile iletişime geçin. | Hesabı sildiğinizde bağlantılı veriler silinecektir. Bazı oyun verilerinin silinmesi 90 gün kadar sürebilir. * Ödemeyle ilgili sorularınız için lütfen App Store ya da [Company Name] Müşteri Desteği ile iletişime geçin。 |
アラビア語 | سيتم حذف البيانات المرتبطة عند حذف الحساب. قد يستغرق حذف بعض بيانات اللعبة ما يصل إلى ٩٠ يومًا. * يرجى الاتصال بمركز دعم عملاء [Company Name] لأي استفسارات متعلقة بالدفع. | سيتم حذف البيانات المرتبطة عند حذف الحساب. قد يستغرق حذف بعض بيانات اللعبة ما يصل إلى ٩٠ يومًا. * يرجى الاتصال بمتجر التطبيقات أو مركز دعم عملاء [Company Name] لأي استفسارات متعلقة بالدفع. |
Note
あなたのゲーム会社のカスタマーサービスセンターの名前を**[Company Name]**に入力してください。
サブスクリプションを提供するゲームは、アカウント削除を確認するポップアップメッセージに「アカウントを削除しても自動的にサブスクリプションが課金され続けるため、手動での解約が必要です。」というフレーズ(および他の言語のための次の表のフレーズ)を追加する必要があります。
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. |
アラビア語 | فشل حذف الحساب. يرجى إعادة المحاولة في وقت لاحق. |