Skip to content

Link Idp

Note
  • For more description about AuthV4.Helper, refer to Authentication page.

After sign-in, display the sync status of PlayerID that user currently use and provide the function to be able to link with other ID Providers (IdP). Display the sync status of IdP in the game settings menu, and configure the UI so that the user can connect and disconnect with the IdP.

Check the information of IdP sync status

You can use getPlayerInfo() method of AuthV4 class to see the IdP list synced with the currently logged-in PlayerID. In the game settings screen, make sure to configure the UI to see which IdP is synced, and expose the Phrases to suggest IdP sync.

In the game setting screen, PlayerID of each user should be displayed along with the IdP sync information. Display the PlayerID with the format of CS Code, and with the value of currently logged in user.

  • An example screen to confirm the IdP synced with the currently logged in PlayerID

  • Sample screen for account linking

The following is the list of IdPs that can be provided by the current app through providerTypeList returned from setup(). Please check the list of IdPs linked to PlayerID and display the linkage status using the given example code.

API Reference: hive.AuthV4.getPlayerInfo

AuthV4.PlayerInfo playerInfo = AuthV4.getPlayerInfo();    

        foreach (AuthV4.ProviderInfo providerInfo in playerInfo.providerInfoData) {    
            // Synced-Provider data    
    }
#include "HiveAuthV4.h"

TOptional<FHivePlayerInfo> PlayerInfo = FHiveAuthV4::GetPlayerInfo();
if (PlayerInfo.IsSet())
{
        const FHivePlayerInfo& PlayerInfoData = PlayerInfo.GetValue();
        for (const auto& ProviderInfo : PlayerInfoData.ProviderInfoData)
        {
                // Synced-Provider data  
        }
}

API Reference: AuthV4::getPlayerInfo

// Request the sync status of Hive SDK AuthV4    
        for( auto providerInfo : AuthV4::getPlayerInfo().providerInfoData ) {    
            cout&lt;&lt;"ProviderType : "&lt;&lt;ProviderInfo::stringProviderType(providerInfo.second.providerType)&lt;&lt;endl;    
            cout&lt;&lt;"ProviderUserId : "&lt;&lt;providerInfo.second.providerUserId&lt;&lt;endl;    
    }

API Reference: com.hive.AuthV4.getPlayerInfo

//Search the verified user data    
    AuthV4.PlayerInfo playerInfo = AuthV4.getPlayerInfo();

API Reference: HIVEAuthV4:getPlayerInfo

HIVEPlayerInfo *playerInfo = [HIVEAuthV4 getPlayerInfo];    

        for (NSString *providerTypeStr in [playerInfo.providerInfoData allKeys]) {    
            // Synced Provider data    
            HIVEProviderInfo *providerInfo = playerInfo.providerInfoData[providerTypeStr];    
    }

Phrases to suggest IdP sync

Language Phrase
Korean 계정 연동을 통해 플레이 데이터를 안전하게 지키세요!
English Sync your account to protect your game data!
Japanese アカウントを連動してプレイデータを守りましょう!
Chinese (Simplified) 绑定账号,保护游戏数据安全吧!
Chinese (Traditional) 綁定帳號,保護帳號資料安全!
French Synchronise ton compte afin de protéger tes données de jeu !
German Synchronisiere dein Konto, um deine Spieldaten zu schützen!
Russian Синхронизируйте аккаунт, чтобы обезопасить игровые данные.
Spanish ¡Sincronicen su cuenta para proteger sus datos del juego!
Portuguese Sincronize sua conta para proteger seus dados de jogo!
Indonesian Hubungkan akunmu untuk mengamankan data game milikmu!
Vietnamese Vui lòng liên kết tài khoản để bảo vệ an toàn cho dữ liệu game của bạn!
Thai ซิงค์บัญชีเพื่อปกป้องข้อมูลเกมของคุณ!
Italian Sincronizza il tuo account per proteggere i tuoi dati di gioco.
Turkish Oyun verilerini korumak için hesabınızı senkronize ediniz.
Arabic زامن حسابك لحماية بيانات اللعبة الخاصة بك!

IdP Sync

The currently logged-in PlayerID can sync with new IdPs. But when user attempts to sync with the IdP linked with different a PlayerID, an error is occurred. If the sync is successful, check the sync status information and update the sync info UI.

Note

To insert an IdP icon or logo, check out our guide for each IdP.

Warning

iOS Steam Login is supported on iOS version 14 and above. There have been issues suspected to be related to rendering problems on the Steam login page, where the username and password input fields do not appear in Safari browsers and WKWebView on iOS versions below 14.

Warning

From March 2020, Apple App Store warns the use of UIWebView (ITMS-90809) and demands to delete the UIWebView-related codes until April, 2020 in case of apps and games published after September 2019 as a result of app submission. We confirmed that Twitter framwork added from Hive SDK v4.14.0 uses the classes relevant to UIWebView, and it keeps the App Center warning you whenever games are submitted. To protect the rejection, Twitter framwork is temporarily deleted until the new framework without UIWebView is available. In brief, game studio needs to be responded to the situation that when user signs in with Twitter and related API is called, ResultAPI receives NotSupportedProviderType code.

From Hive SDK v4.14.4, new framework which responds to the warning related to UIWebView is available with Unity earlier than 2019.3. If your game requires Unity 2019.3 and later, Twitter is unavailable to authenticate, therefore, make sure to follow the settings below to delete and prevent Hive SDK from referring to the Twitter-related frameworks.

  • Delete Twitter framework through External Dependency settings
  • Delete ProviderTwitter.framework on Xcode project
Warning
  • Make sure to write the name of Google and Apple products in English.
  • New IdP, Apple should be indicated as Sign In with Apple in English, and Apple로 로그인 in Korean. Texts layout on the icon should be center-aligned.
  • For multilanguage login button name applied in Authentication, click here.


When the IdP that you want to add in the IdP connection is linked to another PlayerID, this is called Account conflict situation. To solve this conflict situation, see Handling account conflicts when working with an IdP.

For IdP integration, call the connect () method with the ProviderType you want to work with as parameters. Followings are sample codes to implement the IdP sync.

API Reference: hive.AuthV4.Helper.connect

// Hive SDK AuthV4 Request to sync with IdP    
        AuthV4.Helper.connect (providerType, delegate (ResultAPI result, AuthV4.PlayerInfo playerInfo) {    
            switch(result.code) {    
            case ResultAPI.Code.Success:    
                // Success to sync IdP    
                break;    
            case ResultAPI.Code.AuthV4ConflictPlayer:    
                // Account conflict    
                break;    
            default:    
                // Exceptional case    
                break;    
            }    
    });
#include "HiveAuthV4.h"

EHiveProviderType ProviderType = EHiveProviderType::HIVE;
FHiveAuthV4::Helper::Connect(ProviderType, FHiveAuthV4HelperDelegate::CreateLambda([this](const FHiveResultAPI& Result, const TOptional<FHivePlayerInfo>& PlayerInfo) {
        switch (Result.Code) {
                case FHiveResultAPI::ECode::Success:
                        // Success to sync IdP
                        break;
                case FHiveResultAPI::ECode::AuthV4ConflictPlayer:
                        // Account conflict
                        break;
                default:
                        // Exceptional case
                        break;
        }
}));

API Reference: AuthV4::Helper::connect

// Hive SDK AuthV4 Request to sync with IdP    
        AuthV4::Helper::connect(ProviderInfo::providerTypeFromString(providerType), [=](ResultAPI const &amp; result, std::shared_ptr playerInfo) {    
                switch (result.code) {    
                case ResultAPI::Success:    
                    // Success to sync IdP    
                    break;    
                case ResultAPI::AuthV4ConflictPlayer:    
                    // Account conflict    
                    break;    
                default:    
                    // Exceptional case    
                    break;    
                }    
    });

API Reference: com.hive.AuthV4.Helper.connect

// Hive SDK AuthV4 Request to sync with IdP    
        AuthV4.Helper.connect(ProviderType providerType, new AuthV4.Helper.AuthV4HelperListener() {    
            @Override    
            public void onAuthV4Helper(ResultAPI result, AuthV4.PlayerInfo playerInfo) {    
                switch(result.code) {    
                    case Success:    
                        // Success to sync IdP    
                        break;    
                    case AuthV4ConflictPlayer:    
                        // Account conflict    
                        break;    
                    default:    
                        // Exceptional case    
                        break;    
                }    
            }    
    });

API Reference: HIVEAuthV4Helper::connect:handler:

// Hive SDK AuthV4 Request to sync with IdP    
        [[HIVEAuthV4 helper] connect:providerType handler:^(HIVEResultAPI *result, HIVEPlayerInfo *playerInfo) {    
            switch(result.code) {    
            case kSuccess:    
                // Success to sync IdP    
                break;    
            case kAuthV4ConflictPlayer:    
                // Account conflict    
                break;    
            default:    
                // Exceptional case    
                break;    
            }    
    }];

Handling account conflicts with IdP Sync

When connect() is called for IdP integration, if the IdP account the user is trying to connect to is already linked to another PlayerID, an account conflict occurs. For the further explanation, we assume the following situation.

  • CurrentPlayer: The player of the account that a user is currently logged into (guest account or IdP account)
  • ConflictPlayer: The player that already exists in the IdP account the user wants to link

When ConflictPlayer's game playing record exists in the game server

In this case, when an account conflict occurs, the ConflictPlayer's play information is notified to the user and the UI for choosing the ConflictPlayer is exposed. To use the UI provided by the Hive SDK, configure ConflictPlayer information to fit the game and call the showConflict() method with the ConflictPlayer information as a parameter. When called, you can convert to the ConflictPlayer or select Cancel to continue playing the game with the CurrentPlayer. In the UI image example below, clicking the check button switches over to the ConflictPlayer, and clicking the X button continues the game with the CurrentPlayer.

