コンテンツにスキップ

ログイン・ログアウト

認証におけるログインは、以下のステップで構成されています。

Note
  • SDKバージョン4.7.0未満はHelperをサポートしていません。既存のログインアプリケーションメソッドについては[こちら]を参照してください。
  • AuthV4.Helperの説明については、認証ページを参照してください。

ログイン

認証におけるログインは、以下のステップで構成されています。

  1. 自動ログインと暗黙のログイン
  2. 明示的ログイン
  3. デバイス上でログインしているIdPアカウントを確認
  4. ゲストログイン

Authv4Helperは、ログインに関連する一連のプロセスを実行するクラスであり、レスポンス値に基づいて適切な画面にナビゲートするように設定されています。 ログインを設定する際は、以下を参照してください。

Note

Appleは、iOSエンタープライズビルドに対してApple Game Centerおよびアプリ内購入をサポートしていません。したがって、Apple Game Centerアカウントを使用した暗黙のログインはiOSエンタープライズビルドでは利用できず、明示的なログインもApple Game Centerを利用することはできません。iOSエンタープライズ向けにビルドする際は、コンソールのログインタイプにApple Game Centerを含めてはいけません。

Note
Note
  • 中国では、Google Playゲームは使用できないため、Androidでの暗黙のログインは使用できません。
  • 中国では、Facebookは使用できないため、FacebookはIdPリストに含まれていません。
  • 実名認証を受けたユーザーのみが中国のIPからリソースをチャージまたは消費できるため(2017年5月1日から有効)、ゲストログインは中国のIPからログインできるIdPリストには含まれていません。
Note

iOSでは、Apple Game Centerのログインがキャンセルされてもログイン画面は表示されません。したがって、ガイダンスメッセージは、SDKがAuthV4HelperクラスのshowGameCenterLoginCancelDialog()メソッドを呼び出すことで直接表示されるか、ゲームによって表示されることを選択できます。ユーザーにGame Centerアカウントを再接続するためのメッセージを提供したい場合は、AuthV4.signIn(AuthV4.ProviderType.APPLE, ...)およびAuthV4.connect(AuthV4.ProviderType.APPLE, ...)のコールバック結果がキャンセルされたときに、Game Centerキャンセルガイダンスメッセージを使用してください。

Note

Apple IDでログインしようとするユーザーのデバイスがApple IDにログインしていない場合、AuthV4Helperクラスのconnect()signIn() メソッドAuthV4SignInAppleUnknownエラーを引き起こします。Apple IDログインガイダンスポップアップが自動的に表示されるため、ゲームスタジオは別のガイダンスポップアップを表示する必要はありません。

ユーザーがApple IDでログインしようとする際に、デバイスがApple IDでログインしていない場合、AuthV4SignInAppleUnknownエラーが発生します。このエラーは、AuthV4Helperクラスのconnect()signIn()メソッドを呼び出す過程で発生します こちら。Apple IDログインのガイダンスポップアップが自動的に表示されるため、ゲームスタジオは別途__ポップアップ__を表示する必要はありません。

自動ログインと暗黙のログイン

自動ログイン

これは、ユーザーがiOSでApple Game Centerアカウント、AndroidでGoogle Play Gamesアカウントをリンクすることによって、ログイン方法を選択することなく自動的にログインすることを意味します。自動ログインを実装し、自動ログインが失敗した場合は暗黙のログインを行います。

iOS環境で自動ログインを使用するには、Game Centerの権限を追加する必要があります。これは、'Apple GameCenter'の依存関係をチェックすると、Unityが自動的にUnity PostProcessを通じて追加します。iOS Nativeでは、Xcodeが自動的にGame Centerの権限を追加します。

iOS環境で自動ログインを使用するには、Game Centerの権限を追加する必要があります。Unityでは、「Apple GameCenter」依存関係をチェックしている場合、Unity PostProcessを通じて自動的に権限が追加されます。iOS Nativeでは、Xcodeが自動的にGame Centerの権限を追加します。

オフラインモード

Hive SDK v4 23.1.0 以降では、アプリが起動したときにユーザーのデバイスがネットワークに接続されていなくても、自動ログイン機能(AuthV4.signInProviderType.AUTO を使用して、または AuthV4.Helper.signIn)を提供できます。オフラインモードを使用するには、以下の指示に従ってください。

  1. 明示的、暗黙的、ゲスト、またはカスタムログインのためにアプリをオンラインで正常に実行し、playerIdplayerTokenを受け取っている必要があります。

