コンテンツにスキップ

ログイン・ログアウト

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

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リストに含まれていません。
  • 中国では、実名認証を受けたユーザーのみがサービスをチャージまたは利用できるため(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でログインしようとすると、**AuthV4SignInAppleUnknown**エラーが発生します。このエラーは、**AuthV4Helper**クラスのconnect()signIn()メソッドを呼び出す過程で発生します こちら。Apple IDログインのガイダンスポップアップが自動的に表示されるため、ゲームスタジオは別途ガイダンスポップアップを表示する必要はありません。

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

Note

PC X IdPログインでは、Xアカウントでのログインは可能ですが、Xログイン画面でのGoogleおよびAppleアカウント統合によるログインはサポートされていません。 GoogleまたはAppleアカウント統合でXにログインするには、まず外部ブラウザでそれぞれのアカウントにログインし、その後ゲーム内でXログインを進める必要があります。
Steam Deck X IdPログインでは、Xアカウントでのログインのみがサポートされています。

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

自動ログイン

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

iOS環境で自動ログインを使用するには、Game Centerの権限を追加する必要があります。これは、'Apple GameCenter'依存関係をチェックすると、Unityが自動的に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::Helper::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.Helper.signIn

// 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.Helper.signIn

// Hive SDK AuthV4 認証 UI リクエスト
AuthV4.Helper.signIn(new AuthV4.Helper.AuthV4HelperListener() {
    @Override
    public void onAuthV4Helper(ResultAPI result, PlayerInfo playerInfo) {

        if (result.isSuccess()) {
            // 認証成功
        } else if (result.needExit()) {
            // TODO: アプリ終了機能を実装する
            // 例) System.exit(0);
        } else {
            switch (result.code) {
                case ResultAPI.Code.AuthV4ConflictPlayer:
                    // アカウントの競合
                    break;
                case ResultAPI.Code.AuthV4HelperImplifiedLoginFail:
                    // 暗黙のログインに失敗
                    // 例) AuthV4.showSignIn(...);
                    break;
                default:
                    // その他の例外的な状況
                    break;    
            }
        }
    }
});

APIリファレンス: HIVEAuthV4Helper:signIn

// Hive SDK AuthV4 authentication UI request
AuthV4Interface.helper().signIn { (result, playerInfo) in

    if result.isSuccess() {
        // 認証成功
    } else if result.needExit() {
        // TODO: アプリ終了機能を実装する
        // 例) exit(0)
    } else {
        switch result.getCode() {
            case .authV4ConflictPlayer:
                // アカウントの競合
                break
            case .authV4HelperImplifiedLoginFail:
                // 暗黙のログインに失敗しました
                // 例) AuthV4.showSignIn(...)
                break
            default:
                // その他の例外状況
                break
            }
        }
    }
}

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;   
        }
    }
}];

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

モバイルでの暗黙のログイン(Hive SDK Unity Androidなど、Android/iOSプラットフォーム)(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: アプリの終了機能を実装する
        // 例) 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 認証 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は、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.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() {
        // 成功した呼び出し
        // 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:
            // Normal
            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.syncAccount

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

AuthV4.ProviderType providerType = AuthV4.ProviderType.GOOGLE;
AuthV4.Helper.syncAccount(providerType, (result, playerInfo) -> {
    switch (result.getCode()) {
        case Success:
            // 通常  
        case AuthV4ConflictPlayer:    
            break;   
            // アカウントの競合
            // 例) Hive UIを使用しているとき
            // AuthV4.Helper.showConflict(...);
            // または
            // 例) GameUIを実装しているとき
            // AuthV4.Helper.resolverConflict(...);// 現在のユーザーを選択するとき
            // AuthV4.Helper.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.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データにアクセスしてカスタムログインユーザーの情報を確認できます。customProviderInfoDataの**ProviderType (enum)**は一様にCUSTOMに設定され、**ProviderName (String)**によって詳細に区別できます。

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

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

AuthV4クラスのconnect()およびdisconnect()メソッドは、カスタムログインIdPの追加統合および切断をサポートしていません。connectWithAuthKey()およびdisconnectWithName()メソッドは、カスタムログインIdPの追加統合および切断をサポートしています。

カスタムログインを実装するためのサンプルコードです。

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 are fixed
                    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: Implement app exit functionality
                // e.g.) exitProcess(0)
            }
            else if (result.code == ResultAPI.Code.AuthV4SessionExist) {
                // If playerId and playerToken have already been issued and automatic login is needed
                // TODO: AuthV4.signIn(AuthV4.ProviderType.AUTO, authV4SignInListener)
            }
            else if (result.code == ResultAPI.Code.AuthV4NotInitialized) {
                // TODO: SDK initialization needed
            }
            else if (result.code == ResultAPI.Code.AuthV4InvalidParam) {
                // TODO: Check if the value of the provided authKey is NULL or empty
            }
        }
    })
}

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