Note

The account selection UI can be the UI provided by the Hive SDK or can be customized by the game side. For customizing the account selection UI, refer to Customizing in IdP Conflict.

When ConflictPlayer's game playing record does not exist in the game server

Sometimes, only the player identifier (PlayerId) of ConflictPlayer exists but there is no actual play record on the game server. In this case, call resolveConflict(CB) to select the CurrentPlayer's PlayerID and continue the game. Expose the following UI when an account conflict occurs.

  • When CurrentPlayer is a guest account and ConflictPlayer is an IdP account

    • "Confirm" button is exposed, and when a user clicks it, CurrentPlayer remains logged in
  • When CurrentPlayer is IdP account 1 (example: Facebook) and ConflictPlayer is IdP account 2 (example: Google Play)

    • Cancel: Stay logged in with your current CurrentPlayer of the Facebook account
    • Confirm: Switch player to the ConflictPlayer of the Google Play account

When ConflictPlayer is a restricted account

When the ConflictPlayer (IdP account) is in a restricted state, if the CurrentPlayer (IdP account or guest account) attempts to connect on another device using AuthV4.connect, there will be no account conflict, and instead, a restriction popup will be displayed. If the app user closes the restriction popup, AuthV4.connect will return an error, and the attempt of the CurrentPlayer to connect to this IdP will fail.

Example 1: When CurrentPlayer is an IdP account

If the previously linked Facebook IdP account (ConflictPlayer) is in a suspended state and the user attempts to link the Google IdP (CurrentPlayer), a suspension popup will appear. Closing the popup will log out the Facebook IdP.

Example 2: When CurrentPlayer is a guest account

If the previously linked Facebook IdP account (ConflictPlayer) is in a suspended state and the user attempts to link to the Facebook IdP with a guest account (CurrentPlayer), a suspension popup will appear. Closing the popup will log out the Facebook IdP.

Notes on account selection

If a user selects ConflictPlayer and CurrentPlayer is in guest status, CurrentPlayer is no longer found. And If CurrentPlayer has data from another game server in the guest status, that game data also will no longer be found. Therefore, you should prevent users from making changes to the game server when they are guests to avoid this problem. If the user taps X button in the account selection page provided by the SDK, the account sync is canceled.

Composition of game data

ConflictPlayer data is composed of two essential keys, player_id and game_data.

  • player_id: PlayerID of ConflictPlayer
  • game_data: Organize the game data such as character name, the amount of game money, and level as Map<String, Object >; format

Following is a sample code to compose the data of ConflictPlayer.

{"player_id":123, "game_data":{"Name":"ConflictPlayer", "Level":52}}

Implementing account selection UI from Hive SDK (with game playing data)

Once you completed to configure the ConflictPlayer data, the showConflict () method is called to expose the UI provided by the SDK and the user's choice will be returned as a result. If the result is successful and the user selects the ConflictPlayer, then you need to load the game data again. The result returns failure when user skips or fails to select an account, and in this case, make sure to continue the game play as is. However, if failed to authenticate the device on a switched account (AuthV4NotRegisteredDevice), the game has to go back to the initial page so as to log in again. It causes that login to SDK is canceled and isAutoSignIn returns true.

Followings are sample codes to implement the UI which Hive SDK provides by configuring game data of the conflicted PlayerID.

API Reference: hive .AuthV4.Helper.showConflict

// create game info object of the conflicted account    
    AuthV4.Helper.ConflictSingleViewInfo conflictInfo = new AuthV4.Helper.ConflictSingleViewInfo(playerId);    
    conflictInfo.setValue("Gold", 2048);    
    conflictInfo.setValue("Gem", 220);    
    // Request Hive SDK AuthV4.Helper account selection UI    
    AuthV4.Helper.showConflict (conflictInfo, (ResultAPI result, AuthV4.PlayerInfo playerInfo) =>; {    
        if (result. needExit()) {    
            // TODO: implement the termination of the app.    
            // Example) Application.Quit();    
        } else {    
            switch(result.code) {    
                case ResultAPI.Code.AuthV4PlayerChange:    
                    // account switching: game restart required    
                    break;    
                case ResultAPI.Code.AuthV4PlayerResolved:    
                    // keep current user    
                    break;    
                case ResultAPI.Code.AuthV4NotRegisteredDevice:    
                    // This is the case that the login is canceled due to device authentication failure. Try logging in back with AUTO, or log out.    
                    break;    
                default:    
                    // handle other exceptions    
                    break;    
            }    
        }    
});
#include "HiveAuthV4.h"

int64 PlayerId = 12345678;
FHiveConflictSingleViewData ViewData = FHiveConflictSingleViewData(PlayerId);
ViewData.SetData(TEXT("Gold"), TEXT("2048"));
ViewData.SetData(TEXT("Gem"), TEXT("220"));

FHiveAuthV4::Helper::ShowConflict(ViewData, FHiveAuthV4HelperDelegate::CreateLambda([this](const FHiveResultAPI& Result, const TOptional<FHivePlayerInfo>& PlayerInfo) {
        if (Result.NeedExit()) {
                // TODO: implement the termination of the app.    
      // Example) Application.Quit();
        } else {
                switch (Result.Code) {
                        case FHiveResultAPI::ECode::AuthV4PlayerChange:
                                // account switching: game restart required
                                break;
                        case FHiveResultAPI::ECode::AuthV4PlayerResolved:
                                // keep current user
                                break;
                        case FHiveResultAPI::ECode::AuthV4NotRegisteredDevice:
                                // This is the case that the login is canceled due to device authentication failure. Try logging in back with AUTO, or log out.
                                break;
                        default:
                                // handle other exceptions 
                                break;
                }
        }
}));

API Reference: AuthV4 ::Helper::showConflict

// create game info object of the conflicted account    
    ConflictSingleViewInfo* conflictInfo = new ConflictSingleViewInfo(playerId);    
    conflictInfo->;SetValue("Gold", 2048);    
    conflictInfo->;SetValue("Gem", 220);    


    // Hive SDK AuthV4::Helper account selection UI request    
    AuthV4::Helper::showConflict(*conflictInfo, [=](ResultAPI const &amp; result, std::shared_ptr playerInfo) {    
            if (result. needExit()) {    
                // TODO: implement the termination of the app.    
                // Users of the Cocos2d-x engine    
                // ex) exit(0);    
                // Unreal engine users    
                // Example) UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit, false);    

            } else {    
                switch(result.code) {    
                    case ResultAPI::AuthV4PlayerChange:    
                        // account switching: game restart required    
                        break;    
                    case ResultAPI::AuthV4PlayerResolved:    
                        // keep current user    
                        break;    
                    case ResultAPI::Code::AuthV4NotRegisteredDevice:    
                        // This is the case that the login is canceled due to device authentication failure. Try logging in back with AUTO, or log out.    
                        break;    
                    default:    
                        // handle other exceptions    
                        break;    
                }    
            }    
});

API Reference: com.hive.AuthV4.Helper.showConflict

// create game info object of the conflicted account    
    val conflictInfo = AuthV4.Helper.ConflictSingleViewInfo(playerId)    
    conflictInfo.setValue("Gold", 2048)    
    conflictInfo.setValue("Gem", 220)    

    // Request Hive SDK AuthV4.Helper account selection UI    
    AuthV4.Helper.showConflict(conflictInfo, object : AuthV4.Helper.AuthV4HelperListener {    
            override fun onAuthV4Helper(result: ResultAPI, playerInfo: AuthV4.PlayerInfo?) {    
                if (result. needExit()) {    
                    // TODO: implement the termination of the app.    
                    // ex) exitProcess(0)    
                } else {    
                    when (result.code) {    
                        ResultAPI.Code.AuthV4PlayerChange ->; {    
                            // account switching: game restart required    
                        }    
                        ResultAPI.Code.AuthV4CancelDialog ->; {    
                            // keep current user    
                        }    
                        ResultAPI.Code.AuthV4NotRegisteredDevice ->; {    
                            // This is the case that the login is canceled due to device authentication failure. Try logging in back with AUTO, or log out.    
                        }    
                        else ->; {    
                            // handle other exceptions    
                        }    
                    }    
                }    
            }    
})

API Reference: com .hive.AuthV4.Helper.showConflict

// create game info object of the conflicted account    
    AuthV4.Helper.ConflictSingleViewInfo conflictInfo = new AuthV4.Helper.ConflictSingleViewInfo(playerId);    
    conflictInfo.setValue("Gold", 2048);    
    conflictInfo.setValue("Gem", 220);    


    // Request Hive SDK AuthV4.Helper account selection UI    
    AuthV4.Helper.showConflict(conflictInfo, new AuthV4.Helper.AuthV4HelperListener() {    
            @Override    
            public void onAuthV4Helper(ResultAPI result, AuthV4.PlayerInfo playerInfo) {    

                if (result. needExit()) {    
                    // TODO: implement the termination of the app.    
                    // ex) System.exit(0);    
                } else {    
                    switch(result.code) {    
                        case AuthV4PlayerChange:    
                            // account switching: game restart required    
                            break;    
                        case AuthV4CancelDialog:    
                            // keep current user    
                            break;    
                        case AuthV4NotRegisteredDevice:    
                            // This is the case that the login is canceled due to device authentication failure. Try logging in back with AUTO, or log out.    
                            break;    
                        default:    
                            // handle other exceptions    
                            break;    
                    }    
                }    
            }    
});

API Reference: HIVEAuthV4Helper::showConflict:handler:

// create game info object of the conflicted account    
    let conflictInfo = ConflictSingleViewInfo(playerId: 12345678)    
    conflictInfo.setValue("Gold", intValue: 2048)    
    conflictInfo.setValue("Gem", intValue: 220)    

    // Hive SDK AuthV4:Helper account selection UI request    
    AuthV4Interface.helper().showConflict(conflictInfo) { (result, playerInfo) in    

            if result.needExit() {    
                // TODO: implement the termination of the app.    
                // ex) exit(0)    
            } else {    
                switch result.getCode() {    
                case .authV4PlayerChange:    
                    // account switching: game restart required    
                case .authV4CancelDialog:    
                    // keep current user    
                case .authV4NotRegisteredDevice:    
                    // This is the case that the login is canceled due to device authentication failure. Try logging in back with AUTO, or log out.    
                default:    
                    // handle other exceptions    
                    break    
                }    
            }    
}

API Reference: HIVEAuthV4Helper ::showConflict:handler:

// create game info object of the conflicted account    
    HIVEConflictSingleViewInfo *conflictInfo = [[HIVEConflictSingleViewInfo alloc] initWithPlayerId:12345678];    
    [conflictInfo setValue:@"Gold" intValue:2048];    
    [conflictInfo setValue:@"Gem" intValue:220];    


    // Hive SDK AuthV4:Helper account selection UI request    
    [[HIVEAuthV4 helper] showConflict:conflictInfo handler:^(HIVEResultAPI *result, HIVEPlayerInfo *playerInfo) {    

            if (result. needExit) {    
                // TODO: implement the termination of the app.    
                // ex) exit(0);    
            } else {    
                switch(result.code) {    
                    case kAuthV4PlayerChange:    
                        // account switching: game restart required    
                        break;    
                    case kAuthV4CancelDialog:    
                        // keep current user    
                        break;    
                    case kAuthV4NotRegisteredDevice:    
                        // This is the case that the login is canceled due to device authentication failure. Try logging in back with AUTO, or log out.    
                        break;    
                    default:    
                        // handle other exceptions    
                        break;    
                }    
            }    
}];

Implementing account selection UI from Hive SDK (without game data or with unknown data)

If you can't verify game data at the time of displaying account-selecting UI or just inform to the change in sign-in, the simplified UI is suitable for the cases. The result returns failure when user skips or fails to select an account, and in this case, make sure to continue the game play as is. However, if failed to authenticate the device on a switched account (AuthV4NotRegisteredDevice), the game has to go back to the initial page so as to log in again. It causes that login to SDK is canceled and isAutoSignIn returns true.

Followings are sample codes to implement the UI which Hive SDK provides by hiding game data of the conflicted PlayerID.

API Reference: hive .AuthV4.Helper.showConflict

// Request Hive SDK AuthV4.Helper account selection UI    
    AuthV4.Helper.showConflict ((ResultAPI result, AuthV4.PlayerInfo playerInfo) =>; {    
        if (result. needExit()) {    
            // TODO: implement app exit functionality    
            // Example) Application.Quit();    
        } else {    
            switch(result.code) {    
                case ResultAPI.Code.AuthV4PlayerChange:    
                    // account switching: game restart required    
                    break;    
                case ResultAPI.Code.AuthV4PlayerResolved:    
                    // keep current user    
                    break;    
                case ResultAPI.Code.AuthV4NotRegisteredDevice:    
                    // This is the case when login is canceled due to device authentication failure. Try logging back in with AUTO or log out.    
                    break;    
                default:    
                    // handle other exceptions    
                    break;    
            }    
        }    
});
#include "HiveAuthV4.h"

FHiveAuthV4::Helper::ShowConflict(FHiveAuthV4HelperDelegate::CreateLambda([this](const FHiveResultAPI& Result, const TOptional<FHivePlayerInfo>& PlayerInfo) {
        if (Result.NeedExit()) {
                // TODO: implement app exit functionality    
            // Users of the Cocos2d-x engine    
            // ex) exit(0);    
            // Unreal engine users    
            // Example) UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit, false);  
        } else {
                switch (Result.Code) {
                        case FHiveResultAPI::ECode::AuthV4PlayerChange:
                                // account switching: game restart required.
                                break;
                        case FHiveResultAPI::ECode::AuthV4PlayerResolved:
                                // keep current user
                                break;
                        case FHiveResultAPI::ECode::AuthV4NotRegisteredDevice:
                                // This is the case when login is canceled due to device authentication failure. Try logging back in with AUTO or log out.
                                break;
                        default:
                                // handle other exceptions
                                break;
                }
        }
}));

API Reference: AuthV4 ::Helper::showConflict

// Hive SDK AuthV4::Helper account selection UI request    
    AuthV4::Helper::showConflict([=](ResultAPI const &amp; result, std::shared_ptr playerInfo) {    
        if (result. needExit()) {    
            // TODO: implement app exit functionality    
            // Users of the Cocos2d-x engine    
            // ex) exit(0);    
            // Unreal engine users    
            // Example) UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit, false);    
        } else {    
            switch(result.code) {    
                case ResultAPI::AuthV4PlayerChange:    
                    // account switching: game restart required    
                    break;    
                case ResultAPI::AuthV4PlayerResolved:    
                    // keep current user    
                    break;    
                case ResultAPI::Code::AuthV4NotRegisteredDevice:    
                    // This is the case when login is canceled due to device authentication failure. Try logging back in with AUTO or log out.    
                    break;    
                default:    
                    // handle other exceptions    
                    break;    
            }    
        }    
});

API Reference: com.hive.AuthV4.Helper.showConflict

// Request Hive SDK AuthV4.Helper account selection UI    
    AuthV4.Helper.showConflict(object : AuthV4.Helper.AuthV4HelperListener {    
        override fun onAuthV4Helper(result: ResultAPI, playerInfo: AuthV4.PlayerInfo?) {    
            if (result. needExit()) {    
                // TODO: implement app exit functionality    
                // ex) exitProcess(0)    
            } else {    
                when (result.code) {    
                    ResultAPI.Code.AuthV4PlayerChange ->; {    
                        // account switching: game restart required    
                    }    
                    ResultAPI.Code.AuthV4CancelDialog ->; {    
                        // keep current user    
                    }    
                    ResultAPI.Code.AuthV4NotRegisteredDevice ->; {    
                        // This is the case when login is canceled due to device authentication failure. Try logging back in with AUTO or log out.    
                    }    
                    else ->; {    
                        // handle other exceptions    
                    }    
                }    
            }    
        }    
})

API Reference: com .hive.AuthV4.Helper.showConflict

// Request Hive SDK AuthV4.Helper account selection UI    
    AuthV4.Helper.showConflict(new AuthV4.Helper.AuthV4HelperListener() {    
        @Override    
        public void onAuthV4Helper(ResultAPI result, AuthV4.PlayerInfo playerInfo) {    
            if (result. needExit()) {    
                // TODO: implement app exit functionality    
                // ex) System.exit(0);    
            } else {    
                switch(result.code) {    
                    case AuthV4PlayerChange:    
                        // account switching: game restart required    
                        break;    
                    case AuthV4CancelDialog:    
                        // keep current user    
                        break;    
                    case AuthV4NotRegisteredDevice:    
                        // This is the case when login is canceled due to device authentication failure. Try logging back in with AUTO or log out.    
                        break;    
                    default:    
                        // handle other exceptions    
                        break;    
                }    
            }    
        }    
});

API Reference: HIVEAuthV4Helper::showConflict:

// Hive SDK AuthV4:Helper account selection UI request    
    AuthV4Interface.helper().showConflict() { (result, playerInfo) in    

        if result.needExit() {    
            // TODO: implement app exit functionality    
            // ex) exit(0)    
        } else {    
            switch result.getCode() {    
            case .authV4PlayerChange:    
                // account switching: game restart required    
            case .authV4CancelDialog:    
                // keep current user    
            case .authV4NotRegisteredDevice:    
                // This is the case when login is canceled due to device authentication failure. Try logging back in with AUTO or log out.    
            default:    
                // handle other exceptions    
                break    
            }    
        }    
}

API Reference: HIVEAuthV4Helper ::showConflict:

// Hive SDK AuthV4:Helper account selection UI request    
    [[HIVEAuthV4 helper] showConflict:^(HIVEResultAPI *result, HIVEPlayerInfo *playerInfo) {    

        if (result. needExit) {    
            // TODO: implement app exit functionality    
            // ex) exit(0);    
        } else {    
            switch(result.code) {    
                case kAuthV4PlayerChange:    
                    // account switching: game restart required    
                    break;    
                case kAuthV4CancelDialog:    
                    // keep current user    
                    break;    
                case kAuthV4NotRegisteredDevice:    
                    // This is the case when login is canceled due to device authentication failure. Try logging back in with AUTO or log out.    
                    break;    
                default:    
                    // handle other exceptions    
                    break;    
            }    
        }    
}];

Customization in case of IdP conflict

If IdP conflicts in the middle of IdP sync process, you can configure the game data by using the returned conflict PlayerID and implement the account selection UI directly in the game. If the user selects an account on the selection UI, implement the selectConflict() method with the PlayerID of the selected account as a parameter.

In the following description, the currently logged-in account is called CurrentPlayer, and the account occurred conflict is called ConfilctPlayer. When customizing the account selection UI, it is necessary to check the difference of the action by the user's selection and notify the appropriate precautions in the UI configuration. When IdP conflicts, following issues may occur depending on the user selection.

  • Choosing ConfilctPlayer: selectConflict(ConfilctPlayer, CB) is called.
    • If CurrentPlayer is a guest, CurrentPlayer is unavailable to search.
  • Choosing CurrentPlayer: selectConflict(CurrentPlayer, CB) is called.
    • CurrentPlayer is sync with IdP, so ConfilctPlayer is out of sync.
    • If ConflictPlayer is out of sync with other IdPs, so-called guest status, may cause ConflictPlayer unavailable to search.
  • If cancelled (user just close the selection page): resolveConflict(CB) is called.
    • Keep playing the game with CurrentPlayer, without any change in IdP sync.