アプリ開発者の視点から見ると、オンラインの間に少なくとも一度はAuthV4.Helper.signInAuthV4.showSignIn、またはAuthV4.signInWithAuthKeyを正常に実行し、コールバックとしてplayerIdplayerTokenを受け取る必要があります。ユーザーの視点から見ると、ユーザーはデバイスがネットワークに接続されている間にアプリに少なくとも一度は正常にログインしている必要があります。ただし、ユーザーのアカウントがオンラインでログインを試みた最後の時に一時停止または制限されていた場合、ユーザーはオフラインモードでもログインできません。

  1. Hive コンソールでオフラインモードを有効にします アプリセンター > プロジェクト管理 > ゲーム詳細 > Hive 製品設定

Windows環境での自動ログイン

Windows環境でも自動ログインがサポートされており、Hive コンソールアプリセンターで有効または無効にすることができます。ただし、Windowsでの自動ログインはモバイルとは異なる動作をします。Windowsにおける自動ログインの違いは以下の通りです。

  • モバイルでは、ログイン後にログイン状態が常に自動的に維持されますが、Windowsでは「ログイン状態を保持する」チェックボックス(ログインUIのIdPリストの下部に表示される)をユーザーがアクティブにしない限り、維持されません。他の状況では、ログイン状態は維持されません。
  • AuthV4Helper.Connectを実行する際、モバイルでは新しいアカウントに切り替えると、新しいアカウントも自動ログイン状態を維持しますが、Windowsでは新しいアカウントに切り替えると、自動ログイン状態は維持されません。

インプリシットサインイン

  • 暗黙のログインフロー

AuthV4.Helper.signInは、PlayerIDの認証トークンキーを使用して自動的にログインしようとします。以前にログインした認証トークンキーがない場合、iOSのApple Game CenterとAndroidのGoogle Play Gamesに自動的にログインします。ログインに失敗した場合、レスポンス値に基づいて適切なログイン画面を構成します。

Note

自動ログインを使用するには、Game Center Entitlementを追加する必要があります。「Apple GameCenter」依存関係をチェックしている場合、Unity PostProcessを通じて対応するEntitlementが自動的に追加されます。

Note

AuthV4Helperクラスを使用する際

ゲームを実行しているユーザーがPGS中に暗黙のログイン試行を拒否した場合、それを記憶し、以降は暗黙のログインを試みなくなります。プレイヤーセッションが維持されている間に自動ログインが可能であっても、暗黙のログインが拒否された状態を記憶し続けます。この内容はGoogle Play Games Servicesガイドに基づいています。

以下は自動ログインを実行する例のコードです。

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にログインする試み (signIn)
FHiveAuthV4::Helper::SignIn(FHiveAuthV4HelperDelegate::CreateLambda([this](const FHiveResultAPI& Result, const TOptional<FHivePlayerInfo>& PlayerInfo) {
        if (Result.IsSuccess()) {
                // ログイン成功
        } else if (Result.NeedExit()) {
                // TODO: アプリ終了機能を実装する
                // 例) UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit, false);
        } else {
                switch (Result.Code) {
                        case FHiveResultAPI::ECode::AuthV4ConflictPlayer:
                                // アカウントの競合
                                break;
                        case FHiveResultAPI::ECode::AuthV4HelperImplifiedLoginFail:
                                // 暗黙のログインに失敗しました
                                // 例) FHiveAuthV4::ShowSigIn()
                                break;
                        default:
                                // その他の例外
                                break;
                }
        }
}));

APIリファレンス: Auth4::signIn

// Hive SDKを使ってサインインを試みる(signIn)    
    AuthV4::Helper::signIn([=](ResultAPI const & result, std::shared_ptr 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 ResultAPI::AuthV4ConflictPlayer:    
                // アカウントの競合    
                break;    
            case ResultAPI::AuthV4HelperImplifiedLoginFail:    
                // 暗黙のログイン失敗    
                // 例) AuthV4.showSignIn(...);    
                break;    
            default:    
                break;    
        }    
    }    
});

API リファレンス: hive.AuthV4.showSignIn