// ゲーム内で直接実装されたTwitterログイン
Game.Login("CUSTOM_TWITTER") { authKey: String ->
    AuthV4.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: アプリ終了機能を実装する
                // 例)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 Gamesアカウントを変更できます。ゲームプレイ中のIdPアカウントが現在のPlayerIDのIdPアカウントと異なるかどうかを確認する必要がある場合は、SDKを初期化した後にsetProviderChangedListener()を呼び出してください。このAPIを呼び出すことで、ゲームが再開されたときにデバイスに設定されたIdPアカウントが変更されたことを示すイベントを受け取ることができます。

iOSはApple Game Centerと連携し、AndroidはGoogle Playゲームと連携します。アカウントが変更されると、現在ログインしている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.setProviderChangedListener((result, providerInfo) -> {
    if (!result.isSuccess()) {
        return;
    }

    if (providerInfo != null && providerInfo.getProviderType() == AuthV4.ProviderType.GOOGLE) {
        // Google Play ゲームサービスアカウントを変更する
    }
});

API リファレンス: AuthV4Interface.setProviderChangedListener

import HIVEService

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

    if let providerInfo = providerInfo, providerInfo.providerType == .Apple {
        // ゲームセンターのユーザー情報を変更する
    }
}

APIリファレンス: HIVEAuthV4:setProviderChangedListener

#import <HIVEService/HIVEService-Swift.h> 

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

    if (providerInfo != nil && providerInfo.providerType == HIVEProviderTypeApple) {
        // GameCenter ユーザー情報の変更
    }
}];

ゲームデータの初期化

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

ログアウト

Warning
  • ログアウト操作中に、認証情報であるPlayerIdとセッション情報であるPlayerToken、およびすべてのIDPのセッション情報が削除されます。
  • setで始まるすべてのAPIによって設定された値は初期化または削除されません。
    • Configuration、Auth、Auth v4、Promotion、およびPushクラスのsetで始まるすべてのメソッド
    • 以下は代表的な例です。例> 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.signOut

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

AuthV4.Helper.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 ヘルパー] signOut: ^(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]でログインし、再試行してください。
フランス語 Game Centerへの接続がキャンセルされました。
Game Centerアカウントを同期するには、[設定 > Game Center]でログインし、再試行してください。
ドイツ語 Apple Game Centerへのログインがキャンセルされました。
[設定 > Game Center]でログインしてGame Centerアカウントと同期し、再試行してください。
ロシア語 Game Centerへのログインがキャンセルされました。
[設定 > Game Center]からGame Centerにログインし、再試行してください。
スペイン語 Game Centerへのログインがキャンセルされました。
Game Centerアカウントと同期するには、[設定> Game Center]でログインし、再試行してください。
ポルトガル語 Game Centerへのログインがキャンセルされました。
Game Centerアカウントと同期するには、[設定> Game Center]でログインし、再試行してください。
インドネシア語 Apple Game Centerへのログインがキャンセルされました。
[設定 > Game Center]でログインしてGame Centerアカウントを接続し、再試行してください。
マレー語 Game Centerへのログインがキャンセルされました。
Game Centerアカウントと同期するには、[設定> Game Center]でログインし、再試行してください。
ベトナム語 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]でログインし、再試行してください。
アラビア語 Game Centerへのログインがキャンセルされました。
Game Centerアカウントと同期するには、[設定> Game Center]でログインし、再試行してください。