You need to configure the appropriate caution statement when configuring the account selection UI, because in some circumstances, unselected data may not be found in the guest state. Also, if you want to configure not to change the IdP-linked information in case of an account conflict, make sure to select the game data of ConflictPlayer or design the UI available to cancel the account selection.

Once the user selects an account on the account selection UI, implement the selectConflict() method with the PlayerID of the selected account as a parameter. If the user cancels the account selection, ensure to continue the game without calling any API. After the player chooses ConflictPlayer and receives a successful callback, make sure to load the game data again.

Followings are sample codes to select an account due to account conflict.

API Reference: AuthV4::Conflict

long long selectedPlayerId = 1234567890;    
    // Select Hive SDK AuthV4 Account Conflict    
    AuthV4::selectConflict(selectedPlayerId, [=](ResultAPI const &amp; result,PlayerInfo const &amp; playerInfo) {    

            if (result. isSuccess()) {    
                //account selection successful    
            } else if (result. needExit()) {    
                // TODO: implement app exit functionality    
                // Users of the Cocos2d-x engine    
                // ex) exit(0);    
                // Unreal engine users    
                // Example) UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit, false);    
            }    
});
#include "HiveAuthV4.h"

int64 SelectedPlayerId = 12345678;
FHiveAuthV4::SelectConflict(SelectedPlayerId,
                                                        FHiveAuthV4OnSignInDelegate::CreateLambda([this](const FHiveResultAPI& Result, const FHivePlayerInfo& PlayerInfo) {
        if (Result.IsSuccess()) {
                // account selection successful  
        } else if (Result.NeedExit()) {
                // TODO: implement app exit functionality    
                    // ex) exitProcess(0)
        }
}));

API Reference: com.hive.AuthV4.selectConflict

val selectedPlayerId: Long = 1234567890    

    // Select Hive SDK AuthV4 Account Conflict    
    AuthV4.selectConflict(selectedPlayerId, object : AuthV4.AuthV4SignInListener {    
            override fun onAuthV4SignIn(result: ResultAPI, playerInfo: AuthV4.PlayerInfo?) {    
                if (result. isSuccess) {    
                    //account selection successful    
                } else if (result. needExit()) {    
                    // TODO: implement app exit functionality    
                    // ex) exitProcess(0)    
                }    
            }    
})

API Reference: com.hive.AuthV4.selectConflict

long selectedPlayerId = 1234567890;    

    // Select Hive SDK AuthV4 Account Conflict    
    AuthV4.selectConflict(selectedPlayerId, new AuthV4.AuthV4SignInListener() {    
            @Override    
            public void onAuthV4SignIn(ResultAPI result, AuthV4.PlayerInfo playerInfo) {    

                if(result. isSuccess()) {    
                    //account selection successful    
                }    
                else if (result. needExit()) {    
                    // TODO: implement app exit functionality    
                    // ex) System.exit(0);    
                }    
            }    
});

API Reference: HIVEAuthV4:selectConflict

let selectedPlayerId: Int64 = 1234567890;    

    // Hive SDK AuthV4 account conflict selection request    
    AuthV4Interface.selectConflict(selectedPlayerId) { (result, playerInfo) in    
            if result. isSuccess() {    
                //account selection successful    
            }    
            else if result. needExit() {    
                // TODO: implement app exit functionality    
                // ex) exit(0)    
            }    
}

API Reference: HIVEAuthV4:selectConflict

long long selectedPlayerId = 1234567890;    

    // Hive SDK AuthV4 account conflict selection request    
    [HIVEAuthV4 selectConflict:selectedPlayerId handler:^(HIVEResultAPI *result, HIVEPlayerInfo *playerInfo) {    

            if (result. isSuccess) {    
                //account selection successful    
            }    
            else if (result. needExit) {    
                // TODO: implement app exit functionality    
                // ex) exit(0);    
            }    
}];

Disconnect from IdP accounts

You can allow users unlink the linked IdP accounts on the IdP account list UI. If a user unlinks a specific IdP account on the IdP account list UI, the game studio calls the disconnect() method with the ProviderType argument, which is the specific kind of IdP, to disconnect from the IdP account. After calling disconnect() method, you need to check the connection status of users and then update the synced IdP list on the UI.

Note

Windows environment does not support guest login unlike mobile. Therefore, if you try to call the Disconnect API while only one IdP is synced, AuthV4LastProviderCantDisconnect is returned as the Result API Code, and the sync status is maintained.

API Reference: hive .AuthV4.Helper.disconnect

using hive;    
    AuthV4.Helper.disconnect (AuthV4.ProviderType.HIVE, delegate (ResultAPI result, AuthV4.PlayerInfo playerInfo) {    
       switch (result.code) {    
         case ResultAPI.Code.Success:    
           // Provider disconnection successful    
           break;    
         default:    
           // other exception situations    
           break;    
       }    
});
#include "HiveAuthV4.h"

EHiveProviderType ProviderType = EHiveProviderType::HIVE;
FHiveAuthV4::Helper::Disconnect(ProviderType, FHiveAuthV4HelperDelegate::CreateLambda([this](const FHiveResultAPI& Result, const TOptional<FHivePlayerInfo>& PlayerInfo) {
        switch (Result.Code) {
                case FHiveResultAPI::ECode::Success:
                        // Provider disconnection successful
                        break;
                default:
                        // other exception situations  
                        break;
        }
}));

API Reference: AuthV4 ::Helper::disconnect

#include <HIVE_SDK_Plugin/HIVE_CPP.h>    
    using namespace std;    
    using namespace hive;    
    AuthV4::Helper::disconnect(ProviderType::HIVE, [=](ResultAPI const & result, shared_ptr playerInfo) {    
    switch (result.code) {    
    case ResultAPI::Success:    
        // Provider disconnection successful    
        break;    
        default:    
        // other exception situations    
        break;    
    }    
});

API Reference: Helper.disconnect

import com.hive.AuthV4    
    import com.hive.ResultAPI    
    AuthV4.Helper.disconnect(AuthV4.ProviderType.HIVE, object : AuthV4.Helper.AuthV4HelperListener {    
         override fun onAuthV4Helper(result: ResultAPI, playerInfo: AuthV4.PlayerInfo?) {    
             when (result.code) {    
                 ResultAPI.Code.Success -> {    
                     // Provider disconnection successful    
                 }    
                 else -> {    
                     // other exception situations    
                 }    
             }    
         }    
})

API Reference: com .hive.AuthV4.Helper.disconnect

import com.hive.AuthV4;    
    import com.hive.ResultAPI;    
    AuthV4.Helper.INSTANCE.disconnect(AuthV4.ProviderType.HIVE, (result, playerInfo) -> {    
         switch (result.getCode()) {    
             case Success:    
                 // Provider disconnection successful    
                 break;    
             default:    
                 // other exception situations    
                 break;    
         }    
});

API Reference: .disconnect

import HIVEService    
    AuthV4Interface.helper().disconnect(.Hive) { result, playerInfo in    
        switch result.getCode() {    
            case.success:    
            // Provider disconnection successful    
            default:    
            // other exception situations    
            break    
        }    
}

API Reference: HIVEAuthV4Helper ::disconnect:handler:

#import <HIVEService/HIVEService-Swift.h>    
    [[HIVEAuthV4 helper] disconnect: HIVEProviderTypeHive handler: ^(HIVEResultAPI *result, HIVEPlayerInfo *playerInfo) {    
       switch ([result getCode]) {    
    case HIVEResultAPICodeSuccess:    
           // Provider disconnection successful    
           break;    
         default:    
           // other exception situations    
           break;    
       }    
}];

The game studios can choose from the policies below when implementing IdP disconnection. 1. Unlink all IdP accounts and allow using a guest account. 2. Force to keep at least one IdP account linked.

Disconnect from IdP accounts: allow unlink all IdP accounts

The game studios can allow users unlink all IdP accounts and use a guest account. If a user use a guest account, the account cannot be recovered if the guest account is lost due to initialization or reinstallation of the game. Therefore, if a user tries to unlink the last IdP linked, use the phrase below to pop up the guidance about the guest user so that this user can reconsider unlinking. Note that a PlayerID will not be logged out even if its corresponding IdP is unlinked.

  • If you want to unlink the last IdP account linked