// Hive SDKを使用してサインインを試みる
 AuthV4.Helper.signIn(object : AuthV4.Helper.AuthV4HelperListener {
    override fun onAuthV4Helper(result: ResultAPI, playerInfo: AuthV4.PlayerInfo?) {
            if (result.isSuccess) {
                    // ログイン成功
            } else if (result.needExit()) {
                    // TODO: アプリ終了機能を実装する
                    // 例) exitProcess(0)
            } else {
                    when (result.code) {
                            ResultAPI.Code.AuthV4ConflictPlayer -> {
                                    // アカウントの競合
                            }
                            ResultAPI.Code.AuthV4HelperImplifiedLoginFail -> {
                                    // 暗黙のログインに失敗
                                    // 例) AuthV4.showSignIn(...);
                            }
                            else -> {
                                    // その他の例外的な状況
                            }
                    }
            }
    }
    })

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:signIn

var email = String()    
    // Hive SDK AuthV4 authentication UI request    
    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:signIn

// Hive SDKを使用してサインインを試みる (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;   
                }
        }
        }];

暗黙のログイン動作: モバイル

モバイルでの暗黙のログイン(Android/iOSプラットフォーム用のHive SDK Unityなど)(AuthV4.Helper.signIn)は、初回ログイン後に異なるアカウントでログインする際にアカウントの競合が発生した場合、最後にログインしたアカウントでログインするかどうかを尋ねるダイアログをユーザーに表示します。

暗黙のログイン動作: PC

PC(Hive SDK Unity WindowsのようなWindowsプラットフォーム)での暗黙のログイン(AuthV4.Helper.signIn)は、最初のログイン後に異なるアカウントでログインすると、最後にログインしたアカウントで自動的にログインします。アカウントの競合は発生しません。

明示的なログイン

明示的ログインとは、ユーザーが認証するためにIdPを選択するプロセスを指します。自動ログインと暗黙的ログインの両方が失敗した場合、ユーザーがゲームタイトル画面に移動した後にタイトルをクリックしたときに明示的ログインを実行するように実装します。

明示的なログインUIは、Hive SDKによって提供されるUIを使用するか、Hive SDKの初期化が完了した後に返されるIdPリストを使用してカスタマイズすることができます。UIをカスタマイズする場合は、明示的ログインのカスタマイズセクションを参照してください。

IdPリストは、各国のポリシーに従ってHiveプラットフォームによって管理および提供されています。例えば、中国では、Google PlayゲームやFacebook、ゲストは提供されていません。

明示的なログインスクリーンショット

SDKによって提供されるIdP選択UI

SDKが提供するUIを使用して実装する場合

SDKが提供するUIを使用して明示的なログインを実装するには、showSignIn()メソッドを呼び出してIdPリストUIを起動するだけです。

Note

ユーザーがSDKによって提供されたIdP選択UIを「X」ボタンを押して閉じた場合、再度ログインする手段を提供する必要があります。ユーザーはまだログインしていません。

Note

明示的なサインインをカスタマイズするには、以下を参照してください

APIリファレンス: hive.AuthV4.showSignIn

// 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: アプリの終了機能を実装する
        // e.g.) Application.Quit();
}
});
#include "HiveAuthV4.h"

// Hive SDK AuthV4 認証 UI リクエスト
FHiveAuthV4::ShowSignIn(FHiveAuthV4OnSignInDelegate::CreateLambda([this](const FHiveResultAPI& Result, const FHivePlayerInfo& PlayerInfo) {
        if (Result.IsSuccess()) {
                // 認証成功 (PlayerInfo: 認証されたユーザー情報) 

                // メール情報を取得する例
                for (const auto& ProviderInfoEntry : PlayerInfo.ProviderInfoData) {
                        FHiveProviderInfo ProviderInfo = ProviderInfoEntry.Value;
                        FString Email = ProviderInfo.ProviderEmail;
                }
        } else if (Result.NeedExit()) {
                // TODO: アプリ終了機能を実装する
                // 例) UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit, false);
        }
}));

APIリファレンス: AuthV4::showSignIn

// Hive SDK AuthV4 authentication UI request
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は、providerTypeListを使用して実装できます。providerTypeListは、Hive SDKを初期化する目的でAuthV4.setup()メソッドを呼び出すときに返されるレスポンスコールバックハンドラーであり、初期化後にAuthV4.Helper.getIDPList()メソッドを呼び出すときにも返されます。この機能は、ゲームのUIに応じてログイン画面を表示したり、特定のIdPとの統合を主に公開したりする場合に使用されます。カスタマイズ可能なUIを実装した後は、ユーザーのアクションに基づいて希望するProviderTypeを指定してsignIn()メソッドを呼び出し、ログインを実装します。

