ログイン・ログアウト
ログイン ログアウト¶
Note
- ヘルパーはSDK v4.7.0で提供されています。SDK 4.7.0以前を使用するには、このページを参照してください。
- AuthV4.Helperに関する詳細は、Authenticationページを参照してください。
ログイン¶
認証におけるログインは、以下のステップで構成されています。
Authv4Helperはログインプロセスの一部を実行し、レスポンスに基づいて適切なページを示します。
ログイン機能を実装するために、以下のノートを参照してください。
Note
Appleは、iOSエンタープライズビルドにおいてApple Game Centerおよびアプリ内購入をサポートしていません。したがって、iOSエンタープライズビルドでApple Game Centerアカウントを使用した暗黙のログインは利用できず、明示的なログインの状態でApple Game Centerを使用することもできません。
Note
-
Google Buildの対象が13歳未満の子供の場合、暗黙のログインは利用できません。これは、Google Play Games Servicesが適用できないためです。詳細については、Google Play Games Servicesの品質チェックリストを参照してください。
-
ユーザーがゲームに初めてサインインしたときのみ、Google Play Gamesによる暗黙のログインを処理するようにしてください。詳細については、Google開発者ガイドの1.5 プレイヤーがサインインを拒否した場合を記憶するを参照してください。
Note
- 中国では、Androidでの暗黙のログインは利用できません。なぜなら、Google Play Gamesは国内で禁止されているからです。
- Facebookは中国で利用できないため、IdPリストには含まれていません。
- ユーザーが中国のIPでゲームにアクセスした場合、認可されたメンバーのみがゲーム内通貨をチャージしたりアイテムを購入したりできます(2017年5月1日から開始)。したがって、中国のIPでは、ゲストログインはログイン可能なIdPリストから除外されています。
Note
iOSは、Apple Game Centerへのサインインがキャンセルされたときにログイン画面を表示しません。したがって、通知フレーズは、SDKから直接またはゲームスタジオによってAuthV4Helper
クラスのshowGameCenterLoginCancelDialog()
メソッドを実装することで表示できます。AuthV4.signIn(AuthV4.ProviderType.APPLE, ...)
のコールバック結果とAuthV4.connect(AuthV4.ProviderType.APPLE, ...)
のコールバック結果がキャンセルの場合、Game Centerサインイン無効の通知フレーズが利用可能です。ユーザーがGame Centerアカウントと再度同期する方法を案内するフレーズを提供してください。
Note
Apple IDでのサインインをユーザーのデバイスで行わずにAppleでのサインインを試みると、AuthV4SignInAppleUnknownエラーがAuthV4Helperクラスのconnect()
およびsignIn()
メソッドを呼び出す際に発生します。この場合、Apple IDでのサインインのための通知ポップアップが自動的に表示されるため、ゲームスタジオは何も呼び出す必要がありません。
自動ログインと暗黙のログイン¶
自動ログイン¶
インプリシットログインは、ユーザーがログイン手段を選択せずに、iOSのApple Game CenterアカウントまたはAndroidのGoogle Play Gamesアカウントに自動的にログインする方法です。自動ログインに失敗した後に実行されるインプリシットログインを実装します。
オフラインモード¶
Hive SDK v4 23.1.0 以上は、ユーザーのデバイスがネットワークに接続されていない場合でも、自動ログイン機能(AuthV4.signIn
を使用したProviderType.AUTO
、またはAuthV4.Helper.signIn
)を提供します。オフラインモードを使用するには、以下の指示に従ってください:
-
アプリは少なくとも一度オンラインモードで実行され、明示的、暗黙的、ゲスト、またはカスタムログインが成功し、その結果、
playerId
とplayerToken
が発行される必要があります。
アプリ開発者の観点からは、オンライン状態でAuthV4.Helper.signIn
、AuthV4.showSignIn
、またはAuthV4.signInWithAuthKey
の少なくとも一回の成功した実行があり、コールバックを通じてplayerId
とplayerToken
を受信している必要があります。ユーザーの観点からは、デバイスがネットワークに接続されている間にアプリに少なくとも一度成功裏にログインしている必要があります。ただし、ユーザーのアカウントがオンラインモードでの最後のログイン試行中に一時停止または制限されていた場合、オフラインモードでログインすることはできません。 -
Hive コンソールのアプリセンター > プロジェクト管理 > ゲーム詳細 > Hive 製品設定でオフラインモードを有効にします。
Windowsでの自動ログイン¶
Windows環境では自動ログインがサポートされており、Hive コンソールアプリセンターで有効/無効を切り替えることができます。Windowsの自動ログインは、モバイル環境の自動ログインとは異なる動作をします。違いは次のとおりです:
- モバイル環境では、ユーザーは自動ログインによってログイン状態が維持されますが、Windowsでは「ログイン状態を保持する」チェックボックスを有効にした場合のみ保持されます(ログインUIのIdPリストの下に表示されます)。他の状況では、ログイン状態は継続しません。
- モバイル環境では、AuthV4Helper.Connectを実行して別のアカウントに切り替えると、新しくログインしたアカウントも自動ログインによってログイン状態が維持されますが、Windowsではそうではありません。
インプリシットログイン¶
AuthV4.Helper.signIn
は、PlayerIDの認証トークンキーを使用して自動ログインを試みます。前回のログインから生成されたトークンキーが存在しない場合、ゲームはiOS用のApple Game CenterおよびAndroid用のGoogle Play Gamesに自動的にサインインします。サインインに失敗した場合、応答に応じた適切なログインページが表示されます。
Note
AuthV4Helper クラスを実装する場合、
- ユーザーがゲームをロード中にPGSへの暗黙のログインをキャンセルした場合、システムはその状態を記憶し、再度暗黙のログインを試みません。プレイヤーセッションが有効な間に自動ログインが可能であっても、システムは拒否された状態を記憶します。
この内容はGoogle Playゲームサービスガイドに準拠しています。
自動ログインを実行するためのサンプルコードは以下の通りです。
APIリファレンス: hive.AuthV4.Helper.signIn
// Hive SDKログインを試みる (signIn)
AuthV4.Helper.signIn (delegate (ResultAPI result, AuthV4.PlayerInfo playerInfo) {
if (result.isSuccess()) {
// ログイン成功
} else if (result.needExit()) {
// TODO: アプリ終了機能を実装する
// 例) Application.Quit();
} else {
switch(result.code) {
case ResultAPI.Code.AuthV4ConflictPlayer:
// アカウントの競合
break;
case ResultAPI.Code.AuthV4HelperImplifiedLoginFail:
// 暗黙のログインに失敗しました
// 例) AuthV4.showSignIn(...);
break;
default:
// その他の例外
break;
}
}
});
#include "HiveAuthV4.h"
// Hive SDKログイン(サインイン)を試みる
FHiveAuthV4::Helper::SignIn(FHiveAuthV4HelperDelegate::CreateLambda([this](const FHiveResultAPI& Result, const TOptional<FHivePlayerInfo>& PlayerInfo) {
if (Result.IsSuccess()) {
//ログイン成功
} else if (Result.NeedExit()) {
// TODO: アプリ終了機能を実装する
// Cocos2d-xエンジンのユーザー
// 例) exit(0);
// Unrealエンジンのユーザー
// 例) UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit, false);
} else {
switch (Result.Code) {
case FHiveResultAPI::ECode::AuthV4ConflictPlayer:
// アカウントの競合
break;
case FHiveResultAPI::ECode::AuthV4HelperImplifiedLoginFail:
// 暗黙のログイン失敗
// 例) AuthV4.showSignIn(...);)
break;
default:
// その他の例外
break;
}
}
}));
APIリファレンス: Auth4::signIn
// Attempt Hive SDK login (signIn)
AuthV4::Helper::signIn([=](ResultAPI const & result, std::shared\_ptr playerInfo) {
if (result.isSuccess()) {
// ログイン成功
} else if (result.needExit()) {
// TODO: アプリ終了機能を実装
// Cocos2d-xエンジンのユーザー
// ex) exit(0);
// Unrealエンジンのユーザー
// 例) UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit, false);
} else {
switch(result.code) {
case ResultAPI::AuthV4ConflictPlayer:
// アカウントの競合
break;
case ResultAPI::AuthV4HelperImplifiedLoginFail:
// 暗黙のログイン失敗
// ex) AuthV4.showSignIn(...);
break;
default:
break;
}
}
});
APIリファレンス: com.hive.Auth4.Helper.signIn
// Attempt Hive SDK login (signIn)
AuthV4.Helper.signIn(object : AuthV4.Helper.AuthV4HelperListener {
override fun onAuthV4Helper(result: ResultAPI, playerInfo: AuthV4.PlayerInfo?) {
if (result.isSuccess) {
// log-in succeed
} else if (result.needExit()) {
// TODO: implement app exit functionality
// ex) exitProcess(0)
} else {
when (result.code) {
ResultAPI.Code.AuthV4ConflictPlayer -> {
// account conflict
}
ResultAPI.Code.AuthV4HelperImplifiedLoginFail -> {
// implicit login failed
// ex) AuthV4.showSignIn(...);
}
else -> {
// other exceptions
}
}
}
}
})
APIリファレンス: com.hive.Auth4.signIn
// Attempt Hive SDK login (signIn)
AuthV4.Helper.signIn(new AuthV4.Helper.AuthV4HelperListener() {
@Override
public void onAuthV4Helper(ResultAPI result, AuthV4.PlayerInfo playerInfo) {
if (result.isSuccess()) {
// ログイン成功
} else if (result.needExit()) {
// TODO: アプリ終了機能を実装する
// 例) System.exit(0);
} else {
switch(result.code) {
case AuthV4ConflictPlayer:
// アカウントの競合
break;
case AuthV4HelperImplifiedLoginFail:
// 暗黙のログイン失敗
// 例) AuthV4.showSignIn(...);
break;
default:
// その他の例外
break;
}
}
}
});
APIリファレンス: AuthV4Interface.signIn
// Attempt Hive SDK ログイン (signIn)
AuthV4Interface.helper().signIn() { (result, playerInfo) in
if result.isSuccess() {
// ログイン成功
}
else if result.needExit() {
// TODO: アプリ終了機能を実装する
// ex) exit(0)
}
else {
switch result.getCode() {
case .authV4ConflictPlayer:
// アカウントの競合
case .authV4HelperImplifiedLoginFail:
// 暗黙のログイン失敗
// ex) AuthV4Interface.showSignIn() { (result, playerInfo)
// // 何かをする...
// }
default:
// その他の例外
break
}
}
}
APIリファレンス: HIVEAuth4:signIn
// Attempt Hive SDK login (signIn)
[[HIVEAuthV4 helper] signIn:^(HIVEResultAPI *result, HIVEPlayerInfo *playerInfo) {
if (result. isSuccess) {
// ログイン成功
}
else if (result. needExit) {
// TODO: アプリ終了機能を実装する
// ex) exit(0);
}
else {
switch(result.code) {
case kAuthV4ConflictPlayer:
// アカウントの競合
break;
case kAuthV4HelperImplifiedLoginFail:
// 暗黙のログイン失敗
// ex) [HIVEAuthV4 showSignIn:^(HIVEResultAPI *result, HIVEPlayerInfo *playerInfo) {
// // 何かをする...
// }];
break;
default:
// その他の例外
break;
}
}
}];
インプリシットログインの動作: モバイル¶
モバイルプラットフォーム(Hive SDK Unity Androidなど、Android/iOS)では、暗黙のログイン(AuthV4.Helper.signIn
)がアカウントの競合を引き起こし、初回ログイン後に最後にログインしたアカウントでログインするかどうかを尋ねるダイアログをユーザーに表示します。
暗黙のログイン動作: PC¶
PCプラットフォーム(Hive SDK Unity Windowsなど、Windows)では、暗黙のログイン(AuthV4.Helper.signIn
)が初回ログイン後に最後にログインしたアカウントで自動的にログインし、アカウントの競合を引き起こすことはありません。
明示的なログイン¶
明示的ログインとは、ユーザーが認証を進めるためにIdPを選択するプロセスを意味します。プレイヤーが自動ログインと暗黙のログインの両方を実行できなかった場合、ゲームを実装してプレイヤーをゲームタイトル画面に移動させ、タイトルをタップしたときに明示的ログインを実行させます。
明示的ログインは、認証に使用されるHive SDKを初期化した後に返されるIdPリストを使用して、Hive SDKによって提供されるUIまたはゲーム内でカスタマイズされたUIで構成されています。UIをカスタマイズする場合は、明示的ログインUIのカスタマイズを参照してください。
Hive プラットフォームは、各国のポリシーに従ってIdPリストを制御および提供します。例えば、Google Play Games、Facebook、ゲストログインは中国では利用できません。
明示的なログインの例画面¶
Hive SDKによって提供されたUIで関数を実装する際¶
Hive SDKが提供するUIを使用して明示的なログインを実装するには、showSignIn()
メソッドを呼び出してIdPリストUIを表示できます。
Note
ユーザーがSDKによって提供されたIdP選択UIでXボタンをタップして閉じた後、再度サインインする方法を提供することを確認してください。ユーザーはまだログインしていません。
Note
明示的なログインをカスタマイズしたい場合は、こちらを参照してください。
APIリファレンス: hive.AuthV4.showSignIn
<code>
// リクエスト Hive SDK AuthV4 認証 UI
AuthV4.showSignIn((ResultAPI result, AuthV4.PlayerInfo playerInfo)=>{
if (result.isSuccess()) {
// 認証成功
// playerInfo : 認証されたユーザー情報
// メール情報を取得する例
foreach (KeyValuePair<AuthV4.ProviderType, AuthV4.ProviderInfo> entry in playerInfo.providerInfoData) {
AuthV4.ProviderInfo providerInfo = entry.Value;
if(providerInfo.providerEmail != null && providerInfo.providerEmail != "") {
string email = providerInfo.providerEmail;
break;
}
}
}
else if (result.needExit()) {
// TODO: アプリの終了を実装する
// 例) Application.Quit();
}
});
#include "HiveAuthV4.h"
// リクエスト Hive SDK AuthV4 認証 UI
FHiveAuthV4::ShowSignIn(FHiveAuthV4OnSignInDelegate::CreateLambda([this](const FHiveResultAPI& Result, const FHivePlayerInfo& PlayerInfo) {
if (Result.IsSuccess()) {
// 認証成功
// メール情報を取得する例
for (const auto& ProviderInfoEntry : PlayerInfo.ProviderInfoData) {
FHiveProviderInfo ProviderInfo = ProviderInfoEntry.Value;
FString Email = ProviderInfo.ProviderEmail;
}
} else if (Result.NeedExit()) {
// TODO: アプリの終了を実装する
// Cocos2d-xエンジンのユーザー
// 例) exit(0);
// Unrealエンジンのユーザー
// 例) UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit, false);
}
}));
APIリファレンス: AuthV4::showSignIn
// リクエスト Hive SDK AuthV4 認証 UI
AuthV4::showSignIn([=](ResultAPI const & result, PlayerInfo const & playerInfo) {
if (result.isSuccess()) {
// 認証成功
// playerInfo: 認証されたユーザー情報
// メール情報を取得する例
for(auto it = playerInfo.providerInfoData.begin(); it != playerInfo.providerInfoData.end(); ++it) {
hive::ProviderInfo providerInfo = it->second;
if(!providerInfo.providerEmail.empty()) {
std::string email = providerInfo.providerEmail;
break;
}
}
}
else if (result.needExit()) {
// TODO: アプリの終了を実装する
// Cocos2d-x エンジンのユーザー
// 例) exit(0);
// Unreal エンジンのユーザー
// 例) UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit, false);
}
});
APIリファレンス: com.hive.AuthV4.showSignIn
// リクエスト Hive SDK AuthV4 認証 UI
AuthV4.showSignIn(object : AuthV4.AuthV4SignInListener {
override fun onAuthV4SignIn(result: ResultAPI, playerInfo: AuthV4.PlayerInfo?) {
if (result.isSuccess) {
// 認証成功
// playerInfo: 認証されたユーザー情報
// メール情報を取得する例
playerInfo?.let {
for ((key, value) in it.providerInfoData) {
var providerInfo: AuthV4.ProviderInfo = value
if(providerInfo.providerEmail.isNotEmpty()) {
val email = providerInfo.providerEmail
break
}
}
}
} else if (result.needExit()) {
// TODO: アプリの終了を実装
// 例) exitProcess(0)
}
}
})
APIリファレンス: com.hive.AuthV4.showSignIn
// リクエスト Hive SDK AuthV4 認証 UI
AuthV4.showSignIn(new AuthV4.AuthV4SignInListener() {
@Override
public void onAuthV4SignIn(ResultAPI result, AuthV4.PlayerInfo playerInfo) {
if (result.isSuccess()) {
// 認証成功
// playerInfo: 認証されたユーザー情報
// メール情報を取得する例
if(playerInfo != null) {
for (Map.Entry<AuthV4.ProviderType, AuthV4.ProviderInfo> entry : playerInfo.getProviderInfoData().entrySet()) {
AuthV4.ProviderInfo providerInfo = entry.getValue();
if (providerInfo.getProviderEmail() != "") {
String email = providerInfo.getProviderEmail();
break;
}
}
}
}
else if (result.needExit()) {
// TODO: アプリの終了を実装する
// 例) System.exit(0);
}
}
});
APIリファレンス: HIVEAuthV4:showSignIn
var email = String()
// リクエスト Hive SDK AuthV4 認証 UI
AuthV4Interface.showSignIn { (result, playerInfo) in
if result.isSuccess() {
// 認証成功
// playerInfo: 認証されたユーザー情報
// メール情報を取得する例
if let playerInfo = playerInfo {
// providerEmailが存在するproviderInfoを見つける(現在のサインインのプロバイダー)
for key in playerInfo.providerInfoData.keys {
if let providerInfo = playerInfo.providerInfoData[key],
providerInfo.providerEmail.count > 0 {
// providerEmail != ""
email = providerInfo.providerEmail
break
}
}
}
} else if result.needExit() {
// TODO: アプリの終了を実装する
// 例) exit(0)
}
}
API リファレンス: HIVEAuthV4:showSignIn
__block NSString* email = @"";
// リクエスト Hive SDK AuthV4 認証 UI
[HIVEAuthV4 showSignIn:^(HIVEResultAPI *result, HIVEPlayerInfo *playerInfo) {
if([result isSuccess]){
// 認証成功
// playerInfo: 認証されたユーザー情報
// メール情報を取得する例
if(playerInfo != nil) {
// providerEmail が存在する providerInfo を見つける (現在のサインインのプロバイダー)
for (NSString* key in playerInfo.providerInfoData.allKeys) {
HIVEProviderInfo* providerInfo = playerInfo.providerInfoData[key];
if (providerInfo != nil && providerInfo.providerEmail.length > 0) {
// providerEmail != ""
email = providerInfo.providerEmail;
break;
}
}
}
} else if ([result needExit]) {
// TODO: アプリの終了を実装
// 例) exit(0);
}
}];
明示的なログインUIのカスタマイズ¶
明示的なログインのためにカスタマイズされたUIを実装するには、AuthV4.setup()
メソッドのコールバックハンドラーとして返されるproviderTypeList
を使用します。このメソッドはHive SDKの初期化のために呼び出されます。または、Hive SDKの初期化後に呼び出されるAuthV4.Helper.getIDPList()
メソッドを使用します。明示的なログインUIのカスタマイズは、ゲームUIに応じてログイン画面を表示したり、特定のIdPとのリンクオプションを表示したりする場合に使用されます。UIを設計した後、ユーザーのアクションに応じて希望するProviderTypeでsignIn()
メソッドを呼び出します。
Note
- ログインボタンを作成する際は、各IdPが提供するデザインガイドを参照してログインボタンを作成する必要があります。
- ゲームセンター: 追加のガイドラインはありません
- Google Play Games: ブランドガイドライン
- Google: ブランドガイドライン
- Hive メンバーシップ: Hive BIガイドライン
- Facebook: ブランドリソースセンター
- QQ: ポリシーと規制
- WeChat: 主要ブランドとガイドライン
- VK: VKブランドブック
- Apple: ヒューマンインターフェースガイドライン
- LINE: LINEログインボタンデザインガイドライン
- Huawei: HUAWEI IDアイコン仕様
- Google Playストアでゲームを特集するには、Googleサインインボタンガイドに従う必要があります。
- 認証に適用される多言語ログインボタン名については、こちらをクリックしてください。
- サインインページにFacebook同期ボタンのみを表示する例のUI
以下は、ユーザーがカスタマイズされた明示的ログインUIでGoogleサインインを選択した場合のサンプルコードです。
APIリファレンス: hive.AuthV4.signIn
using hive;
AuthV4.signIn(AuthV4.ProviderType.GOOGLE, (ResultAPI result, AuthV4.PlayerInfo playerInfo) => {
if (result.isSuccess()) {
// 成功した呼び出し
// playerInfo: 認証されたユーザー情報。
// ProviderType.GOOGLEのメール情報検索の例
Dictionary<AuthV4.ProviderType, AuthV4.ProviderInfo> providerInfoData = playerInfo.providerInfoData;
AuthV4.ProviderInfo providerInfo = providerInfoData[AuthV4.ProviderType.GOOGLE];
string email = providerInfo.providerEmail;
}
});
#include "HiveAuthV4.h"
FHiveAuthV4::SignIn(EHiveProviderType::GOOGLE,
FHiveAuthV4OnSignInDelegate::CreateLambda([this](const FHiveResultAPI& Result, const FHivePlayerInfo& PlayerInfo) {
if (Result.IsSuccess()) {
// 成功した呼び出し
// playerInfo: 認証されたユーザー情報。
// ProviderType::GOOGLEのためのメール情報検索の例
TMap<EHiveProviderType, FHiveProviderInfo> ProviderInfoData = PlayerInfo.ProviderInfoData;
if (const FHiveProviderInfo* ProviderInfo = ProviderInfoData.Find(EHiveProviderType::GOOGLE)) {
FString Email = ProviderInfo->ProviderEmail;
}
}
}));
APIリファレンス: Auth4::signIn
#include <HIVE_SDK_Plugin/HIVE_CPP.h>
AuthV4::signIn(ProviderType::GOOGLE, [=](ResultAPI const & result, PlayerInfo const & playerInfo) {
if (result.isSuccess()) {
// call successful
// playerInfo: Authenticated user information.
// ProviderType::GOOGLEのためのメール情報検索の例
map<ProviderType, ProviderInfo> providerInfoData = playerInfo.providerInfoData;
ProviderInfo providerInfo = providerInfoData[ProviderType::GOOGLE];
string email = providerInfo.providerEmail;
}
});
APIリファレンス: AuthV4.signIn
import com.hive.AuthV4
import com.hive.ResultAPI
AuthV4.signIn(AuthV4.ProviderType.GOOGLE, object : AuthV4.AuthV4SignInListener {
override fun onAuthV4SignIn(result: ResultAPI, playerInfo: AuthV4.PlayerInfo?) {
if (result.isSuccess) {
// 成功した場合の呼び出し
// playerInfo: 認証されたユーザー情報
// ProviderType.GOOGLEのメール情報検索の例
if (playerInfo != null) {
val providerInfoData = playerInfo.providerInfoData
val providerInfo = providerInfoData[AuthV4.ProviderType.GOOGLE]
if (providerInfo != null) {
val email = providerInfo.providerEmail
}
}
}
}
})
APIリファレンス: com.hive.Auth4.signIn
import com.hive.AuthV4;
import com.hive.ResultAPI;
AuthV4.INSTANCE.signIn(AuthV4.ProviderType.GOOGLE, (result, playerInfo) -> {
if (result.isSuccess()) {
// 成功した呼び出し
// playerInfo: 認証されたユーザー情報
// ProviderType.GOOGLEのメール情報検索の例
if (playerInfo != null) {
HashMap<AuthV4.ProviderType, AuthV4.ProviderInfo> providerInfoData = playerInfo.getProviderInfoData();
AuthV4.ProviderInfo providerInfo = providerInfoData.get(AuthV4.ProviderType.GOOGLE);
if (providerInfo != null) {
String email = providerInfo.getProviderEmail();
}
}
}
});
API リファレンス: AuthV4Interface.signIn
import HIVEService
AuthV4Interface.signIn(.Google) { result, playerInfo in
if result.isSuccess() {
// call successful
// playerInfo: Authenticated user information
// プロバイダータイプ::GOOGLE のためのメール情報検索の例
if
let playerInfo = playerInfo,
let providerInfo = playerInfo.providerInfoData["GOOGLE"] {
let email = providerInfo.providerEmail
}
}
}
APIリファレンス: HIVEAuth4:signIn
#import <HIVEService/HIVEService-Swift.h>
[HIVEAuthV4 signIn:HIVEProviderTypeGoogle handler:^(HIVEResultAPI *result, HIVEPlayerInfo *playerInfo) {
if ([result isSuccess]){
// call successful
// playerInfo: Authenticated user information.
// HIVEProviderTypeGoogleによるメール情報検索の例
if(playerInfo != nil) {
HIVEProviderInfo *providerInfo = playerInfo.providerInfoData[@"GOOGLE"];
if(providerInfo != nil){
NSString *email = providerInfo.providerEmail;
}
}
}
}];
デバイス上のログイン済みIdPアカウントを確認する¶
自動ログインは、登録されたplayerId
のトークンキーを使用してサインインするために利用可能であり、さまざまなIdPを使用した明示的なログインも同様です。これらの2つのケースの場合、ユーザーのデバイスにログインしているIdPアカウント(DevicePlayer)が、ユーザーがログインしているPlayerIDのIdPと不一致になる可能性があります。実績やリーダーボードの使用を考慮し、2つのアカウントを一致させるための通知ページがユーザーに提供されています。
以下はIdP情報を確認するためのサンプルコードです。
APIリファレンス: AuthV4.Helper.syncAccount
```cs using hive;
AuthV4.ProviderType providerType = AuthV4.ProviderType.GOOGLE;
AuthV4.Helper.syncAccount (providerType, delegate (ResultAPI result, AuthV4.PlayerInfo playerInfo) {
switch (result.code) {
case ResultAPI.Code.Success:
// 通常
break;
case ResultAPI.Code.AuthV4ConflictPlayer:
// アカウントの競合
// 例) Hive UIを使用しているとき
// AuthV4.Helper.showConflict(...);
//または
// 例) GameUIを実装しているとき
// AuthV4.Helper.resolverConflict(...);// 現在のユーザーを選択するとき
// AuthV4.Helper.switchAccount(...);// ユーザー切り替えを選択するとき
break;
default:
// その他の例外状況
break;
}
});
```
#include "HiveAuthV4.h"
FHiveAuthV4::Helper::SyncAccount(ProviderType, FHiveAuthV4HelperDelegate::CreateLambda([this](const FHiveResultAPI& Result, const TOptional<FHivePlayerInfo>& PlayerInfo) {
switch (Result.Code) {
case FHiveResultAPI::ECode::Success:
// normal
break;
case FHiveResultAPI::ECode::AuthV4ConflictPlayer:
// アカウントの競合
// 例) Hive UIを使用しているとき
// AuthV4::Helper::showConflict(...);
//または
// 例) GameUIを実装しているとき
// AuthV4::Helper::resolverConflict(...);// 現在のユーザーを選択するとき
// AuthV4::Helper::switchAccount(...);// ユーザーを切り替えるときが選択されている
break;
default:
// その他の例外状況
break;
}
}));
APIリファレンス: AuthV4 ::Helper::syncAccount
#include <HIVE_SDK_Plugin/HIVE_CPP.h>
using namespace std;
using namespace hive;
ProviderType providerType = ProviderType::GOOGLE;
AuthV4::Helper::syncAccount(providerType, [=](ResultAPI const & result, shared_ptr<PlayerInfo> playerInfo) {
switch (result.code) {
case ResultAPI::Success:
// normal
break;
case ResultAPI::AuthV4ConflictPlayer:
// アカウントの競合
// 例) Hive UIを使用しているとき
// AuthV4::Helper::showConflict(...);
//または
// 例) GameUIを実装しているとき
// AuthV4::Helper::resolverConflict(...);// 現在のユーザーを選択するとき
// AuthV4::Helper::switchAccount(...);// ユーザーの切り替えが選択されているとき
break;
default:
// その他の例外状況
break;
}
});
APIリファレンス: AuthV4.Helper.syncAccount
import com.hive.AuthV4
import com.hive.ResultAPI
val providerType = AuthV4.ProviderType.GOOGLE
AuthV4.Helper.syncAccount(providerType, object : AuthV4.Helper.AuthV4HelperListener {
override fun onAuthV4Helper(result: ResultAPI, playerInfo: AuthV4.PlayerInfo?) {
when (result.code) {
ResultAPI.Code.Success -> {
// normal
}
ResultAPI.Code.AuthV4ConflictPlayer -> {
// アカウントの競合
// 例) Hive UIを使用する場合
// AuthV4.Helper.showConflict(...);
//または
// 例) GameUIを実装する場合
// AuthV4.Helper.resolverConflict(...);// 現在のユーザーを選択する場合
// AuthV4.Helper.switchAccount(...);// ユーザー切り替えを選択する場合
}
else -> {
// その他の例外状況
}
}
}
})
APIリファレンス: AuthV4.Helper.INSTANCE.syncAccount
import com.hive.AuthV4;
import com.hive.ResultAPI;
AuthV4.ProviderType providerType = AuthV4.ProviderType.GOOGLE;
AuthV4.Helper.INSTANCE.syncAccount(providerType, (result, playerInfo) -> {
switch (result.getCode()) {
case Success:
// normal
break;
case AuthV4ConflictPlayer:
// アカウントの競合
// 例) Hive UIを使用しているとき
// AuthV4.Helper.INSTANCE.showConflict(...);
//または
// 例) GameUIを実装しているとき
// AuthV4.Helper.INSTANCE.resolverConflict(...);// 現在のユーザーを選択するとき
// AuthV4.Helper.INSTANCE.switchAccount(...);// ユーザー切り替えを選択するとき
break;
default:
// その他の例外状況
break;
}
});
APIリファレンス: AuthV4Interface.helper().syncAccount
import HIVEService
let providerType: ProviderType = .Google
AuthV4Interface.helper().syncAccount(providerType) { result, playerInfo in
switch result.getCode() {
case .success:
// normal
case .authV4ConflictPlayer:
// アカウントの競合
// 例) Hive UIを使用しているとき
// AuthV4Interface.helper().showConflict(...);
//または
// 例) GameUIを実装しているとき
// AuthV4Interface.helper().resolverConflict(...);// 現在のユーザーを選択するとき
// AuthV4Interface.helper().switchAccount(...);// ユーザー切り替えを選択するとき
default:
// その他の例外状況
break
}
}
APIリファレンス: [ HIVEAuthV4 helper] syncAccount
#import <HIVEService/HIVEService-Swift.h>
HIVEProviderType providerType = HIVEProviderTypeGoogle
[[HIVEAuthV4 helper] syncAccount: providerType handler: ^(HIVEResultAPI *result, HIVEPlayerInfo *playerInfo) {
switch ([result getCode]) {
case HIVEResultAPICodeSuccess:
// normal
break;
case HIVEResultAPICodeAuthV4ConflictPlayer:
// アカウントの競合
// 例) Hive UIを使用している場合
// [[HIVEAuthV4 helper] showConflict: ...];
//または
// 例) GameUIを実装している場合
// [[HIVEAuthV4 helper] resolverConflict:...];// 現在のユーザーを選択する場合
// [[HIVEAuthV4 helper] switchAccount:...];// ユーザー切り替えを選択する場合
break;
default:
// その他の例外状況
break;
}
}];
ゲストログイン¶
Hive SDKは、ユーザーがIdPを選択せずにゲストとしてゲームを使用できるように、ゲストログインをサポートしています。この機能は、Hive SDKが提供する明示的なログインUIからゲストを選択するか、ゲームによってカスタマイズされたUIから選択することで実装できます。Windows環境ではゲストサインインはサポートされていません。
ゲストとしてログインする際は、以下のポリシーに従ってください。
ゲストログインポリシー¶
-
ゲストユーザーとHiveメンバーの両方が平等に利用できるゲームを構築します。
Hive プラットフォームのほとんどの機能はゲストユーザーが利用できます。したがって、ゲストユーザーとIdP接続ユーザーの両方に対して同じようにゲームを実装してください。たとえば、ゲストユーザーもアイテムを購入し、ゲーム内で支払うことができます。
-
ゲストユーザーがサインアウトすることを許可しない。
ゲストとしてログインしたユーザーがログアウトすると、そのユーザーは同じPlayerIDで再度サインインできなくなります。したがって、ユーザーがゲストの状態でサインアウトしないように、ログアウトボタンを提供しないでください。
-
中国IPを使用したゲストログインポリシー。
ユーザーが中国のIPでゲームにアクセスすると、認可されたメンバーのみがゲームマネーをチャージしたりアイテムを購入したりできます(2017年5月1日から開始)。したがって、中国のIPで利用可能なIdPにはゲストログインは含まれていません。
ProviderType.GUEST
をパラメーターとして使用してsignIn()
メソッドを実装し、ゲストログインを実行します。 以下はゲストログインを実行するためのサンプルコードです。
Note
ゲスト状態のPlayerIDは、IdP認証なしではplayerInfoのproviderInfoDataを持っていません。
APIリファレンス: hive.AuthV4.signIn
APIリファレンス: Auth4::signIn
APIリファレンス: AuthV4.signIn
API リファレンス: com.hive.Auth4.signIn
APIリファレンス: AuthV4Interface.signIn
APIリファレンス: HIVEAuth4:signIn
カスタムログイン¶
カスタムログインは、Hive SDKがサポートしていない外部IdPを使用したログインを実装する機能です。Auth V4 カスタム認証ガイドに従って、カスタムログインAPIを呼び出すために使用するauthKeyを作成してください。 カスタムログインでサインインしたユーザーの情報は、カスタムログインAPIのコールバックとして渡されるPlayerInfoオブジェクトを使用してcustomProviderInfoData
にアクセスすることで確認できます。customProviderInfoData
の**ProviderType(enum)**はすべてCUSTOM
に設定されており、**ProviderName(String)**で詳細に識別できます。
- カスタムログインをゲーム内で実装したIdPの情報は、
setup()
およびshowSignIn()
メソッドをAuthV4クラスで呼び出した結果には含まれません。- カスタムログインを最初に実行した後にplayerIdとplayerTokenを取得すると、カスタムログインAPIを再度呼び出すときに
authV4SessionExist(code)
の結果APIがコールバックとして渡されます。この場合、ProviderType.Auto
というパラメータを使用してsignIn()
メソッドを実装し、以前のログインアカウントで自動ログインを実行します。connect()
およびdisconnect()
メソッドは、現在AuthV4クラスのカスタムログインIdPの追加接続および切断をサポートしていません。- カスタムログインのIdPの追加同期または切断は、
connectWithAuthKey()
およびdisconnectWithName()
メソッドでサポートされています。
以下はカスタムログインを実装するためのサンプルコードです。
APIリファレンス: hive.AuthV4.signIn
// ゲーム内で直接実装されたTwitterログイン
Game.Login("CUSTOM_TWITTER", (string authKey) => {
AuthV4.signInWithAuthKey(authKey, (ResultAPI result, PlayerInfo playerInfo) => {
if (result. isSuccess()) {
Dictionary<string, ProviderInfo> customProviderInfoData = playerInfo.customProviderInfoData;
ProviderInfo providerInfo = customProviderInfoData["CUSTOM_TWITTER"];
// 以下のユーザーリンク情報を確認してください
providerInfo. providerType; // ProviderType.CUSTOM、カスタムは固定のタイプを持つため、providerNameで区別する必要があります
providerInfo. providerName; // "CUSTOM_TWITTER"
providerInfo. providerUserId; // 自実装のTwitterログインに使用されるユーザーID
return;
}
else if (result.code == ResultAPI.Code.AuthV4SessionExist) {
// すでにplayerIdとplayerTokenを発行した後に自動的にログインする必要がある場合
// TODO: AuthV4.signIn(ProviderType.AUTO, (ResultAPI _result, PlayerInfo playerInfo) => {});
}
else if (result.code == ResultAPI.Code.AuthV4NotInitialized) {
// TODO: SDKを初期化する必要があります
}
else if (result.code == ResultAPI.Code.AuthV4InvalidParam) {
// TODO: 渡されたauthKeyの値がNULLまたは空であるかどうかを確認する必要があります
}
else if (result. needExit()) {
// TODO: アプリ終了機能を実装する
// 例) Application.Quit();
}
});
});
#include "HiveAuthV4.h"
// ゲーム内で直接実装されたTwitterログイン
void GameLogin(const FString& AuthKey)
{
FHiveAuthV4::SignInWithAuthKey(AuthKey, FHiveAuthV4OnSignInDelegate::CreateLambda([this](const FHiveResultAPI& Result, const FHivePlayerInfo& PlayerInfo) {
if (Result.IsSuccess()) {
TMap<FString, FHiveProviderInfo> CustomProviderInfoData = PlayerInfo.CustomProviderInfoData;
if (const FHiveProviderInfo* ProviderInfo = CustomProviderInfoData.Find(TEXT("CUSTOM_TWITTER"))) {
EHiveProviderType ProviderType = ProviderInfo->ProviderType;// EHiveProviderType::CUSTOM, ProviderType::CUSTOM, customs have a fixed type, so you need to distinguish them by providerName
FString ProviderName = ProviderInfo->ProviderName; // "CUSTOM_TWITTER"
FString ProviderUserId = ProviderInfo->ProviderUserId; // user id used for self-implemented twitter login
}
} else if (Result.NeedExit()) {
// 例) UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit, false);
} else if (Result.Code == FHiveResultAPI::ECode::AuthV4SessionExist) {
// すでにplayerIdとplayerTokenを発行した後に自動的にログインする必要がある場合
// TODO: AuthV4.signIn(ProviderType::AUTO, [=](ResultAPI const & _result, PlayerInfo const & playerInfo) {});
} else if (Result.Code == FHiveResultAPI::ECode::AuthV4NotInitialized) {
// TODO: SDKを初期化する必要があります
} else if (Result.Code == FHiveResultAPI::ECode::AuthV4InvalidParam) {
// TODO: 渡されたauthKeyの値がNULLまたは空であるかどうかを確認する必要があります
}
}));
}
APIリファレンス: Auth4::signIn
using namespace std;
using namespace hive;
// ゲーム内で直接実装されたTwitterログイン
Game::Login("CUSTOM_TWITTER", [=](string authKey) {
AuthV4::signInWithAuthKey(authKey, [=](ResultAPI const & result, PlayerInfo const & playerInfo) {
if (result. isSuccess()) {
map<string, ProviderInfo> customProviderInfoData = playerInfo.customProviderInfoData;
ProviderInfo providerInfo = customProviderInfoData["CUSTOM_TWITTER"];
// 次のユーザーリンク情報を確認してください
providerInfo. providerType; // ProviderType::CUSTOM、カスタムは固定タイプを持つため、providerNameで区別する必要があります
providerInfo. providerName; // "CUSTOM_TWITTER"
providerInfo. providerUserId; // 自己実装されたTwitterログインに使用されるユーザーID
return;
}
else if (result.code == ResultAPI::Code::AuthV4SessionExist) {
// すでにplayerIdとplayerTokenを発行した後に自動的にログインする必要がある場合
// TODO: AuthV4.signIn(ProviderType::AUTO, [=](ResultAPI const & _result, PlayerInfo const & playerInfo) {});
}
else if (result.code == ResultAPI::Code::AuthV4NotInitialized) {
// TODO: SDKを初期化する必要があります
}
else if (result.code == ResultAPI::Code::AuthV4InvalidParam) {
// TODO: 渡されたauthKeyの値がNULLまたは空であるかどうかを確認する必要があります
}
else if (result. needExit()) {
// TODO: アプリ終了機能を実装する
// Cocos2d-xエンジンのユーザー
// 例) exit(0);
// Unrealエンジンのユーザー
// 例) UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit, false);
}
});
});
APIリファレンス: com.hive.Auth4.signIn
// ゲーム内で直接実装されたTwitterログイン
Game.Login("CUSTOM_TWITTER") { authKey: String ->
AuthV4.signInWithAuthKey(authKey, object : AuthV4.AuthV4SignInListener {
override fun onAuthV4SignIn(result: ResultAPI, playerInfo: AuthV4.PlayerInfo?) {
if (result.isSuccess && playerInfo != null) {
playerInfo.customProviderInfoData["CUSTOM_TWITTER"]?.let { providerInfo ->
providerInfo.providerType // ProviderType.CUSTOM, since custom types are fixed, it is necessary to distinguish them by providerName
providerInfo.providerName // "CUSTOM_TWITTER"
providerInfo.providerUserId // user id used for Twitter login
}
}
else if (result. needExit()) {
// TODO: implement app exit functionality
// ex) exitProcess(0)
}
else if (result.code == ResultAPI.Code.AuthV4SessionExist) {
// If you need to log in automatically after having already issued playerId and playerToken
// TODO: AuthV4.signIn(AuthV4.ProviderType.AUTO, authV4SignInListener)
}
else if (result.code == ResultAPI.Code.AuthV4NotInitialized) {
// TODO: need to initialize SDK
}
else if (result.code == ResultAPI.Code.AuthV4InvalidParam) {
// TODO: Need to check whether the passed authKey value is NULL or empty
}
}
})
}
APIリファレンス: com.hive.Auth4.signIn
// ゲーム内で直接実装されたTwitterログイン
Game.Login("CUSTOM_TWITTER") { authKey: String ->
AuthV4.INSTANCE.signInWithAuthKey(authKey, new AuthV4.AuthV4SignInListener() {
@Override
public void onAuthV4SignIn(@NonNull ResultAPI result, @Nullable AuthV4.PlayerInfo playerInfo) {
if(result.isSuccess() && playerInfo != null) {
HashMap<String, AuthV4.ProviderInfo> customProviderInfoData = playerInfo.getCustomProviderInfoData();
AuthV4.ProviderInfo providerInfo = customProviderInfoData.get("CUSTOM_TWITTER");
// 次のユーザーリンク情報を確認します
if (providerInfo != null){
providerInfo.getProviderType(); // AuthV4.ProviderType.CUSTOM、カスタムタイプは固定されているため、providerNameで区別する必要があります
providerInfo.getProviderName(); // "CUSTOM_TWITTER"
providerInfo.getProviderUserId(); // 自作のTwitterログインに使用されるユーザーID
}
} else if (result. needExit()) {
// TODO: アプリ終了機能を実装する
// ex) System.exit(0);
} else if (result.getCode() == ResultAPI.Code.AuthV4SessionExist) {
// すでにplayerIdとplayerTokenを発行した後に自動的にログインする必要がある場合
// TODO: AuthV4.signIn(AuthV4.ProviderType.AUTO, authV4SignInListener)
} else if (result.getCode() == ResultAPI.Code.AuthV4NotInitialized) {
// TODO: SDKを初期化する必要があります
} else if (result.getCode() == ResultAPI.Code.AuthV4InvalidParam) {
// TODO: 渡されたauthKeyの値がNULLまたは空であるかどうかを確認する必要があります
}
}
});
}
APIリファレンス: HIVEAuth4:signIn
swift // ゲーム内で直接実装されたTwitterログイン Game.login("CUSTOM_TWITTER") { (authKey) in AuthV4Interface.signInWithAuthKey(authKey) { (result, playerInfo) in if result. isSuccess() { let customProviderInfoData = playerInfo?.customProviderInfoData; let providerInfo = customProviderInfoData?["CUSTOM_TWITTER"] // 以下のユーザーリンク情報を確認 providerInfo?.providerType; // AuthProviderType、カスタムタイプは固定されているため、providerNameで区別する必要があります providerInfo?.providerName; // "CUSTOM_TWITTER" providerInfo?.providerUserId; // 自実装のTwitterログインに使用されるユーザーID return } else if result.getCode() == .authV4SessionExist { // すでにplayerIdとplayerTokenを発行した後、自動的にログインする必要がある場合 // TODO: AuthV4Interface.signIn(.auto) { (result, playerInfo) in } } else if result.getCode() == .authV4NotInitialized { // TODO: SDKの初期化が必要 } else if result.getCode() == .authV4invalidParam { // TODO: 渡されたauthKeyの値がnilまたは空であるか確認する必要があります } else if result. needExit() { // TODO: アプリのシャットダウン機能を実装します。 // 例) exit(0) } } }
APIリファレンス: HIVEAuth4:signIn
// ゲーム内で直接実装されたTwitterログイン
[Game login:@"CUSTOM_TWITTER" handler:^(NSString* authKey) {
[HIVEAuthV4 signInWithAuthKey:authKey handler:^(HIVEResultAPI* result, HIVEPlayerInfo* playerInfo) {
if (result. isSuccess) {
NSDictionary<NSString*, HIVEProviderInfo*>* customProviderInfoData = playerInfo.customProviderInfoData;
ProviderInfo* providerInfo = [customProviderInfoData objectForKey:@"CUSTOM_TWITTER"];
// 次のユーザーリンク情報を確認
providerInfo. providerType; // HIVEProviderTypeCustom、カスタムは固定タイプを持つため、providerNameで区別する必要があります
providerInfo. providerName; // "CUSTOM_TWITTER"
providerInfo. providerUserId; // 自実装のTwitterログインに使用されるユーザーID
return;
}
else if (result.getCode == HIVEResultAPICodeAuthV4SessionExist) {
// すでにplayerIdとplayerTokenを発行した後に自動的にログインする必要がある場合
// TODO: [HIVEAuthV4 signIn:HIVEProviderTypeAuto, handler:^(HIVEResultAPI* _result, HIVEPlayerInfo* playerInfo) {}];
}
else if (result.getCode == HIVEResultAPICodeAuthV4NotInitialized) {
// TODO: SDKを初期化する必要があります
}
else if (result.getCode == HIVEResultAPICodeAuthV4InvalidParam) {
// TODO: 渡されたauthKeyの値がNULLまたは空であるかどうかを確認する必要があります
}
else if (result. needExit) {
// TODO: アプリのシャットダウン機能を実装します。
// ex) exit(0);
}
}];
}];
ユーザー名¶
米国COPPAなどの問題により、米国またはその領土からアクセスし、IdPでログインする際には、追加のユーザー識別のために認証を有効にするためにユーザー名を入力する必要があります。参考までに、米国領土に含まれる国は、アメリカ領サモア(AS)、グアム(GU)、北マリアナ諸島(MP)、プエルトリコ(PR)、米国小アンティル諸島(UM)、および米領ヴァージン諸島(VI)です。ユーザー識別のためのユーザー名入力画面は以下の通りです。
- ユーザー名入力画面はユーザー識別のためだけに使用されるため、IdPとの初回リンク時にのみ表示され、それ以外では表示されません。
- ゲストとしてログインする際、ユーザー名入力画面は表示されません。
認証トークンキーの検証¶
ゲームサーバーは、成功したログイン後に返されたトークン、playerId、およびDID情報を使用して認証トークンキーを検証できます。認証により、マルチデバイスログインと重複接続が可能になります。
ゲームが1つのIDで重複アクセスを許可しない限り、ゲームサーバーはログインしているデバイスに通知を表示し、ゲームを終了します。その後、2台目のログインデバイスはゲームプレイのためのログイン状態を保持します。ユーザーが1つのデバイスからゲームを終了せずに重複接続を維持すると、ゲームプレイが正確に記録されない可能性があります。したがって、確認されたトークンキーを管理するか、トークンキーを使用してゲーム自体のセッションキーを管理することによってこの機能を処理する機能を実装することを確認してください。
関数を実装するには、Hive サーバー API > 認証 v4 トークンの検証を参照してください。
TalkPlusログイントークンの取得¶
TalkPlusにログインするには、Auth v4インターフェースを介してログイン(signIn())した後にAuthV4.getHiveTalkPlusLoginToken APIを呼び出して取得したログイントークンが必要です。(TalkPlusログインガイドを参照)
IdPアカウントの変更をバックグラウンドで検出する¶
ユーザーは、ゲームをプレイしている間にデバイスの設定を通じてApple Game CenterまたはGoogle Playゲームアカウントを変更できます。IdPアカウントが現在のPlayerIDに接続されているアカウントと一致しているかどうかを確認する必要がある場合は、Hive SDKを初期化した後にsetProviderChangedListener()
を実装してください。APIを実装すると、ユーザーはゲームが再開されたときにユーザーのデバイスにリンクされたIdPアカウントの変更を通知するイベントを受け取ることができます。
iOSはApple Game Centerのアカウントが変更されると動作し、AndroidはGoogle Play Gamesのアカウントが変更されると動作します。そして、現在ログインしているPlayerIDが関連するIdPに接続されている場合にのみ、応答が配信されます。IdPアカウントで変更イベントを受信した場合、デバイス上でログインしているIdPアカウントを使用するかどうかをユーザーが選択できるUIを構成してください。ユーザーがデバイス上でログインしているIdPアカウントを選択した場合、signOut
を呼び出してサインアウトし、Implicit Loginを進めてください。
Warning
Google Play Gamesの動作問題により、2021年7月以降にリリースされたGoogle Play Gamesを搭載したデバイスでは、バックグラウンドでIdPアカウントを変更することができません。
Note
この関数はプレイを停止し、ユーザーアカウントの変更を要求する場合があるため、アカウントの同期が必要なときのみ使用してください; ロビーまたはショップへのアクセス。
以下は、プレイヤーがゲームを再開したときにデバイス上のIdPアカウント設定が変更されたイベントを受信するためのサンプルコードです。
APIリファレンス: hive.AuthV4.setProviderChangedListener
APIリファレンス: AuthV4::setProviderChangedListener
#include <HIVE_SDK_Plugin/HIVE_CPP.h>
using namespace std;
using namespace hive;
AuthV4::setProviderChangedListener([=](ResultAPI const & result, ProviderInfo const & providerInfo) {
if (!result.isSuccess()) {
return;
}
if (providerInfo != null && providerInfo.providerType == ProviderType::GOOGLE) {
// Google Play Game Serviceアカウントを変更する
}
});
APIリファレンス: AuthV4.setProviderChangedListener
import com.hive.AuthV4
import com.hive.ResultAPI
AuthV4.setProviderChangedListener(object : AuthV4.AuthV4CheckProviderListener {
override fun onDeviceProviderInfo(result: ResultAPI, providerInfo: AuthV4.ProviderInfo?) {
if (!result.isSuccess) {
return
}
if (providerInfo != null && providerInfo.providerType == AuthV4.ProviderType.GOOGLE) {
// Change Google Play Game Service account
}
}
})
APIリファレンス : : com.hive.authv4.SetproviderChangeDlistener
APIリファレンス: AuthV4Interface .setProviderChangedListener
APIリファレンス: HIVEAuthV4:setProviderChangedListener
ゲームデータの初期化¶
ゲームデータを初期化する際にログアウトを実装しないようにしてください。PlayerIDは初期化を通じて削除されないため、アカウント間でのクラッシュが発生する可能性があります。ユーザーが現在サインインしているアカウントでゲームをプレイできるようにし、ユーザーがログアウトボタンをタップして明確に要求する前にログアウト機能を実装しないでください。
ログアウト¶
Warning
- ログアウトすると、PlayerId(認証情報)、PlayerToken(セッション情報)、およびすべてのIDPセッション情報が削除されます。
- ログアウトすると、setter API(
set
APIシリーズ)で設定された値は初期化または削除されません。- Configuration、Auth、Auth v4、Promotion、およびPushクラスのすべてのsetterメソッド
- 例: Configuration.setServer、Configuration.setUseLog、 Configuration.setGameLanguage、Configuration.setHiveCertificationKey、 Auth.setEmergencyMode、AuthV4.setProviderChangedListener、 Promotion.setUserEngagementReady、Promotion.setAddtionalInfo、 Push.setRemotePush、Push.setForegroundPushなど。
- Hive SDK v4 24.3.0以降、ゲストユーザーがログアウトするとエラーコードが返されます。それ以降、クライアントとサーバーのセッションは維持されます。
- setterメソッドで設定された値の有効範囲は、ログインまたはログアウト状態ではなく、アプリのライフサイクル内に維持されます。
ログインが行われると、PlayerIDと認証トークンキーが既に発行されています。ログアウトはPlayerIDとトークンキーを初期化する責任があります。signOut()
を実装してログアウトが完了した場合、ゲームタイトルに移動し、ユーザーがタイトルをタップしたときに明示的ログインを実行します。
Note
- ゲストの状態のときにログアウト機能を提供しないように実装します。なぜなら、ゲストがログアウトした後に同じPlayerIDを見つけることができないからです。
- ユーザーがサインアウトしても、PlayerIDとのIdPの接続状態は変わりません。
- ユーザーがサインアウトしたときにゲームタイトルに移動します。プレイヤーがタイトルをタップしたとき、明示的なログインを実行します。
- ユーザーがサインアウトした後にゲームアプリを再起動した場合、暗黙的なログインが実行されるべきです。
サインアウトを実装するためのサンプルコードは以下の通りです。
APIリファレンス: hive.AuthV4.signOut
#include "HiveAuthV4.h"
FHiveAuthV4::Helper::SignOut(FHiveAuthV4HelperDelegate::CreateLambda([this](const FHiveResultAPI& Result, const TOptional<FHivePlayerInfo>& PlayerInfo) {
AHIVESDKV4TesterGameMode::getGameModeInstance()->appendLogString(ELogType::AuthV4Helper ,TEXT("Helper::SignOut Result = %s"), *(Result.ToString()));
switch (Result.Code) {
case FHiveResultAPI::ECode::Success:
// Logout successful
break;
default:
// other exception situations
break;
}
}));
API リファレンス: AuthV4::signOut
APIリファレンス: AuthV4.Helper.signOut
API Reference: AuthV4.Helper.INSTANCE.signOut
API リファレンス: AuthV4Interface.helper().signOut()
APIリファレンス: [HIVEAuthV4 helper] signOut
ゲームセンターサインイン無効の通知フレーズ¶
言語 | フレーズ |
---|---|
韓国語 | Apple Game Centerのログインがキャンセルされました。 Game Centerアカウントと連動するには、[設定 >; Game Center]にログインした後、再度お試しください。 |
英語 | あなたのGame Centerへのログインはキャンセルされました。 Game Centerアカウントと同期するには、[設定 >; Game Center]にログインして再試行してください。 |
日本語 | Apple Game Center ログインがキャンセルされました。 Game Center アカウントと連動するには [設定 >; Game Center] にログインした後、再度お試しください。 |
中国語(簡体字) | Apple Game Center已退出登录。 若想与Game Center账号同步,请在设备[设置 >; Game Center]中重新登录后再试。 |
中国語(繁体字) | 登入Apple Game Center已取消。 若想連動Game Center帳號,請至[設定 >; Game Center]登入後,再試一次。 |
フランス語 | Ta connexion au Game Center a été annulée. Connecte-toi dans [Réglages >; Game Center] pour synchroniser ton compte Game Center et essaie de nouveau. |
ドイツ語 | Das Einloggen ins Apple Game Center wurde abgebrochen. Die Synchronisation mit dem Game Center-Konto läuft über [Einstellungen >; Game Center]. Logge dich ein und versuche es erneut. |
ロシア語 | Ваш авторизация в Game Center была отменена. Авторизуйтесь в Game Center через [Настройки >; Game Center] и повторите попытку. |
スペイン語 | Tu Inicio de Sesión en Game Center ha sido cancelado. Inicia Sesión en [Configuración >; Game Center] para sincronizar a la Cuenta de Game Center, e inténtalo de nuevo. |
ポルトガル語 | O seu login no Game Center foi cancelado. Faça o login em [Configurações >; Game Center] para sincronizar com a Conta do Game Center e tente novamente. |
インドネシア語 | Login ke Apple Game Center telah dibatalkan. Hubungkan akun Game Center dengan login di [Pengaturan >; Game Center] dan coba lagi. |
マレー語 | Log masuk ke Game Center anda telah dibatalkan. Log masuk di [Tetapan >; Game Center] untuk disegerakkan ke Akaun Game Center dan cuba lagi. |
ベトナム語 | Đã hủy bỏ đăng nhập vào Apple Game Center. Đăng nhập tại [Cài đặt >; Game Center] để đồng bộ với tài khoản Game Center và thử lại. |
タイ語 | การล็อกอินเข้า Game Center ของคุณถูกยกเลิก ล็อกอินที่ [การตั้งค่า >; Game Center] เพื่อเชื่อมต่อบัญชี Game Center และโปรดลองอีกครั้ง |
イタリア語 | L'accesso all'Apple Game Center è stato annullato. Fai log-in su [Impostazioni >; Game Center] per sincronizzare il tuo account con il Game Center e riprova. |
トルコ語 | Apple Oyun Merkezine girişiniz iptal edilmiştir. Oyun Merkezi Hesabına ulaşmak için [Ayarlar >; Oyun Merkezi]'nden giriş yapın ve tekrar deneyin. |
アラビア語 | تم إلغاء تسجيل الدخول إلى مركز الألعاب. سجل الدخول إلى [الإعدادات >; مركز الألعاب] للمزامنة مع حساب مركز الألعاب وحاول مرة أخرى。 |