Language Phrase
Korean 마지막 계정 연동을 해제할 경우 게스트 상태로 전환됩니다. 게스트로 전환될 경우 디바이스를 초기화하거나 게임 재설치 시 게임 데이터가 삭제됩니다. 계정 연동 해제를 계속 진행하시겠습니까?
English If you unsync the last account, you will be transferred to a guest account. Once you become a guest, your game data will be deleted when you reset the device or reinstall the game. Are you sure you want to proceed with account unsync?
Japanese 最後のアカウントの連動を解除すると、ゲストアカウントに切り替わります。ゲストアカウントに切り替わると、端末初期化またはゲームの再インストール時にゲームデータが削除されます。 アカウントの連動を解除しますか?
Chinese (Simplified) 解除最后一个账号关联时,将转换为游客状态。转换为游客状态后,重置设备或重装游戏时,游戏数据将被删除。确定要继续解除关联吗?
Chinese (Traditional) 解除最後一個綁定的帳號時,將會切換為訪客帳號。使用訪客帳號時,若重置裝置或重新安裝遊戲,將會刪除遊戲數據。 確定要繼續解除帳號綁定?
French Si vous dissociez le dernier compte, votre compte sera converti en ""invité"". Si vous devenez ""invité"", votre historique de jeu sera supprimé lors de toute réinitialisation de votre appareil ou suppression du jeu. Êtes-vous sûr de vouloir procéder à la dissociation du compte ?
German Wenn du die Synchronisation des letzten Kontos aufhebst, wird dein Konto in ein Gastkonto umgewandelt. Sobald du ein Gast bist, werden deine Spieldaten gelöscht, wenn du dein Gerät zurücksetzt oder das Spiel neu installierst. Bist du sicher, dass du die Synchronisation des Kontos aufheben möchtest?
Russian Если Вы отключите синхронизацию с последним аккаунтом, Ваша игровая учетная запись будет преобразована в гостевую. Если Вы используете гостевой аккаунт, Ваши игровые данные будут удалены при сбросе настроек устройства или переустановке игры. Вы действительно хотите отключить синхронизацию?
Spanish Si desvinculas la última cuenta, tu cuenta se convertirá en invitado. Si te conviertes en invitado, los datos del juego se eliminará cada vez que reinicies tu dispositivo o elimines el juego. ¿Estás seguro de que deseas desvincular la cuenta?
Portuguese Se você dessincronizar a sua última conta, você será transferido para uma conta de convidado. Ao se tornar um convidado, os dados do seu jogo serão excluídos quando você resetar o aparelho ou reinstalar o jogo. Tem certeza de que deseja cancelar a sincronização da conta?
Indonesian Jika kamu batal sinkronisasi akun terakhir, akunn kamu akan diganti menjadi akun guest. Ketika kamu menjadi guest, data permainanmu akan dihapus ketika kamu mereset perangkat atau menginstall ulang game. Apakah kamu yakin mau membatalkan sinkronisasi akun?
Vietnamese Nếu bạn hủy đồng bộ tài khoản cuối cùng, bạn sẽ được chuyển sang tài khoản Khách. Khi bạn trở thành Khách, dữ liệu chơi game của bạn sẽ bị xóa khi bạn reset thiết bị hoặc cài đặt lại game. Bạn có chắc chắn muốn tiếp tục hủy đồng bộ tài khoản?
Thai หากคุณยกเลิกการซิงค์บัญชีล่าสุด บัญชีของคุณจะย้อนกลับไปเป็นบัญชี Guest หากบัญชีคุณกลายเป็นบัญชี Guest ข้อมูลเกมของคุณจะถูกลบเมื่อคุณรีเซ็ตอุปกรณ์เล่นเกมหรือติดตั้งเกมใหม่อีกครั้ง ดำเนินการต่อโดยไม่ซิงค์บัญชีหรือไม่?
Italian Annullando la sincronizzazione dell'ultimo account, verrai trasferito/a a un account ospite. Una volta trasferito/a a un account ospite, i tuoi dati di gioco verranno eliminati in caso di ripristino di dispositivo o di reinstallazione del gioco. Sei sicuro/a di voler procedere con l'annullamento della sincronizzazione dell'account?
Turkish Son hesap senkronizasyonunu kaldırırsanız, misafir hesabına geçersiniz. Hesabınız misafire dönüştürüldüğünde, cihazı sıfırladığınızda veya oyunu yeniden yüklediğinizde oyun verileriniz silinir. Hesap senkronizasyonunu kaldırma işlemine devam etmek istediğinizden emin misiniz?
Arabic إذا ألغيت مزامنة الحساب الأخير ، فسيتم نقلك إلى حساب ضيف. وبمجرد أن تصبح ضيفًا ، سيتم حذف بيانات اللعبة عند إعادة ضبط الجهاز أو إعادة تثبيت اللعبة. هل أنت متأكد أنك تريد متابعة حساب غير متزامن؟

If a user chooses to unlink the account even though the phrase above is exposed, call disconnect(). When a user account becomes a guest account, the following phrase can be exposed.

  • If a user account becomes a guest account after disconnected from the last IdP linked
Language Phrase
Korean 게스트 상태로 전환되었습니다. 계정 연동을 하시면 게임 데이터를 안전하게 지킬 수 있습니다.
English You've been transferred to a guest account. By synchronizing your account, you can secure your game data.
Japanese ゲストアカウントに切り替わりました。 アカウントを連動することでゲームデータを守ることができます。
Chinese (Simplified) 已转换为游客状态。 关联账号时,有助于保护游戏数据。
Chinese (Traditional) 已切換為訪客帳號。 請綁定帳號,保護您的遊戲數據。
French Vous êtes passé en compte ""invité"". En liant votre compte, vous pourrez garantir la protection de vos données de jeu.
German Dein Konto wurde in ein Gastkonto umgewandelt. Du kannst deine Spieldaten sichern, indem du dein Konto synchronisierst.
Russian Ваш аккаунт был преобразован в гостевой. Синхронизовав аккаунт, Вы можете защитить свои игровые данные.
Spanish Has cambiado a la cuenta de invitado. Al vincular tu cuenta, podrás garantizar la protección de los datos de tu juego.
Portuguese Você foi transferido para uma conta de convidado. Ao sincronizar a sua conta, você pode proteger os dados do seu jogo.
Indonesian Statusmu telah diubah menjadi guest. Dengan mensinkronisasikan akun, kamu bisa menjaga data permainanmu agar tetap aman.
Vietnamese Bạn đã được chuyển sang tài khoản Khách. Bạn có thể bảo vệ dữ liệu chơi game của mình bằng cách đồng bộ tài khoản.
Thai บัญชีคุณย้อนกลับไปเป็นบัญชี Guest แล้ว คุณสามารถรักษาข้อมูลเกมของคุณให้ปลอดภัยด้วยการซิงค์บัญชีของคุณ
Italian Sei stato/a trasferito/a a un account ospite. Sincronizzando il tuo account, puoi proteggere i tuoi dati di gioco.
Turkish Hesabınız misafir hesap olarak değiştirildi. Hesabınızı bağlayarak oyun verilerinizi güvende tutabilirsiniz.
Arabic لقد تم نقلك إلى حساب ضيف. من خلال مزامنة حسابك ، يمكنك تأمين سجلات لعبتك .

Disconnect from IdP accounts: maintain at least 1 account linked

The game studios may force users to keep at least one IdP account linked. When a user unlinks all IdP accounts, the user account is converted to a guest account, and if the guest account is lost due to initialization or reinstallation of the game, the account cannot be recovered. Therefore, if a user with a single linked IdP tries to unlink that IdP, you can implement a notification that restricts this by using the phrase below. Note that a PlayerID will not be logged out even if its corresponding IdP is unlinked.

  • If you want to unlink the last IdP account linked
Language Phrase
Korean 최소 1개의 계정 연동을 유지해야 합니다.
English You must keep at least 1 of your accounts synced.
Japanese 少なくとも1つのアカウントを連動しなければなりません。
Chinese (Simplified) 需要绑定至少1个账号。
Chinese (Traditional) 至少要有1個帳號是綁定的!
French Tu dois garder au moins l'un de tes comptes synchronisés.
German Du musst mindestens 1 deiner Konten synchronisieren.
Russian Хотя бы 1 из аккаунтов должен быть синхронизирован.
Spanish Debe de mantener al menos 1 de sus cuentas sincronizada.
Portuguese É necessário sincronizar pelo menos 1 das suas contas.
Indonesian Kamu harus punya paling tidak satu akun yang terhubung.
Vietnamese Bạn cần phải duy trì ít nhất 1 liên kết tài khoản.
Thai ต้องซิงค์บัญชีอย่างหน่อย 1 บัญชี
Italian Devi mantenere almeno 1 dei tuoi account sincronizzato.
Turkish En az 1 hesabınızı senkronize etmeniz gerekmektedir.
Arabic يجب أن تحتفظ على الأقل بحساب واحد متزامن من بين حساباتك.

Custom IdP sync

Custom IdP sync is a customized function that enable the implementation of custom IdP adopted by the game, away from the IdPs provided by Hive SDK. After calling the custom login API, you can check logged-in user information of custom IdP by accessing customProviderInfoData data with the PlayerInfo class instance that is passed as the callback result. ProviderType (enum) of customProviderInfoData is set to CUSTOM, and can be differentiated by ProviderName (String).

The following is an example code that implements custom IdP sync.

// Twitter sync that is implemented by the game itself.
    Game.Connect"CUSTOM_TWITTER", (string authKey) =>; {

        AuthV4.connectWithAuthKeyauthKey, (ResultAPI result, PlayerInfo playerInfo) =>; {
                switchresult.code) {
                case ResultAPI.Code.Success:
                    // sync success
                    break;
                case ResultAPI.Code.AuthV4ConflictPlayer:
                    // account conflict
                    Dictionary&lt;string, ProviderInfo>; customProviderInfoData = playerInfo.customProviderInfoData;
                    ProviderInfo providerInfo = customProviderInfoData["CUSTOM_TWITTER"];
                    // Check the following sync information for the user
                    providerInfo.providerType;     // ProviderType.CUSTOM, providerType is fixed to ProviderType.CUSTOM. To distinguish, use providerName.
                    providerInfo.providerName;   // "CUSTOM_TWITTER"
                    providerInfo.providerUserId;  // the user id for the Twitter login, implemented by the game itself.
                    break;
                default:
                    // Other exceptions
                    break;
                }
        });
    });
#include "HiveAuthV4.h"