Note
  • ログイン画面に表示される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: 認証されたユーザー情報)

                // EHiveProviderType::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()) {    
            // 成功した呼び出し    
            // playerInfo : 認証されたユーザー情報。    

            // 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()) {    
            // Call successful    
            // playerInfo: authenticated user information    
            // Example of retrieving email information for 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() {    
            // 成功した呼び出し    
            // playerInfo: 認証されたユーザー情報。    

            // 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]){    
            // 成功しました    
            // playerInfo: 認証されたユーザー情報。    

            // HIVEProviderTypeGoogleのメール情報を取得する例    
            if(playerInfo != nil) {    
                HIVEProviderInfo *providerInfo = playerInfo.providerInfoData[@"GOOGLE"];    
                if(providerInfo != nil){    
                    NSString *email = providerInfo.providerEmail;    
                }    
            }    
        }    
}];    

デバイスにログインしているIdPアカウントを確認する

自動ログインは保存されたPlayerIDの認証トークンキーのみを使用しますが、明示的なログインは複数のIdPにリンクされたアカウントにログインします。どちらの場合も、ログインしているPlayerIDのIdPアカウントは、実際のデバイス(DevicePlayer)にログインしているIdPアカウントとは異なる場合があります。将来の成果やリーダーボードの使用に備えて、2つのアカウントを統一するためのガイダンスが提供されます。

  • SDKによって提供されたDevicePlayerのUIを確認してください

ここにIdP情報を確認するための例のコードがあります。

API リファレンス: AuthV4.Helper.syncAccount

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:
                        // 通常の応答
                        break;
                case FHiveResultAPI::ECode::AuthV4ConflictPlayer:
                        // アカウントの競合
                        // 例) Hive UIを使用しているとき
                        // FHiveAuthV4::Helper::ShowConflict()
                        // 例) ゲームUIを実装しているとき
                        // FHiveAuthV4::Helper::ResolveConflict() // 現在のユーザー選択
                        // FHiveAuthV4::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:    
            // 通常    
            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 -> {    
                    // 通常    
                }    
                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:    
                // 通常    
                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:    
            // 通常    
          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:    
                // 成功    
                break;    
            case HIVEResultAPICodeAuthV4ConflictPlayer:    
                // アカウントの競合    
                // 例) Hive UIを使用している場合     
                // [[HIVEAuthV4 helper] showConflict: ...];    
                // または    
                // 例) GameUIを実装している場合    
                // [[HIVEAuthV4 helper] resolverConflict:...];// 現在のユーザーを選択する場合    
                // [[HIVEAuthV4 helper] switchAccount:...];// ユーザー切り替えを選択する場合     
                break;    
            default:    
                // その他の例外    
                break;    
        }    
}];

ゲストログイン

ゲストログイン機能により、ユーザーはIdPを選択せずにゲストモードでゲームをプレイできます。ゲストはHive SDKによって提供される明示的なログインUIから選択することができ、またゲーム内で直接カスタマイズされている場合、ゲストログインも実装可能です。Windows環境ではゲストログインはサポートされていません。

ゲストとしてログインする際は、以下のポリシーに従う必要があります。

ゲストログインポリシー

  • IdP認証されたユーザーとゲストユーザーの両方が同じようにゲームを利用できるように実装してください。 ゲストとしてログインしても、Hiveプラットフォームのほとんどの機能を利用できます。したがって、ゲストとしてログインしているユーザーがIdPリンクされたユーザーと同じようにゲームを利用できるようにしてください。たとえば、ゲストユーザーもゲーム内でアイテムを購入したり、支払いを行ったりできる必要があります。
    • ゲストユーザーにログアウト機能を提供しないでください。 ユーザーがゲストとしてログインした後にログアウトすると、同じPlayerIDで再度ログインできなくなります。したがって、ゲストとしてログインしているユーザーにはログアウトボタンを提供せず、ログアウトを防ぐようにしてください。
    • 中国におけるゲストログインポリシーの禁止 中国のIPを使用する場合、実名認証を受けたユーザーのみがリチャージやリソースの消費を行うことができます(2017年5月1日から有効)。したがって、ゲストログインは中国のIPでログインできるIdPのリストには含まれていません。