// Twitter sync that is implemented by the game itself.
void GameConnect(const FString& AuthKey)
{
        FHiveAuthV4::ConnectWithAuthKey(AuthKey, FHiveAuthV4OnConnectDelegate::CreateLambda([this](const FHiveResultAPI& Result, const FHivePlayerInfo& ConflictPlayerInfo) {
                switch(Result.Code) {
                        case FHiveResultAPI::ECode::Success:
                                // sync success
                                break;
                        case FHiveResultAPI::ECode::AuthV4ConflictPlayer: {
                                // account conflict
                                TMap<FString, FHiveProviderInfo> CustomProviderInfoData = ConflictPlayerInfo.CustomProviderInfoData;
                                if (const FHiveProviderInfo* ProviderInfo = CustomProviderInfoData.Find(TEXT("CUSTOM_TWITTER"))) {
                                        // Check the following sync information for the user
                                        EHiveProviderType ProviderType = ProviderInfo->ProviderType; // ProviderType::CUSTOM, providerType is fixed to ProviderType::CUSTOM. To distinguish, use providerName.
                                        FString ProviderName = ProviderInfo->ProviderName; // "CUSTOM_TWITTER"
                                        FString ProviderUserId = ProviderInfo->ProviderUserId; // the user id for the Twitter login, implemented by the game itself.
                                }
                        }
                                break;
                        default:
                                // Other exceptions
                                break;
                }
        }));
}
// Twitter sync that is implemented by the game itself.
        Game::Connect"CUSTOM_TWITTER", [=]string authKey) {

            AuthV4::connectWithAuthKeyauthKey, [=]ResultAPI const &amp; result, PlayerInfo const &amp; playerInfo) {
                switch (result.code) {
                    case ResultAPI::Success:
                    // sync success
                    break;
                    case ResultAPI::AuthV4ConflictPlayer:
                    // account conflict
                    map&lt;string, ProviderInfo>; customProviderInfoData = playerInfo.customProviderInfoData;
                    ProviderInfo providerInfo = customProviderInfoData["CUSTOM_TWITTER"];
                    // Check the following sync information for the user
                    providerInfo.providerType;     // ProviderType::CUSTOM, providerType is fixed to ProviderType::CUSTOM. To distinguish, use providerName.
                    providerInfo.providerName;   // "CUSTOM_TWITTER"
                    providerInfo.providerUserId;  // the user id for the Twitter login, implemented by the game itself.
                    break;
                    default:
                    // Other exceptions
                    break;
                }
            });
        });
// Twitter sync that is implemented by the game itself.
        Game.Connect"CUSTOM_TWITTER") { authKey: String ->;

            AuthV4.connectWithAuthKeyresponse.authKey, object : AuthV4.AuthV4ConnectListener {
                override fun onAuthV4Connectresult: ResultAPI, conflictPlayer: AuthV4.PlayerInfo?) {
                    whenresult.code) {
                        case ResultAPI.Code.Success ->; {
                            // sync success
                        }
                        case ResultAPI.Code.AuthV4ConflictPlayer ->; {
                            // account conflict
                            playerInfo.customProviderInfoData["CUSTOM_TWITTER"]?.let { providerInfo ->;
                            providerInfo.providerType     // ProviderType.CUSTOM, providerType is fixed to ProviderType.CUSTOM. To distinguish, use providerName.
                            providerInfo.providerName   // "CUSTOM_TWITTER"
                            providerInfo.providerUserId  // the user id for the Twitter login, implemented by the game itself.
                        }
                        else ->; {
                            // Other exceptions
                        }
                    }
                }
            }
        }
// Twitter sync that is implemented by the game itself.
        Game.Connect"CUSTOM_TWITTER", new Callback) {
            @Override
            public void onResponseString authKey) {

                com.hive.AuthV4.INSTANCE.connectWithAuthKeyauthKey, new com.hive.AuthV4.AuthV4ConnectListener) {
                    @Override
                    public void onAuthV4ConnectResultAPI result, PlayerInfo conflictPlayer) {
                        switch (result.getCode)) {
                            case ResultAPI.Code.Success:
                                // sync success
                                break;
                            case ResultAPI.Code.AuthV4ConflictPlayer:
                                // account conflict
                                ProviderInfo providerInfo = conflictPlayer.getCustomProviderInfoData().get("CUSTOM_TWITTER");
                                providerInfo.getProviderType();     // ProviderType.CUSTOM, providerType is fixed to ProviderType.CUSTOM. To distinguish, use providerName.
                                providerInfo.getProviderName();   // "CUSTOM_TWITTER"
                                providerInfo.getProviderUserId();  // the user id for the Twitter login, implemented by the game itself.
                                break;
                            default:
                                // Other exceptions
                                break;
                        }
                    }
                });
            }
        });
// Twitter sync that is implemented by the game itself.
        Game.connect"CUSTOM_TWITTER") { (authKey) in

            AuthV4Interface.connectWithAuthKeyauthKey) { result, conflictPlayer in
                    switch(result.getCode()){
                    case .success:
                        // sync success
                        break
                    case .authV4ConflictPlayer:
                        // account conflict
                    guard let customProviderInfoData = playerInfo?.customProviderInfoData,
                            let providerInfo = customProviderInfoData["CUSTOM_TWITTER"] else {
                        // No sync information for the user, failure handling
                        return
                    }

                    // Check the following sync information for the user
                    providerInfo.providerType     // HIVEProviderTypeCustom, providerType is fixed to HIVEProviderTypeCustom. To distinguish, use providerName.
                    providerInfo.providerName   // "CUSTOM_TWITTER"
                    providerInfo.providerUserID  // the user id for the Twitter login, implemented by the game itself.
                        break
                    default:
                        // Other exceptions
                        break
                    }
                }
        }
// Twitter sync that is implemented by the game itself.
        [Game connect:@"CUSTOM_TWITTER" handler:^NSString* authKey) {

            [HIVEAuthV4 connectWithAuthKey:authKey handler:^HIVEResultAPI* result, HIVEPlayerInfo* playerInfo) {
                    switch(result.code) {
                    case kSuccess:
                        // sync success
                        break;
                    case kAuthV4ConflictPlayer:
                        // account conflict
                        NSDictionary&lt;NSString*, HIVEProviderInfo*>;* customProviderInfoData = playerInfo.customProviderInfoData;
                        ProviderInfo* providerInfo = [customProviderInfoData objectForKey:@"CUSTOM_TWITTER"];
                        // Check the following sync information for the user
                        providerInfo.providerType;  
    providerInfo.providerType     // HIVEProviderTypeCustom, providerType is fixed to HIVEProviderTypeCustom. To distinguish, use providerName.
                        providerInfo.providerName;   // "CUSTOM_TWITTER"
                        providerInfo.providerUserId;  // the user id for the Twitter login, implemented by the game itself.
                        break;
                    default:
                        // Other exceptions
                        break;
                    }
            }];
        }];

You can disable the sync with the customized IdP. Basically, the process is the same as disconnecting an IdP, but it requires providerName to request disconnection.

Note

Be ware to the situation in which all IdP sync are disconnected. See the NOTE in IdP disconnection part.

The following example codes show how to implement custom IdP disconnection.

string customProviderName = "CUSTOM_TWITTER";

AuthV4.disconnectWithName (customProviderName, delegate (ResultAPI result) {
    switch(result.code) {
    case ResultAPI.Code.Success:
        // Provider disconnection success
        break;
    default:
        // Other exceptions
        break;
    }
});
#include "HiveAuthV4.h"

FString CustomProviderName = TEXT("CUSTOM_TWITTER");
FHiveAuthV4::DisconnectWithName(CustomProviderName, FHiveAuthV4OnDisconnectDelegate::CreateLambda([this](const FHiveResultAPI& Result) {
        if (Result.IsSuccess()) {
                // Provider disconnection success
        } else {
                // Other exceptions
        }
}));
std::string customProviderName = "CUSTOM_TWITTER"

AuthV4::disconnectWithName(customProviderName, [=](ResultAPI const & result) {
        switch (result.code) {
        case ResultAPI::Success:
            // Provider disconnection success
            break;
        default:
            // Other exceptions
            break;
        }
});
val customProviderName = "CUSTOM_TWITTER"

AuthV4.disconnectWithName(customProviderName, object : AuthV4.AuthV4DisconnectListener {
    override fun onAuthV4Disconnect(result: ResultAPI) {

            when(result.code) {
            Success -> {
                // Provider disconnection success
            }
            else -> {
                // Other exceptions
            }
        }
    }
})
String customProviderName = "CUSTOM_TWITTER";

AuthV4.INSTANCE.disconnectWithName(customProviderName, new AuthV4.AuthV4DisconnectListener() {

    @Override
    public void onAuthV4Disconnect(ResultAPI result) {
        switch(result.code) {
            case Success:
                // Provider disconnection success
                break;
            default:
                // Other exceptions
                break;
        }
    }
});
let customProviderName = "CUSTOM_TWITTER"

AuthV4Interface.disconnectWithName(customProviderName) { result  in
        switch(result.getCode()){
        case .success:
            // Provider disconnection success
        break
        default:
            // Other exceptions
        break
        }
    }
NSString* customProviderName = @"CUSTOM_TWITTER";

[HIVEAuthV4 disconnectWithName:customProviderName handler:^(HIVEResultAPI *result) {
    switch(result.code) {
    case kSuccess:
        // Provider disconnection success
        break;
    default:
        // Other exceptions
        break;
    }
}];

Delete IdP and guest accounts

You need to configure the UI so that users can delete their accounts in the game.

  • Example of UI
Warning

Starting June 30, 2022, apps submitted to the App Store that support account creation must also let users initiate deletion of their account within the app. If you’re updating an app or submitting a new app with account creation, it is required to implement the account deletion API to prevent delays in review. See Apple policy guideline for more about the app deletion from the App Store.