ゲストログインを実行するには、ProviderType.GUESTをパラメータとしてsignIn()メソッドを呼び出します。
こちらはゲストログインを実行するための例コードです。

Note

ゲスト状態でIdP認証なしのPlayerIDは、playerInfoにproviderInfoDataを持っていません。

APIリファレンス: hive.AuthV4.signIn

using hive;    
    AuthV4.signIn(AuthV4.ProviderType.GUEST, (ResultAPI result, AuthV4.PlayerInfo playerInfo) => {    
        if (result.isSuccess()) {    
            // 認証成功    
            // playerInfo: 認証されたユーザー情報    
        }    
});
#include "HiveAuthV4.h"

FHiveAuthV4::SignIn(EHiveProviderType::GUEST,
                                        FHiveAuthV4OnSignInDelegate::CreateLambda([this](const FHiveResultAPI& Result, const FHivePlayerInfo& PlayerInfo) {

        if (Result.IsSuccess()) {
                // コール成功 (PlayerInfo: 認証されたユーザー情報)
        }
}));

APIリファレンス: Auth4::signIn

#include <HIVE_SDK_Plugin/HIVE_CPP.h>    
    using namespace std;     
    using namespace hive;    
    AuthV4::signIn(ProviderType::GUEST, [=](ResultAPI const & result, PlayerInfo const & playerInfo) {    
        if (result.isSuccess()) {    
            // 認証成功    
            // playerInfo: 認証されたユーザー情報    
        }    
});

APIリファレンス: AuthV4.signIn

import com.hive.AuthV4    
    import com.hive.ResultAPI    
    AuthV4.signIn(AuthV4.ProviderType.GUEST, object : AuthV4.AuthV4SignInListener {    
        override fun onAuthV4SignIn(result: ResultAPI, playerInfo: AuthV4.PlayerInfo?) {    
            if (result.isSuccess) {    
                // 認証成功    
                // playerInfo: 認証されたユーザー情報    
            }    
        }    
})

APIリファレンス: com.hive.Auth4.signIn

import com.hive.AuthV4;    
    import com.hive.ResultAPI;    
    AuthV4.INSTANCE.signIn(AuthV4.ProviderType.GUEST, (result, playerInfo) -> {    
        if (result.isSuccess()) {    
            // 認証成功    
            // playerInfo: 認証されたユーザー情報    
        }    
});

APIリファレンス: AuthV4Interface.signIn

import HIVEService    
    AuthV4Interface.signIn(.Guest) { result, playerInfo in    
        if result.isSuccess() {    
            // 認証成功    
            // playerInfo: 認証されたユーザー情報    
        }    
}

APIリファレンス: HIVEAuth4:signIn

#import <HIVEService/HIVEService-Swift.h>    
    [HIVEAuthV4 signIn: HIVEProviderTypeGuest handler: ^(ResultAPI *result, HIVEPlayerInfo *playerInfo) {    
        if ([result isSuccess]) {    
            // 認証成功    
            // playerInfo: 認証されたユーザー情報    
        }    
}];

カスタムログイン

カスタムログインは、Hiveが提供するIdPに加えて、ゲーム自体と統合されたIdPでログインを実装することを可能にする機能です。カスタムログインAPIを呼び出す際に使用する認証キー(authKey)を作成してみてください。詳細はAuthenticate v4 Custom Authenticationを参照してください。

カスタムログインAPIを呼び出した後、コールバックとして受け取ったPlayerInfoクラスのインスタンスを通じて、customProviderInfoDataデータにアクセスして、カスタムログインユーザーの情報を確認できます。customProviderInfoDataProviderType (enum)は一律にCUSTOMに設定されており、ProviderName (String)によって詳細に区別できます。

ゲーム内でカスタムログインを実装したIdPの情報は、AuthV4クラスのsetup()およびshowSignIn()メソッドを呼び出した結果には含まれていません。

カスタムログインの最初の実行後にplayerIdplayerTokenを受け取った場合、カスタムログインAPIが再呼び出しされると、authV4SessionExist(code)の結果APIがコールバックとして配信されます。この場合、既にログインしているアカウントを使用して自動ログインを進めるために、ProviderType.AutoをパラメータとしてsignIn()を呼び出す必要があります。以下の例コードを参照してください。

AuthV4クラスのconnect()およびdisconnect()メソッドは、カスタムログイン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"

// ゲーム内で「CUSTOM_TWITTER」タイプで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, custom types have fixed Type
                                FString ProviderName = ProviderInfo->ProviderName; // Need to distinguish by ProviderName
                                FString ProviderUserId = ProviderInfo->ProviderUserId; // User id used in the custom Twitter login
                        }
                } else if (Result.NeedExit()) {
                        // TODO: Implement app exit functionality
                        // e.g.) UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit, false);
                } else if (Result.Code == FHiveResultAPI::ECode::AuthV4SessionExist) {
                        // If playerId and playerToken have already been issued and automatic login is needed
                        // TODO: FHiveAuthV4.SignIn(EHiveProviderType::GUEST, Delegate);
                } else if (Result.Code == FHiveResultAPI::ECode::AuthV4NotInitialized) {
                        // TODO: SDK initialization needed
                } else if (Result.Code == FHiveResultAPI::ECode::AuthV4InvalidParam) {
                        // TODO: Check if the value of the provided authKey is empty
                }
        }));
}

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, custom types are fixed, so need to distinguish by providerName
                                    providerInfo.providerName   // "CUSTOM_TWITTER"
                                    providerInfo.providerUserId // User id used for the custom Twitter login
                            }
                    }
                    else if (result.needExit()) {
                            // TODO: アプリ終了機能を実装する
                            // e.g.) exitProcess(0)
                    }
                    else if (result.code == ResultAPI.Code.AuthV4SessionExist) {
                            // playerIdとplayerTokenがすでに発行され、自動ログインが必要な場合
                            // TODO: AuthV4.signIn(AuthV4.ProviderType.AUTO, authV4SignInListener)
                    }
                    else if (result.code == ResultAPI.Code.AuthV4NotInitialized) {
                            // TODO: SDKの初期化が必要
                    }
                    else if (result.code == ResultAPI.Code.AuthV4InvalidParam) {
                            // TODO: 提供されたauthKeyの値がNULLまたは空であるか確認する
                    }
            }
    })

    }

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、カスタムタイプはTypeによって固定されているため、providerNameで区別する必要があります
                                            providerInfo.getProviderName(); // "CUSTOM_TWITTER"
                                            providerInfo.getProviderUserId(); // カスタムTwitterログインで使用されるユーザーID
                                    }
                            } else if (result.needExit()) {
                                    // TODO: アプリ終了機能を実装する
                                    // 例)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

// ゲーム内で直接実装された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: アプリ終了機能を実装してください。
                            // 例)exit(0);
                    }
    }];   
    }];

ユーザー名

アメリカ合衆国におけるCOPPAなどの問題により、アメリカ合衆国およびその領土からアクセスし、IdPとしてログインする際には、追加のユーザー識別認証処理を有効にするためにユーザー名を入力する必要があります。参考までに、アメリカの領土に含まれる国は、アメリカ領サモア(AS)、グアム(GU)、北マリアナ諸島(MP)、プエルトリコ(PR)、アメリカ合衆国小離島(UM)、およびアメリカ領ヴァージン諸島(VI)です。ユーザー識別のためのユーザー名を入力する画面は以下の通りです。

  • ユーザー名入力画面はユーザー識別の目的のみで使用されるため、初回のIdP統合時にのみ表示され、その後は表示されません。
  • ゲストログイン中にはユーザー名入力画面は表示されません。

認証トークンキーの検証

ゲームサーバーは、成功したログイン後に返されるトークン、playerId、およびDID情報を使用して認証トークンキーの有効性を確認できます。Hive認証は、マルチデバイスログインと同時アクセスを許可します。

同じアカウントでの重複アクセスが許可されていない場合、ゲームサーバーは最初に接続したデバイスに通知メッセージを表示し、その後ゲームを終了させ、後から接続したデバイスでゲームが維持されることを確保します。この場合、ゲームを終了せずに重複アクセスが発生した場合、ゲームプレイの記録が正しく反映されない可能性があります。この機能を実装するには、検証済みのトークンキーを管理するか、ゲーム自体のセッションキーを使用して管理する必要があります。

この機能を実装するには、認証トークンキー検証サーバAPIを参照してください。

バックグラウンドでのIdPアカウント変更の検出