Configure and expose the popup window in-game to confirm whether the users proceed to delete an account. You can check the phrase for the popup window below.

If the request for an accout deletion is confirmed, you can delete this Authentication v4 account by using Hive SDK API or Hive Server API.

  • The steps to delete an account

* **When deleting using Hive Server API**: <br>
Once the account is deleted on the game client side, the game server should call a Hive Server API [Deleting Authentication v4 Account](../../api/hive-server-api/auth/authv4-account-deletion.md) to send the information of the account deleted to the Authentication Server. The Authentication Server receives this info and deletes the account. After the deletion, the Authentication Server sends the result of account deletion to the game server, and the game server passes this to the game client. Once the game client received the results of the account deletion, it should provide the pop-up that inform an account has been deleted. In the game client side(Hive SDK), call `signOut()` irrespective of whether the account was <u>**IdP based or an guest account**</u> after the account had been deleted.

* **When deleting using Hive SDK API**: <br>
Once an account of a gamer was deleted on the game client side, the game server should call `playerDelete()
` to send the information of the account deleted to the Authentication Server. If you received the callback results of the account deletion from the Authentication Server, you should provide the pop-up that inform an account has been deleted in the game side.

The following is the AuthV4 example code for deleting an account via Hive SDK API.

API Reference: AuthV4.playerDelete

// Requesting Hive SDK account deletion
        AuthV4.playerDeletedelegate (ResultAPI result) {
            switchresult.code) {
                case ResultAPI.Code.Success:
                    // Deletion completed
                    break;
                default:
                    // Other exceptions
                    break;
            }
        });
#include "HiveAuthV4.h"

FHiveAuthV4::PlayerDelete(FHiveAuthV4OnSignOutDelegate::CreateLambda([this](const FHiveResultAPI& Result) {
        switch(Result.Code) {
                case FHiveResultAPI::ECode::Success:
                        // Deletion completed
                        break;
                default:
                        // Other exceptions
                        break;
        }
}));

API Reference:AuthV4::playerDelete

// Requesting Hive SDK account deletion
        AuthV4::playerDelete[=]ResultAPI const &amp; result) {
                switch (result.code) {
                    case ResultAPI::Success:
                        // Deletion completed
                        break;
                    default:
                        // Other exceptions
                        break;
                }
        });

API Reference: AuthV4.playerDelete

// Requesting Hive SDK account deletion
    AuthV4.playerDeleteobject : AuthV4.AuthV4SignOutListener {
        override fun onAuthV4SignOutresult: ResultAPI) {
            whenresult.code) {
                ResultAPI.Code.Success ->; {
                    // Deletion completed
                }
                else ->; {
                    // Other exceptions
                }
            }
        }
    })

API Reference: AuthV4.INSTANCE.playerDelete

// Requesting Hive SDK account deletion
    AuthV4.INSTANCE.playerDeletenew AuthV4.AuthV4SignOutListener) {
        @Override
        public void onAuthV4SignOutResultAPI result) {
            switchresult.code) {
                case Success:
                    // Deletion completed
                    break;
                default:
                    // Other exceptions
                    break;
            }
        }
    });
// Requesting Hive SDK account deletion
    AuthV4Interface.playerDelete { result in
        switchresult.code) {
        case Success:
            // Deletion completed
            break;
        default:
            // Other exceptions
            break;
        }
    }

API Reference: HIVEAuthV4Helper::playerDelete:

// Requesting Hive SDK account deletion
    [[HIVEAuthV4] playerDelete:^HIVEResultAPI *result) {
        switchresult.code) {
        case Success:
            // Deletion completed
            break;
        default:
            // Other exceptions
            break;
        }
    }];

The following is the AuthV4.Helper example code for deleting an account via Hive SDK API.

API Reference: AuthV4.playerDelete

// Requesting Hive SDK account deletion
        AuthV4.Helper.playerDelete(delegate (ResultAPI result, AuthV4.PlayerInfo playerInfo) {
    switch(result.code) {
        case ResultAPI.Code.Success:
            // 삭제 성공
            break;
        default:
            // 기타 예외 상황
            break;
    }
});

API Reference:AuthV4::playerDelete

// Requesting Hive SDK account deletion
AuthV4::Helper::playerDelete([=](ResultAPI const & result, std::shared_ptr playerInfo) {
        switch (result.code) {
            case ResultAPI::Success:
                // 삭제 성공
                break;
            default:
                // 기타 예외 상황
                break;
        }
});

API Reference: AuthV4.playerDelete

// Requesting Hive SDK account deletion
AuthV4.Helper.playerDelete(object : AuthV4.Helper.AuthV4HelperListener {
override fun onAuthV4Helper(result: ResultAPI, playerInfo: AuthV4.PlayerInfo?) {
    when(result.code) {
        ResultAPI.Code.Success -> {
            // 삭제 성공
        }
        else -> {
            // 기타 예외 상황
            }
        }
    }
})

API Reference: AuthV4.INSTANCE.playerDelete

// Requesting Hive SDK account deletion
AuthV4.Helper.INSTANCE.playerDelete(new AuthV4.Helper.AuthV4HelperListener() {
@Override
public void onAuthV4Helper(ResultAPI result, AuthV4.PlayerInfo playerInfo) {
        switch(result.code) {
            case Success:
                // 삭제 성공
                break;
            default:
                // 기타 예외 상황
                break;
        }
    }
});

API Reference: AuthV4Interface.helper().playerDelete

// Requesting Hive SDK account deletion
// Hive SDK 계정 삭제 요청
AuthV4Interface.helper().playerDelete { result, playerInfo in
    switch(result.code) {
    case Success
            case Success:
            // Deletion completed
            break;
    default:
        // Other exceptions
        break;
        }
    }

API Reference: HIVEAuthV4Helper::playerDelete:

// Requesting Hive SDK account deletion
    [[HIVEAuthV4 helper] playerDelete:^HIVEResultAPI *result, HIVEPlayerInfo *playerInfo) {
        switchresult.code) {
        case Success:
            // Deletion completed
            break;
        default:
            // Other exceptions
            break;
        }
    }];

When a user sees the game title screen, expose the IdP list to let this user log in(Expose your game-specific log-in UI in case you do not use the log-in UI provided by the Hive platform).

The text for the account deletion confirmation pop-up window that appears when the user proceeds to delete the account is as follows.