ユーザーは、ゲームプレイ中にデバイス設定に移動して、Apple Game CenterまたはGoogle Playゲームアカウントを変更できます。ゲームプレイ中のIdPアカウントが現在のPlayerIDに関連付けられたIdPアカウントと異なるかどうかを確認する必要がある場合は、SDKの初期化後にsetProviderChangedListener()を呼び出してください。このAPIを呼び出すことで、ゲームが再開されたときにデバイスに設定されたIdPアカウントが変更されたことを示すイベントを受け取ります。

iOSはApple Game Centerアカウントが変更されると動作し、AndroidはGoogle Play Gamesアカウントが変更されると動作し、現在ログインしているPlayerIDがそのIdPにリンクされている場合のみ応答が提供されます。IdPアカウント変更イベントを受信すると、UIはユーザーがデバイスにログインしているIdPアカウントを使用するかどうかを選択できるように構成されます。ユーザーがデバイスにログインしているIdPアカウントを選択すると、signOutが呼び出されてログアウトし、その後、暗黙的なログインが行われます。

Warning

2021年7月以降にリリースされたGoogle Playゲームをインストールしたデバイスは、Google Playゲームの運用上の問題により、バックグラウンドでIdPアカウントを変更することができません。

Note

この機能はゲームプレイを中断させたり、アカウントの変更を要求したりする可能性があり、ロビーやショップに入るなど、アカウントの同期が必要な時に制限的にのみ使用できます。

以下は、ユーザーがゲームを再起動し、デバイスに設定されたIdPアカウントが変更されたときにイベントを受信するための設定を行う例のコードです。

APIリファレンス: hive.AuthV4.setProviderChangedListener

using hive;

AuthV4.setProviderChangedListener((ResultAPI result, AuthV4.ProviderInfo providerInfo) => {
    if (!result.isSuccess()) {
        return;
    }

        if (providerInfo != null && providerInfo.providerType == AuthV4.ProviderType.APPLE) {
                // ゲームセンターのユーザー情報を変更する
        }
});
#include "HiveAuthV4.h"

FHiveAuthV4::SetProviderChangedListener(FHiveAuthV4OnCheckProviderDelegate::CreateLambda([this](const FHiveResultAPI& Result, const FHiveProviderInfo& ProviderInfo) {
        if (Result.IsSuccess()) {
                // 呼び出しに成功しました。ProviderInfoオブジェクトを通じて変更されたユーザー情報を確認してください
        }
}));

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) {
                        // Google Play Game Serviceアカウントを変更する
                }
        }
})

APIリファレンス: com.hive.AuthV4.setProviderChangedListener

import com.hive.AuthV4;
import com.hive.ResultAPI;

AuthV4.INSTANCE.setProviderChangedListener((result, providerInfo) -> {
        if (!result.isSuccess()) {
                return;
        }

        if (providerInfo != null && providerInfo.getProviderType() == AuthV4.ProviderType.GOOGLE) {
                // Google Play Game Serviceアカウントを変更する
        }
});

APIリファレンス: AuthV4Interface.setProviderChangedListener

import HIVEService

AuthV4Interface.setProviderChangedListener() { result, providerInfo in 
    if !result.isSuccess() {
        return
    }

    if let providerInfo = providerInfo, providerInfo.providerType == .Apple {
        // GameCenterユーザー情報の変更
    }
}

APIリファレンス: HIVEAuthV4:setProviderChangedListener

#import <HIVEService/HIVEService-Swift.h>

[HIVEAuthV4 setProviderChangedListener: ^(HIVEResultAPI *result, ProviderInfo *providerInfo) {
    if (![result isSuccess]) {
        return;
    }

    if (providerInfo != nil && providerInfo.providerType == HIVEProviderTypeApple) {
        // ゲームセンターのユーザー情報を変更する
    }
}];

ゲームデータの初期化

ゲームデータを初期化する際にログアウトを呼び出さないでください。PlayerIDは削除されないため、アカウント間での競合が発生する可能性があります。ユーザーが現在ログインしているアカウントでプレイを続けられるように実装し、ユーザーが明示的に要求するまでログアウトを呼び出さないでください。

ログアウト