Language Android iOS
Korean 계정을 삭제할 경우 연결된 데이터는 삭제됩니다. 일부 게임 데이터 삭제는 최대 90일의 시간이 소요될 수 있습니다. * 결제 관련 문의는 [Company Name] 고객센터로 연락바랍니다. 계정을 삭제할 경우 연결된 데이터는 삭제됩니다. 일부 게임 데이터 삭제는 최대 90일의 시간이 소요될 수 있습니다. * 결제 관련 문의는 앱스토어 또는 [Company Name] 고객센터로 연락바랍니다.
English The linked data will be deleted when you delete the account. Some game data deletion may take up to 90 days. * Please contact [Company Name] Customer Support for payment related inquiries. The linked data will be deleted when you delete the account. Some game data deletion may take up to 90 days. * Please contact the App Store or [Company Name] Customer Support for payment related inquiries.
Japanese アカウントを削除すると連動データも削除されます。 一部ゲームデータの削除には時間がかかる場合があります。(最大90日) *決済に関するお問い合わせは[Company Name]サポートセンターにご連絡ください。 アカウントを削除すると連動データも削除されます。 一部ゲームデータの削除には時間がかかる場合があります。(最大90日) *決済に関してはApp Storeまたは[Company Name]サポートセンターにお問い合わせください。
Chinese (Simplified) 删除账户时,绑定的数据将被删除。 删除部分游戏数据最多需要90天时间。 * 付费相关咨询请联系[Company Name]客服中心。 删除账户时,绑定的数据将被删除。 删除部分游戏数据最多需要90天时间。 * 付费相关咨询请联系应用商店或[Company Name]客服中心。
Chinese (Traditional) 刪除帳號時也將刪除綁定的數據。 刪除部分遊戲數據最長需90天的時間。 * 結帳相關諮詢請至[Company Name]客服中心。 刪除帳號時也將刪除綁定的數據。 刪除部分遊戲數據最長需90天的時間。 * 結帳相關諮詢請至App Store或[Company Name]客服中心。
German Wenn du dein Konto löschst, werden alle verknüpften Daten gelöscht. Die Löschung einiger Spieldaten kann bis zu 90 Tage dauern. * Bei zahlungsbezogenen Fragen wende dich bitte an den [Company Name] Kundenservice. Wenn du dein Konto löschst, werden alle verknüpften Daten gelöscht. Die Löschung einiger Spieldaten kann bis zu 90 Tage dauern. * Bei zahlungsbezogenen Fragen wende dich bitte an den App-Store oder den [Company Name] Kundenservice.
French Si vous supprimez votre compte, les données associées seront également supprimées. La suppression de certaines données de jeu peut prendre jusqu'à 90 jours. * Pour toute demande relative aux paiements, veuillez contacter le service client [Company Name]. Si vous supprimez votre compte, les données associées seront également supprimées. La suppression de certaines données de jeu peut prendre jusqu'à 90 jours. * Pour toute demande relative aux paiements, veuillez contacter le service client de l'App Store ou de [Company Name].
Russian Если Вы удалите свой аккаунт, привязанные к нему данные будут также удалены. Удаление некоторых игровых данных может занять до 90 дней. * По вопросам, связанным с оплатой, пожалуйста, обратитесь в службу поддержки [Company Name]. Если Вы удалите свой аккаунт, привязанные к нему данные будут также удалены. Удаление некоторых игровых данных может занять до 90 дней. * По вопросам, связанным с оплатой, пожалуйста, обратитесь в App Store или службу поддержки [Company Name].
Spanish Se eliminarán los datos asociados cuando elimine la cuenta. La eliminación de algunos datos del juego puede demorarse hasta 90 días. * Por favor, póngase en contacto con el servicio de atención al cliente de [Company Name] para consultas relacionadas con el pago. Se eliminarán los datos asociados cuando elimine la cuenta. La eliminación de algunos datos del juego puede demorarse hasta 90 días. * Por favor, póngase en contacto con el App Store o con el servicio de atención al cliente de [Company Name] para consultas relacionadas con el pago.
Portuguese Os dados vinculados à conta serão excluídos quando você excluir a conta. A exclusão de alguns dados do jogo pode levar até 90 dias. * Entre em contato com o Suporte ao Cliente do(a) [Company Name] para consultas relacionadas a pagamentos. Os dados vinculados à conta serão excluídos quando você excluir a conta. A exclusão de alguns dados do jogo pode levar até 90 dias. * Entre em contato com a App Store ou com o Suporte ao Cliente do(a) [Company Name] para consultas relacionadas pagamentos.
Indonesian Data yang terhubung akan dihapus ketika kamu menghapus akun. Beberapa penghapusan data game akan memakan waktu hingga 90 hari. * Silakan hubungi Customer Support [Company Name] untuk melaporkan permasalahan terkait pembayaran. Data yang terhubung akan dihapus ketika kamu menghapus akun. Beberapa penghapusan data game akan memakan waktu hingga 90 hari. * Silakan hubungi Customer Support App Store atau [Company Name] untuk melaporkan permasalahan terkait pembayaran.
Thai ถ้าคุณลบบัญชีของคุณ ข้อมูลที่เชื่อมต่อไว้จะถูกลบไปด้วย การลบข้อมูลเกมบางส่วนอาจใช้เวลาสูงสุดถึง 90 วัน * กรุณาติดต่อฝ่ายลูกค้าสัมพันธ์ [Company Name] หากต้องการส่งคำร้องหรือมีข้อสงสัยเกี่ยวกับการชำระเงิน ถ้าคุณลบบัญชีของคุณ ข้อมูลที่เชื่อมต่อไว้จะถูกลบไปด้วย การลบข้อมูลเกมบางส่วนอาจใช้เวลาสูงสุดถึง 90 วัน * กรุณาติดต่อ App Store หรือฝ่ายลูกค้าสัมพันธ์ [Company Name] หากต้องการส่งคำร้องหรือมีข้อสงสัยเกี่ยวกับการชำระเงิน
Vietnamese Dữ liệu đã kết nối sẽ bị xóa bỏ nếu bạn xóa tài khoản. Một số trường hợp xóa dữ liệu game có thể mất thời gian tối đa 90 ngày. * Mọi thắc mắc liên quan đến việc thanh toán, vui lòng liên hệ trung tâm Hỗ Trợ Khách Hàng của [Company Name]. Dữ liệu đã kết nối sẽ bị xóa bỏ nếu bạn xóa tài khoản. Một số trường hợp xóa dữ liệu game có thể mất thời gian tối đa 90 ngày. * Mọi thắc mắc liên quan đến việc thanh toán, vui lòng liên hệ trung tâm Hỗ Trợ Khách Hàng của [Company Name] hoặc App Store.
Italian Eliminando l'account, verranno eliminati anche i dati associati. L'eliminazione di alcuni dati di gioco può richiedere fino a 90 giorni. * Si prega di contattare l'assistenza clienti [Company Name] per richieste relative al pagamento. "Eliminando l'account, verranno eliminati anche i dati associati. L'eliminazione di alcuni dati di gioco può richiedere fino a 90 giorni. * Si prega di contattare l'App Store o l'assistenza clienti [Company Name] per richieste relative al pagamento.
Turkish Hesabı sildiğinizde bağlantılı veriler silinecektir. Bazı oyun verilerinin silinmesi 90 gün kadar sürebilir. * Ödemeyle ilgili sorularınız için lütfen [Company Name] Müşteri Desteği ile iletişime geçin. Hesabı sildiğinizde bağlantılı veriler silinecektir. Bazı oyun verilerinin silinmesi 90 gün kadar sürebilir. * Ödemeyle ilgili sorularınız için lütfen App Store ya da [Company Name] Müşteri Desteği ile iletişime geçin.
Arabic سيتم حذف البيانات المرتبطة عند حذف الحساب. قد يستغرق حذف بعض بيانات اللعبة ما يصل إلى٩٠ يومًا. * يرجى الاتصال بمركز دعم عملاء [Company Name] لأي استفسارات متعلقة بالدفع. سيتم حذف البيانات المرتبطة عند حذف الحساب. قد يستغرق حذف بعض بيانات اللعبة ما يصل إلى ٩٠ يومًا. * يرجى الاتصال بمتجر التطبيقات أو مركز دعم عملاء [Company Name] لأي استفسارات متعلقة بالدفع.
Note

Enter the name of the your game company's customer service center in [Company Name] in the text.

The games providing subscription need to add the phrase "Automatic subscriptions will still be charged even if you delete your account, and you need to unsubscribe manually." (and the phrases in the following table for other languages) to the popup message for confirming the account deletion.

Korean 계정을 삭제하더라도 자동 구독 상품은 요금이 청구되므로 직접 구독을 해지해야 합니다.
English Automatic subscriptions will still be charged even if you delete your account, and you need to unsubscribe manually.
Japanese アカウントを削除しても定期購入商品は解約されず料金が請求されますので、手動で解約してください。
Chinese (Simplified) 即使删除账号,自动订阅商品也会按期收取费用,因此必须手动解除订阅。
Chinese (Traditional) 即使刪除帳號,自動訂閱商品仍會繼續扣款,需親自解除訂閱。
German Automatische Abonnements werden auch dann noch berechnet, wenn du dein Konto gelöscht hast. Du musst dich manuell abmelden.
French Les abonnements automatiques seront toujours facturés même si vous supprimez votre compte, vous devrez donc vous désabonner vous-même.
Russian Автоматическая подписка будет по-прежнему взимать плату даже при удалении аккаунта, поэтому Вам необходимо отменить подписку отдельно.
Spanish Las suscripciones automáticas aún se cobrarán incluso si elimina su cuenta, y debe darlas de baja manualmente.
Portuguese As assinaturas automáticas ainda serão cobradas mesmo se você excluir sua conta, sendo necessário que você as cancele manualmente.
Indonesian Berlangganan otomatis akan tetap dikenakan biaya meskipun kamu menghapus akun, kamu harus membatalkan berlangganan secara manual.
Thai การสมัครแพ็กเกจต่าง ๆ โดยอัตโนมัติจะยังมีผลอยู่แม้ว่าคุณลบบัญชีไปแล้ว และคุณต้องยกเลิกการสมัครแพ็กเกจเหล่านั้นด้วยตัวเอง
Vietnamese Bạn vẫn sẽ phải trả phí cho các vật phẩm đã đăng ký thanh toán tự động kể cả khi đã xóa tài khoản, vì thế bạn cần phải trực tiếp hủy bỏ đăng ký.
Italian Gli abbonamenti automatici verranno comunque addebitati anche dopo aver eliminato l'account, quindi bisogna annullare le rispettive iscrizioni separatamente.
Turkish Hesabınızı silseniz bile otomatik abonelikler ücretlendirilecektir ve manuel olarak abonelikten çıkmanız gerekir.
Arabic سيستمر فرض رسوم على الاشتراكات التلقائية حتى إذا قمت بحذف حسابك ، وتحتاج إلى إلغاء الاشتراك يدويًا.
Language Phrase
Korean 계정 삭제가 완료되었습니다.
English The account has been deleted.
Japanese アカウント削除が完了しました。
Chinese (Simplified) 已删除账号。
Chinese (Traditional) 已成功刪除帳號。
German Das Konto wurde gelöscht.
French La suppression du compte a été effectuée
Russian Аккаунт удален.
Spanish La cuenta se ha suprimido.
Portuguese A conta foi excluída.
Indonesian Akun telah dihapus.
Thai บัญชีถูกลบแล้ว
Vietnamese Đã hoàn thành xóa tài khoản.
Italian L'account è stato cancellato.
Turkish Hesap silme tamamlandı.
Arabic تم حذف حسابك بنجاح.
Language Phrase
Korean 계정 삭제가 실패되었습니다. 잠시 후 다시 진행해 주세요.
English Failed to delete the account. Please try again later.
Japanese アカウント削除に失敗しました。しばらくしてからもう一度お試しください。
Chinese (Simplified) 账号删除失败。请稍后再试。
Chinese (Traditional) 帳號刪除失敗,請稍後再試。
German Das Konto konnte nicht gelöscht werden. Bitte versuche es später erneut.
French La suppression du compte a échoué. Veuillez réessayer dans quelques instants.
Russian Не удалось удалить аккаунт. Пожалуйста, попробуйте позже.
Spanish Hubo un error al eliminar la cuenta. Por favor, inténtelo de nuevo más tarde.
Portuguese Falha ao excluir a conta. Por favor, tente novamente mais tarde.
Indonesian Gagal menghapus akun. Silakan coba lagi nanti.
Thai การลบบัญชีล้มเหลว กรุณาลองใหม่ภายหลัง
Vietnamese Xóa tài khoản thất bại. Vui lòng thử lại sau.
Italian Eliminazione dell'account fallito. Riprova più tardi.
Turkish Hesap silme başarısız. Daha sonra tekrar deneyiniz.
Arabic فشل حذف الحساب. يرجى إعادة المحاولة في وقت لاحق.