Warning
  • ログアウトすると、認証情報のPlayerIdとセッション情報のPlayerToken、およびすべてのIDPセッション情報が削除されます。
  • setで始まるすべてのAPIによって設定された値は初期化されず、削除されません。
    • Configuration、Auth、Auth v4、Promotion、Pushクラスのsetで始まるすべてのメソッド
    • 以下は代表的な例です。ex> Configuration.setServer、Configuration.setUseLog、Configuration.setGameLanguage、Configuration.setHiveCertificationKey、Auth.setEmergencyMode、AuthV4.setProviderChangedListener、Promotion.setUserEngagementReady、Promotion.setAddtionalInfo、Push.setRemotePush、Push.setForegroundPushなど。setで始まるすべてのメソッドはこのカテゴリに該当します。
    • Hive SDK v4 24.3.0以降、ゲストユーザーがログアウトするとエラーコードが返されます。その後、クライアントとサーバーのセッションは維持されます。
  • SDK内のsetで始まるメソッドを通じて設定された値の有効範囲は、ログインまたはログアウトの状態に関係なく、アプリのライフサイクル内で維持されます。

Hiveにログインしている場合、PlayerIDと認証トークンキーが発行されています。ログアウトはPlayerIDと認証トークンキーを初期化する機能です。signOut()メソッドを呼び出してログアウトを完了すると、ゲームタイトルにリダイレクトされ、タイトルをクリックすると明示的なログインが行われます。

Note
  • ゲストログイン状態でログアウトすると、同じPlayerIDが見つからなくなるため、ゲスト状態ではログアウトが提供されないように実装してください。
  • PlayerIDのIdP連携状態は、ログアウト後も変更されません。
  • ログアウトが完了すると、ゲームタイトルに遷移し、タイトルをクリックすると明示的なログインが行われます。
  • ログアウト後、アプリを再起動すると最初に暗黙的なログインが行われます。

ここにログアウトを実行する例のコードがあります。

APIリファレンス: hive.AuthV4.signOut

using hive;    

    AuthV4.Helper.signOut (delegate (ResultAPI result, AuthV4.PlayerInfo playerInfo) {    
        switch(result.code) {    
            case ResultAPI.Code.Success:    
                // ログアウト成功    
                break;    
            default:    
                // その他の例外    
                break;    
        }    
});
#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 exceptions
                        break;
        }
}));

APIリファレンス: AuthV4::signOut

#include <HIVE_SDK_Plugin/HIVE_CPP.h>    
    using namespace std;    
    using namespace hive;    

    AuthV4::Helper::signOut([=](ResultAPI const & result, shared_ptr playerInfo) {    
        switch (result.code) {    
            case ResultAPI::Success:    
                // ログアウト成功    
                break;    
            default:    
                // その他の例外    
                break;    
        }    
});

APIリファレンス: AuthV4.Helper.signOut

import com.hive.AuthV4
import com.hive.ResultAPI

AuthV4.Helper.signOut(object : AuthV4.Helper.AuthV4HelperListener {
        override fun onAuthV4Helper(result: ResultAPI, playerInfo: AuthV4.PlayerInfo?) {
                when (result.code) {
                        ResultAPI.Code.Success -> {
                                // ログアウト成功
                        }
                        else -> {
                                // その他の例外ケース
                        }
                }
        }
})

APIリファレンス: AuthV4.Helper.INSTANCE.signOut

import com.hive.AuthV4;
import com.hive.ResultAPI;

AuthV4.Helper.INSTANCE.signOut((result, playerInfo) -> {
        switch (result.getCode()) {
                case Success:
                        // ログアウト成功
                        break;
                default:
                        // その他の例外
                        break;
        }
});

APIリファレンス: AuthV4Interface.helper().signOut()

import HIVEService

AuthV4Interface.helper().signOut() { result, playerInfo in
        switch result.getCode() {
                case .success:
                        // ログアウト成功
                default:
                        // その他の例外
                        break
        }}

APIリファレンス: [HIVEAuthV4ヘルパー] サインアウト

#import <HIVEService/HIVEService-Swift.h> 

[[HIVEAuthV4 ヘルパー] サインアウト: ^(HIVEResultAPI *result, HIVEPlayerInfo *playerInfo) {
        switch ([result getCode]) {
                case HIVEResultAPICodeSuccess:
                        // ログイン成功
                        break;
                default:
                        // その他の例外
                        break;
        }
}];

ゲームセンターキャンセル通知テキスト

言語 フレーズ
韓国語 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.
アラビア語 تم إلغاء تسجيل الدخول إلى مركز الألعاب.
سجل الدخول إلى [الإعدادات> مركز الألعاب] للمزامنة مع حساب مركز الألعاب وحاول مرة أخرى。