콘텐츠로 이동

Idp 연동

Note
  • AuthV4.Helper에 대한 설명은 인증 페이지를 참고하세요.

로그인 후, 유저가 현재 이용중인 PlayerID의 연동 상태를 표시하고 다른 IdP (ID Provider, 이하 IdP)와 연동할 수 있도록 제공해야 합니다.

게임의 설정 메뉴 안에 IdP 연동 상태를 표시하고 IdP 연동 및 해제를 할 수있도록 UI를 구성해 주세요.

IdP 연동 상태 정보 확인

AuthV4 클래스의 getPlayerInfo() 메서드를 이용하여 현재 로그인된 PlayerID에 연동된 IdP 리스트를 확인할 수 있습니다. 게임 내 설정 화면에서 어떤 IdP와 연동되어 있는지 확인할 수 있도록 UI를 구성하고 IdP 연동을 유도하는 문구를 노출하세요.

게임 내 설정 화면에서는 IdP 연동 정보와 함께 유저의 PlayerID를 표시해야 합니다. PlayerID는 CS Code로 표기 후 현재 로그인된 유저의 PlayerID 값을 노출해야 합니다.

  • 현재 로그인된 PlayerID에 연동된 IdP를 확인하는 예시 화면
  • 계정 연동 유도 예시 화면

다음은 setup()에서 반환된 providerTypeList를 통해 현재 앱에서 제공 가능한 IdP 목록을 확인한 후 아래의 예제 코드로 PlayerID에 연동된 IdP 목록을 확인하여 연동 상태를 표시합니다.

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)
        {
                // IdP 연동 상태 확인
        }
}

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

IdP 연동을 유도하는 문구

언어 문구
한국어 계정 연동을 통해 플레이 데이터를 안전하게 지키세요!
영어 Sync your account to protect your game data!
일본어 アカウントを連動してプレイデータを守りましょう!
중국어 간체 绑定账号,保护游戏数据安全吧!
중국어 번체 綁定帳號,保護帳號資料安全!
프랑스어 Synchronise ton compte afin de protéger tes données de jeu !
독일어 Synchronisiere dein Konto, um deine Spieldaten zu schützen!
러시아어 Синхронизируйте аккаунт, чтобы обезопасить игровые данные.
스페인어 ¡Sincronicen su cuenta para proteger sus datos del juego!
포르투갈어 Sincronize sua conta para proteger seus dados de jogo!
인도네시아어 Hubungkan akunmu untuk mengamankan data game milikmu!
베트남어 Vui lòng liên kết tài khoản để bảo vệ an toàn cho dữ liệu game của bạn!
태국어 ซิงค์บัญชีเพื่อปกป้องข้อมูลเกมของคุณ!
이탈리아어 Sincronizza il tuo account per proteggere i tuoi dati di gioco.
터키어 Oyun verilerini korumak için hesabınızı senkronize ediniz.
아랍어 زامن حسابك لحماية بيانات اللعبة الخاصة بك!

IdP 연동

현재 로그인된 PlayerID는 새로운 IdP를 추가 연동할 수 있습니다. 만약 다른 PlayerID에 연동한 IdP를 현재 로그인된 PlayerID에 연동하려고 할 때는 에러가 반환됩니다. 연동에 성공한 후에는 상태 정보를 다시 확인하여 연동 정보 UI를 업데이트해주세요.

Note

IdP 아이콘이나 로고를 삽입하려면 IdP별로 제공하는 가이드를 확인하세요.

Warning

iOS Steam Login은 iOS 14 이상 버전에서 지원합니다. Steam 로그인 페이지의 렌더링 문제로 추정되는 이슈로, iOS 14 미만 Safari 브라우저와 WKWebView에서 Steam 로그인 페이지의 아이디와 비밀번호 입력 필드가 나타나지 않는 문제가 확인되었습니다.

Warning

2020년 3월 기준, Apple App Store에서 앱 서브미션 심사 결과 UIWebView 사용에 대한 경고(ITMS-90809)와 함께 2019년 9월 이후 출시한 앱과 게임에 대해서는 2020년 4월까지 UIWebview 관련 코드를 반드시 제거 후 서브미션하도록 요구하였습니다. Hive SDK v4.14.0부터 추가된 Twitter 프레임워크는 UIWebView 관련 클래스를 사용하고 있어 앱 제출 시 경고 및 불이익을 받게됨을 확인하였으며, UIWebView를 완전 제거한 Twitter 프레임워크를 새로 적용하기 전까지는 해당 프레임워크를 일시적으로 제거했습니다. Twitter IdP 타입으로 로그인 및 연동 API 사용 시 ResultAPI로 NotSupportedProviderType의 코드를 전달받게 될 것이며 게임 개발 스튜디오에서는 이에 대한 일시적 대응이 필요합니다.

Hive SDK v4.14.4부터 UIWebView 사용 경고에 대응하는 새 프레임워크를 적용했으며, Unity 2019.3 미만 버전에서 사용 가능합니다. Unity 2019.3 이상 버전을 사용해야 하는 환경에서는 Twitter 인증을 활용할 수 없으므로 다음 설정으로 Hive SDK가 Twitter 관련 프레임워크를 참조하지 않도록 제거하세요.

  • External Dependency 설정으로 Twitter 프레임워크 제거하기
  • Xcode 프로젝트에서 ProviderTwitter.framework 제거하기

Warning
  • Google과 Apple 제품 명칭은 항상 영문으로 표기합니다.
  • Apple 로그인은 국문 Apple로 로그인, 영문 Sign In with Apple로 표기해야 하며, 아이콘 텍스트는 가운데 정렬 기준입니다.
  • 인증에 적용된 다국어 로그인 버튼명은 여기를 참조해 주세요.

 

IdP 연동 시 추가하려는 IdP가 다른 PlayerID에 연동되어 있는 경우를 계정 충돌 상황이라고 합니다. 해당 부분을 구현하려면 IdP 연동 시 계정 충돌 상황 처리를 참고하세요.

IdP 연동을 위해서는 연동하려는 ProviderType을 파라미터로 넣고 connect() 메서드를 호출하세요. 다음은 IdP 연동을 구현한 예제 코드입니다.

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:
                        // 연동 성공
                        break;
                case FHiveResultAPI::ECode::AuthV4ConflictPlayer:
                        // 계정 충돌
                        break;
                default:
                        // 기타 예외 상황
                        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;    
            }    
    }];

IdP 연동 시 계정 충돌 상황 처리

IdP 연동을 위해 connect() 호출 시 유저가 연동하려는 IdP 계정이 이미 다른 PlayerID에 연동되어 있는 경우 계정 충돌 상황이 발생합니다. 이후 설명을 위해 다음과 같은 상황을 가정합니다.

  • CurrentPlayer: 유저가 현재 로그인한 계정(게스트 계정 또는 IdP 계정)에 있는 플레이어
  • ConflictPlayer: 유저가 연동하려는 IdP 계정에 이미 존재하는 플레이어

ConflictPlayer가 게임을 플레이한 기록이 게임 서버에 있을 때

이 경우, 계정 충돌이 발생하면 ConflictPlayer 플레이 정보를 유저에게 알려주고 ConflictPlayer를 선택할 수 있는 UI를 노출합니다. Hive SDK에서 제공하는 UI를 사용하기 위해 ConflictPlayer 정보를 게임에 맞도록 구성하고 ConflictPlayer의 정보를 파라미터로 showConflict() 메서드를 호출하세요. 호출 시 ConflictPlayer로 계정을 변경하거나 취소를 선택하여 IdP 연동 정보 변경 없이 CurrentPlayer로 게임을 계속 진행할 수 있습니다. 아래 UI 이미지 예시에서 체크 버튼을 클릭하면 ConflictPlayer 계정으로 전환, X 버튼을 클릭하면 CurrentPlayer로 게임을 계속 진행합니다.

Note

계정 선택 UI는 Hive SDK에서 제공하는 UI를 이용하거나 게임에서 커스터마이징 할 수도 있습니다. 계정 선택 UI를 커스터마이징 하는 경우 IdP 충돌 상황 시 커스터마이징 항목을 참고하세요.

ConflictPlayer가 게임을 플레이한 기록이 게임 서버에 없을 때

ConflictPlayer 플레이어 식별자(PlayerId) 데이터 정도만 존재할 뿐 게임 서버에 실제 플레이 기록이 없는 경우가 있습니다. 이 경우에는 resolveConflict(CB)를 호출해 CurrentPlayer의 PlayerID를 선택하고 계속 게임을 진행하도록 합니다. 계정 충돌이 발생하면 다음 UI를 노출합니다.

  • CurrentPlayer가 게스트 계정, ConflictPlayer가 IdP 계정일 때
    • "확인" 버튼이 노출되며 확인 버튼 터치 시 CurrentPlayer 로그인 상태를 유지
  • CurrentPlayer가 IdP 계정 1(예: Facebook), ConflictPlayer가 IdP 계정 2(예: Google Play)일 때
    • 취소: 현재 계정인 Facebook 계정 CurrentPlayer로 로그인 상태 유지
    • 확인: 연동할 Google Play 계정 ConflictPlayer로 플레이어 전환

ConflictPlayer가 이용 제한 계정일 때

ConflictPlayer(IdP 계정)가 이용 제한 상태일 때, 다른 기기에서 CurrentPlayer(IdP 계정 또는 게스트 계정)가 연동을 시도(AuthV4.connect)하면 계정 충돌이 발생하지 않으며, 그 대신 이용 제한 팝업을 노출합니다. 앱 사용자가 이용 제한 팝업창을 닫으면 AuthV4.connect는 에러를 반환하며, CurrentPlayer가 이 IdP에 연동하려는 시도는 실패합니다.

예시 1. CurrentPlayer가 IdP 계정일 때

기존에 연동되어 있는 Facebook IdP 계정(ConflictPlayer)이 이용 정지 상태일 때, 사용자가 Google IdP(CurrentPlayer)도 연동을 시도하면 이용 정지 팝업창이 나타납니다. 팝업창을 닫으면 Facebook IdP를 로그아웃시킵니다.

예시 2. CurrentPlayer가 게스트 계정일 때

기존에 연동되어 있는 Facebook IdP 계정(ConflictPlayer)이 이용 정지 상태일 때, 사용자가 게스트 계정(CurrentPlayer)으로 Facebook IdP에 연동을 시도하면 이용 정지 팝업창이 나타납니다. 팝업창을 닫으면 Facebook IdP를 로그아웃시킵니다.

계정 선택 시 주의점

ConflictPlayer를 선택 시, CurrentPlayer가 게스트 상태라면 CurrentPlayer를 더 이상 찾을 수 없습니다. 게스트 상태인 CurrentPlayer로 다른 게임 서버에서 플레이한 데이터가 있으면 해당 게임 데이터 역시 더 이상 찾을 수 없습니다. 이 문제를 방지하기 위해서는 게스트 상태일 때 게임 서버를 변경하지 못하도록 구현해야 합니다. 또 유저가 SDK에서 제공하는 계정 선택 UI에서 'X'를 눌러 닫은 경우, 계정 연동이 취소됩니다.

게임 데이터 구성

ConflictPlayer 정보는 player_idgame_data로 구성되며 두 키는 필수입니다.

    • player_id : ConflictPlayer의 PlayerID
    • game_data : Map<String, Object > 형태로 게임에 맞게 구성.(게임 캐릭터 명, 재화량, 레벨 등)

다음은 ConflictPlayer의 데이터를 구성한 예시입니다.

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

 

Hive SDK의 계정 선택 UI 호출(게임 데이터가 있는 경우)

ConflictPlayer의 데이터 정보 구성이 완료되었다면 showConflict() 메서드를 호출하여 SDK 제공하는 UI를 노출하게 되며 유저의 선택이 결과로 반환됩니다. 결과 값이 성공이고 유저가 ConflictPlayer를 선택했을 경우에는 다시 게임데이터를 불러와야 합니다. 유저가 계정을 선택하지 않았거나 계정 선택 시 오류가 발생하면 결과는 실패로 반환되고, 이 경우에는 현재 상태 그대로 게임을 진행하도록 합니다. 단, 전환된 계정에서 기기 인증에 실패하면(AuthV4NotRegisteredDevice) 게임에서는 재로그인을 시도하는 초기 화면으로 돌아가야 합니다. SDK에서의 로그인은 해제되고 isAutoSignIn 값은 true 입니다.

다음은 충돌이 발생한 PlayerID의 게임 데이터 정보를 구성하여 Hive SDK가 제공하는 UI를 호출하는 예제 코드입니다.

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: 앱 종료 기능을 구현하세요
                // 예) UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit, false);
        } else {
                switch (Result.Code) {
                        case FHiveResultAPI::ECode::AuthV4PlayerChange:
                                // 계정 전환 : 게임 재시작 필요
                                break;
                        case FHiveResultAPI::ECode::AuthV4PlayerResolved:
                                // 현재 사용자 유지
                                break;
                        case FHiveResultAPI::ECode::AuthV4NotRegisteredDevice:
                                // 기기 인증에 실패하여 로그인이 해제된 경우입니다. AUTO로 재로그인을 시도하거나 로그아웃하세요.
                                break;
                        default:
                                // 기타 예외 상황 처리
                                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;    
                }    
            }    
}];

Hive SDK의 계정 선택 UI 호출(게임 데이터가 없거나 알 수 없는 경우)

계정 선택 UI를 표시하는 시점에 노출할 게임 데이터를 확인할 수 없거나, 단순히 로그인 변경을 안내하고자 하는 경우에는 간소화된 UI를 사용할 수 있습니다. 유저가 계정을 선택하지 않았거나 계정 선택 시 오류가 발생하면 결과는 실패로 반환되고, 이 경우에는 현재 상태 그대로 게임을 진행하도록 합니다. 단, 전환된 계정에서 기기 인증에 실패하면(AuthV4NotRegisteredDevice) 게임에서는 재로그인을 시도하는 초기 화면으로 돌아가야 합니다. SDK에서의 로그인은 해제되고 isAutoSignIn 값은 true 입니다.

다음은 충돌이 발생한 PlayerID의 게임 데이터를 노출하지 않는 UI 호출 예제 코드입니다.

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: 앱 종료 기능을 구현하세요
                // 예) UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit, false);
        } else {
                switch (Result.Code) {
                        case FHiveResultAPI::ECode::AuthV4PlayerChange:
                                // 계정 전환 : 게임 재시작 필요
                                break;
                        case FHiveResultAPI::ECode::AuthV4PlayerResolved:
                                // 현재 사용자 유지
                                break;
                        case FHiveResultAPI::ECode::AuthV4NotRegisteredDevice:
                                // 기기 인증에 실패하여 로그인이 해제된 경우입니다. AUTO로 재로그인을 시도하거나 로그아웃하세요.
                                break;
                        default:
                                // 기타 예외 상황 처리
                                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;    
            }    
        }    
}];

IdP 충돌 상황 시 커스터마이징

IdP 연동 과정에서 IdP 충돌 상황 발생 시 반환된 충돌 PlayerID를 이용하여 게임데이터를 구성하고 계정 선택 UI를 게임에서 직접 구현할 수 있습니다. 게임에서 커스터마이징한 계정 선택 UI에서 유저가 계정을 선택했다면 선택된 계정의 PlayerID를 파라미터로 selectConflict() 메서드를 호출하세요.

다음 설명에서는 현재 로그인된 계정을 CurrentPlayer, 충돌이 발생한 계정을 ConfilctPlayer라고 칭합니다. 계정 선택 UI를 커스터마이징 할 경우 유저의 선택에 따른 동작의 차이를 확인하고 UI 구성 시 적절한 주의 사항 문구를 계정 선택 UI에 고지해야 합니다.

    IdP 충돌 상황에서는 유저의 선택에 따라 다음과 같은 이슈가 발생할 수 있습니다.
  • ConfilctPlayer 선택 시: `selectConflict(ConfilctPlayer, CB)` 호출
    • CurrentPlayer가 게스트 상태라면 CurrentPlayer를 더 이상 찾을 수 없습니다.
  • CurrentPlayer 선택 시: `selectConflict(CurrentPlayer, CB)` 호출
    • CurrentPlayer에 IdP가 연동되고 ConfilctPlayer의 IdP 연동이 해지됩니다.
    • ConfilctPlayer에 다른 IdP가 연동되어 있지 않을 경우 게스트 상태가 되어 ConfilctPlayer를 더 이상 찾을 수 없습니다.
  • 취소 시(유저가 어떤 것도 선택하지 않고 선택 UI를 닫은 경우): `resolveConflict(CB)` 호출
    • IdP 연동 상태 변경없이 CurrentPlayer로 게임을 계속 진행합니다.

상황에 따라 선택하지 않은 데이터는 게스트 상태가 되어 찾을 수 없을 수 있으므로 계정 선택 UI 구성 시 적절한 주의 사항 문구를 구성해야 합니다. 또한 계정 충돌 시 IdP 연동정보를 변경하지 않도록 구성하려면 ConflictPlayer의 게임데이터를 선택하거나 계정 선택을 취소할 수 있도록 UI를 구성해주세요.

계정 선택 UI를 구성하고 유저가 계정을 선택하였다면 선택된 계정의 PlayerID를 파라미터로 selectConflict() 메서드를 호출하세요. 계정 선택을 취소했을 경우에는 API 호출 없이 현재 상태 그대로 게임을 진행하면 됩니다. ConflictPlayer가 선택하여 계정 선택 성공 콜백을 받은 후에는 다시 게임데이터를 불러와야 합니다.

다음은 계정 충돌 시 계정을 선택하는 예제 코드입니다.

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()) {
                // 계정 선택 성공
        } else if (Result.NeedExit()) {
                // TODO: 앱 종료 기능을 구현하세요
                // 예) UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit, false);
        }
}));

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

IdP 연동 해제

IdP 계정 목록 UI에서 이미 연동된 계정을 유저가 연동 해제하게 할 수 있습니다. 유저가 UI에서 특정 IdP 계정 연동을 해제하면 게임 스튜디오에서는 연동 해제할 IdP ProviderType을 인자로 disconnect() 메서드를 호출해 연동을 해제합니다. disconnect() 메서드 호출 후, 유저의 연동 상태 정보를 다시 확인하여 연동 목록 UI를 업데이트 해줍니다.

Note

Windows 환경은 모바일과 달리 게스트 로그인을 지원하지 않습니다. 따라서, IdP가 하나만 연동된 상태에서 Disconnect API 호출을 시도하면 Result API의 Code로 AuthV4LastProviderCantDisconnect가 반환되고, 연동 상태는 유지됩니다.

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 연결 해제 성공
                        break;
                default:
                        // 기타 예외 상황
                        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;    
       }    
}];

게임 스튜디오는 IdP 연동 해제 구현 시 아래 정책 중에서 원하는 정책을 선택할 수 있습니다.

  1. 모든 IdP 연동을 해제하고 게스트 계정을 사용하도록 허락
  2. 1개 IdP 계정만은 반드시 연동 상태를 유지하게끔 강제

IdP 연동 해제: 모든 IdP 연동 해제 허용

게임 스튜디오는 유저가 모든 IdP 계정 연동을 해제하고 게스트 계정을 사용하도록 할 수 있습니다. 게스트 계정을 사용하면, 게임 초기화와 재설치 등으로 게스트 계정 분실 시 계정을 복구할 수 없습니다. 따라서, 현재 연동된 IdP가 하나만 남았을 때 유저가 이 IdP 연동마저 해제하려고 하면, 연동 해제를 재고할 수 있도록 게스트 유저 관련 안내를 아래 문구를 사용해 구현하세요. 단, IdP 연동을 해제해도 PlayerID는 로그아웃되지 않습니다.

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

위와 같이 안내 문구를 노출했음에도 유저가 계정 연동 해제를 선택하면 disconnect()를 호출합니다. 유저 계정이 게스트 계정이 되면 아래 문구를 노출할 수 있습니다.

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

IdP 연동 해제: 최소 1개 계정은 연동 상태를 유지

게임 스튜디오는 유저가 최소 1개 IdP 계정 연동은 유지하도록 할 수 있습니다. 유저가 모든 IdP 계정 연동을 해제하면 게스트 계정으로 전환되며, 게임 초기화와 재설치 등으로 게스트 계정 분실 시 계정을 복구할 수 없습니다. 따라서, 현재 연동된 IdP가 하나인 유저가 IdP 연동을 해제하려고 하면, 이를 제한하는 알림을 아래 문구를 사용해 구현할 수 있습니다. 단, IdP 연동을 해제해도 PlayerID는 로그아웃되지 않습니다.

  • 현재 연동한 IdP 계정이 1개만 남은 상태에서 이 IdP 계정 연동마저 해제하려는 경우
언어 문구
한국어 최소 1개의 계정 연동을 유지해야 합니다.
영어 You must keep at least 1 of your accounts synced.
일본어 少なくとも1つのアカウントを連動しなければなりません。
중국어 간체 需要绑定至少1个账号。
중국어 번체 至少要有1個帳號是綁定的!
프랑스어 Tu dois garder au moins l'un de tes comptes synchronisés.
독일어 Du musst mindestens 1 deiner Konten synchronisieren.
러시아어 Хотя бы 1 из аккаунтов должен быть синхронизирован.
스페인어 Debe de mantener al menos 1 de sus cuentas sincronizada.
포르투갈어 É necessário sincronizar pelo menos 1 das suas contas.
인도네시아어 Kamu harus punya paling tidak satu akun yang terhubung.
베트남어 Bạn cần phải duy trì ít nhất 1 liên kết tài khoản.
태국어 ต้องซิงค์บัญชีอย่างหน่อย 1 บัญชี
이탈리아어 Devi mantenere almeno 1 dei tuoi account sincronizzato.
터키어 En az 1 hesabınızı senkronize etmeniz gerekmektedir.
아랍어 يجب أن تحتفظ على الأقل بحساب واحد متزامن من بين حساباتك.

커스텀 IdP 연동

커스텀 IdP 연동은 맞춤형 기능으로, Hive에서 제공하는 IdP 외에 게임 자체에서 구현한 IdP로 연동을 구현할 수 있습니다. 커스텀 로그인 API 호출 후 콜백으로 전달 받는 PlayerInfo 클래스 인스턴스로 customProviderInfoData 데이터에 접근하여 커스텀 로그인된 유저 정보를 확인할 수 있습니다. customProviderInfoData의 ProviderType(enum) 은 모두 CUSTOM으로 동일하게 설정되며, ProviderName(String)으로 상세히 구분할 수 있습니다.

다음은 커스텀 IdP 연동을 구현하는 예제코드입니다.

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

        AuthV4.connectWithAuthKeyauthKey, (ResultAPI result, PlayerInfo playerInfo) =>; {
                switchresult.code) {
                case ResultAPI.Code.Success:
                    // 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"

// 게임에서 "CUSTOM_TWITTER" 타입으로 직접 구현한 트위터 로그인
void GameConnect(const FString& AuthKey)
{
        FHiveAuthV4::ConnectWithAuthKey(AuthKey, FHiveAuthV4OnConnectDelegate::CreateLambda([this](const FHiveResultAPI& Result, const FHivePlayerInfo& ConflictPlayerInfo) {
                switch(Result.Code) {
                        case FHiveResultAPI::ECode::Success:
                                // 연동 성공
                                break;
                        case FHiveResultAPI::ECode::AuthV4ConflictPlayer: {
                                // 계정 충돌
                                TMap<FString, FHiveProviderInfo> CustomProviderInfoData = ConflictPlayerInfo.CustomProviderInfoData;
                                if (const FHiveProviderInfo* ProviderInfo = CustomProviderInfoData.Find(TEXT("CUSTOM_TWITTER"))) {
                                        // 다음의 유저 연동 정보 확인
                                        EHiveProviderType ProviderType = ProviderInfo->ProviderType; // EHiveProviderType::CUSTOM, 커스텀들은 Type 이 고정
                                        FString ProviderName = ProviderInfo->ProviderName; // ProviderName으로 구분 필요
                                        FString ProviderUserId = ProviderInfo->ProviderUserId; // 직접 구현한 트위터 로그인에 사용된 사용자 id
                                }
                        }
                                break;
                        default:
                                // 기타 예외 상황
                                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;
                    }
            }];
        }];

커스텀 IdP 연동 해제

커스텀으로 연동한 IdP를 해제하게 할 수 있습니다. 기본적으로 IdP 연동 해제와 같으나 providerName 으로 요청 해줍니다.

Note

IdP 연동 해제의 NOTE와 같이 모든 IdP 연동이 해제되는 상황에 주의해 주세요.

 

다음은 커스텀 IdP 연동 해제를 구현하는 예제 코드입니다.

string customProviderName = "CUSTOM_TWITTER";

AuthV4.disconnectWithName (customProviderName, delegate (ResultAPI result) {
        switch(result.code) {
        case ResultAPI.Code.Success:
                // Provider 연결 해제 성공
                break;
        default:
                // 기타 예외 상황
                break;
        }
});
#include "HiveAuthV4.h"

FString CustomProviderName = TEXT("CUSTOM_TWITTER");
FHiveAuthV4::DisconnectWithName(CustomProviderName, FHiveAuthV4OnDisconnectDelegate::CreateLambda([this](const FHiveResultAPI& Result) {
        if (Result.IsSuccess()) {
                // Provider 연결 해제 성공
        } else {
                // 기타 예외 상황
        }
}));
std::string customProviderName = "CUSTOM_TWITTER"

AuthV4::disconnectWithName(customProviderName, [=](ResultAPI const &amp; result) {
                switch (result.code) {
                case ResultAPI::Success:
                        // Provider 연결 해제 성공
                        break;
                default:
                        // 기타 예외 상황
                        break;
                }
});
val customProviderName = "CUSTOM_TWITTER"

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

                        when(result.code) {
                        Success -&gt; {
                                // Provider 연결 해제 성공
                        }
                        else -&gt; {
                                // 기타 예외 상황
                        }
                }
        }
})
String customProviderName = "CUSTOM_TWITTER";

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

        @Override
        public void onAuthV4Disconnect(ResultAPI result) {
                switch(result.code) {
                        case Success:
                                // Provider 연결 해제 성공
                                break;
                        default:
                                // 기타 예외 상황
                                break;
                }
        }
});
let customProviderName = "CUSTOM_TWITTER"

AuthV4Interface.disconnectWithName(customProviderName) { result  in
                switch(result.getCode()){
                case .success:
                        // Provider 연결 해제 성공
                break
                default:
                        // 기타 예외 상황
                break
                }
        }
NSString* customProviderName = @"CUSTOM_TWITTER";

[HIVEAuthV4 disconnectWithName:customProviderName handler:^(HIVEResultAPI *result) {
        switch(result.code) {
        case kSuccess:
                // Provider 연결 해제 성공
                break;
        default:
                // 기타 예외 상황
                break;
        }
}];

IdP 및 게스트 계정 삭제

사용자가 게임 내에서 계정을 삭제할 수 있는 UI를 구성해야 합니다.

  • 예시 화면
Warning

2022년 6월 30일부터 App Store에 제출한 앱 중에서 계정 생성을 지원하는 앱에는 사용자가 앱 내에서 계정을 삭제할 수 있도록 해야 합니다. 앱을 업데이트하거나 계정 생성 기능을 포함한 새로운 앱을 제출하는 경우 앱 심사 절차가 지연될 수 있기에 작업이 반드시 필요합니다. App Store의 계정 삭제에 대한 자세한 내용은 Apple 정책 안내를 확인하세요.

사용자의 계정 삭제 진행 의사를 확인하기 위해 게임에서 계정 삭제 확인 팝업을 노출하세요. 팝업 메시지의 내용은 아래의 팝업 문구에서 확인하세요. 계정 삭제 요청이 확인되면 Hive Server API 이용하여 삭제하거나 Hive SDK API를 이용하여 삭제하는 2가지 방법 중 하나를 선택하여 인증 v4 계정을 삭제하면 됩니다.

  • 계정 삭제 순서

    • Hive Server API 이용하여 삭제 시 게임 클라이언트에서 게임 이용자 계정을 삭제하면 게임 서버에서는 Hive Server API인 인증 v4 계정 삭제하기를 호출하여 삭제 요청한 계정을 인증 서버로 전달해야 합니다. 인증 서버는 이를 전달 받고 계정을 삭제합니다. 계정 삭제가 완료되면 인증 서버는 계정 삭제 결과를 게임 서버에 전달하며 게임 서버는 이를 게임 클라이언트에 전달합니다. 이 정보를 받은 게임 클라이언트는 계정 삭제 완료 팝업 UI를 구성하여 완료 안내를 합니다. 게임 클라이언트(Hive SDK)에서는 IdP 및 게스트 여부와 관계없이 계정 삭제 완료 후 signOut()을 호출합니다.

    • Hive SDK API 이용하여 삭제 시 게임 클라이언트에서 게임 이용자 계정을 삭제하면 playerDelete() 매서드를 호출하여 삭제 요청한 계정을 인증 서버로 전달해야 합니다. 인증 서버에서 계정 삭제 완료 콜백을 받으면 게임 클라이언트에서 계정 삭제 완료 팝업 UI를 구성하여 완료 안내를 합니다.

다음은 Hive SDK API 사용하여 계정 삭제를 구현하는 AuthV4 예제 코드입니다.

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:
                        // 삭제 성공
                        break;
                default:
                        // 기타 예외 상황
                        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:

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

다음은 Hive SDK API 사용하여 구현하는 AuthV4.Helper 예제 코드입니다.

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;
    }
});
#include "HiveAuthV4.h"

FHiveAuthV4::Helper::PlayerDelete(FHiveAuthV4HelperDelegate::CreateLambda([this](const FHiveResultAPI& Result, const TOptional<FHivePlayerInfo>& PlayerInfo) {
        switch(Result.Code) {
                case FHiveResultAPI::ECode::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;
        }
    }];

게임 타이틀로 이동한 후 게임 플로우에 맞게 IdP 리스트를 노출하여 로그인을 유도합니다(Hive 플랫폼에서 제공하는 로그인 UI를 사용하지 않을 경우에는 자체 로그인 UI를 호출해 주세요).

계정 삭제 확인 팝업 문구

유저가 계정 삭제를 진행할 때 나타나는 계정 삭제 확인 팝업창 문구는 아래와 같습니다.

언어 Android iOS
한국어 계정을 삭제할 경우 연결된 데이터는 삭제됩니다. 일부 게임 데이터 삭제는 최대 90일의 시간이 소요될 수 있습니다. * 결제 관련 문의는 [회사명] 고객센터로 연락바랍니다. 계정을 삭제할 경우 연결된 데이터는 삭제됩니다. 일부 게임 데이터 삭제는 최대 90일의 시간이 소요될 수 있습니다. * 결제 관련 문의는 앱스토어 또는 [회사명] 고객센터로 연락바랍니다.
영어 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.
일본어 アカウントを削除すると連動データも削除されます。 一部ゲームデータの削除には時間がかかる場合があります。(最大90日) *決済に関するお問い合わせは[Company Name]サポートセンターにご連絡ください。 アカウントを削除すると連動データも削除されます。 一部ゲームデータの削除には時間がかかる場合があります。(最大90日) *決済に関してはApp Storeまたは[Company Name]サポートセンターにお問い合わせください。
중국어(간체) 删除账户时,绑定的数据将被删除。 删除部分游戏数据最多需要90天时间。 * 付费相关咨询请联系[Company Name]客服中心。 删除账户时,绑定的数据将被删除。 删除部分游戏数据最多需要90天时间。 * 付费相关咨询请联系应用商店或[Company Name]客服中心。
중국어(번체) 刪除帳號時也將刪除綁定的數據。 刪除部分遊戲數據最長需90天的時間。 * 結帳相關諮詢請至[Company Name]客服中心。 刪除帳號時也將刪除綁定的數據。 刪除部分遊戲數據最長需90天的時間。 * 結帳相關諮詢請至App Store或[Company Name]客服中心。
독일어 Wenn du dein Konto löschst, werden alle verknüpften Daten gelöscht. Die Löschung einiger Spieldaten kann bis zu 90 Tage dauern. * Bei zahlungsbezogenen Fragen wende dich bitte an den [Company Name] Kundenservice. Wenn du dein Konto löschst, werden alle verknüpften Daten gelöscht. Die Löschung einiger Spieldaten kann bis zu 90 Tage dauern. * Bei zahlungsbezogenen Fragen wende dich bitte an den App-Store oder den [Company Name] Kundenservice.
프랑스어 Si vous supprimez votre compte, les données associées seront également supprimées. La suppression de certaines données de jeu peut prendre jusqu'à 90 jours. * Pour toute demande relative aux paiements, veuillez contacter le service client [Company Name]. Si vous supprimez votre compte, les données associées seront également supprimées. La suppression de certaines données de jeu peut prendre jusqu'à 90 jours. * Pour toute demande relative aux paiements, veuillez contacter le service client de l'App Store ou de [Company Name].
러시아어 Если Вы удалите свой аккаунт, привязанные к нему данные будут также удалены. Удаление некоторых игровых данных может занять до 90 дней. * По вопросам, связанным с оплатой, пожалуйста, обратитесь в службу поддержки [Company Name]. Если Вы удалите свой аккаунт, привязанные к нему данные будут также удалены. Удаление некоторых игровых данных может занять до 90 дней. * По вопросам, связанным с оплатой, пожалуйста, обратитесь в App Store или службу поддержки [Company Name].
스페인어 Se eliminarán los datos asociados cuando elimine la cuenta. La eliminación de algunos datos del juego puede demorarse hasta 90 días. * Por favor, póngase en contacto con el servicio de atención al cliente de [Company Name] para consultas relacionadas con el pago. Se eliminarán los datos asociados cuando elimine la cuenta. La eliminación de algunos datos del juego puede demorarse hasta 90 días. * Por favor, póngase en contacto con el App Store o con el servicio de atención al cliente de [Company Name] para consultas relacionadas con el pago.
포르투갈어 Os dados vinculados à conta serão excluídos quando você excluir a conta. A exclusão de alguns dados do jogo pode levar até 90 dias. * Entre em contato com o Suporte ao Cliente do(a) [Company Name] para consultas relacionadas a pagamentos. Os dados vinculados à conta serão excluídos quando você excluir a conta. A exclusão de alguns dados do jogo pode levar até 90 dias. * Entre em contato com a App Store ou com o Suporte ao Cliente do(a) [Company Name] para consultas relacionadas pagamentos.
인도네시아어 Data yang terhubung akan dihapus ketika kamu menghapus akun. Beberapa penghapusan data game akan memakan waktu hingga 90 hari. * Silakan hubungi Customer Support [Company Name] untuk melaporkan permasalahan terkait pembayaran. Data yang terhubung akan dihapus ketika kamu menghapus akun. Beberapa penghapusan data game akan memakan waktu hingga 90 hari. * Silakan hubungi Customer Support App Store atau [Company Name] untuk melaporkan permasalahan terkait pembayaran.
태국어 ถ้าคุณลบบัญชีของคุณ ข้อมูลที่เชื่อมต่อไว้จะถูกลบไปด้วย การลบข้อมูลเกมบางส่วนอาจใช้เวลาสูงสุดถึง 90 วัน * กรุณาติดต่อฝ่ายลูกค้าสัมพันธ์ [Company Name] หากต้องการส่งคำร้องหรือมีข้อสงสัยเกี่ยวกับการชำระเงิน ถ้าคุณลบบัญชีของคุณ ข้อมูลที่เชื่อมต่อไว้จะถูกลบไปด้วย การลบข้อมูลเกมบางส่วนอาจใช้เวลาสูงสุดถึง 90 วัน * กรุณาติดต่อ App Store หรือฝ่ายลูกค้าสัมพันธ์ [Company Name] หากต้องการส่งคำร้องหรือมีข้อสงสัยเกี่ยวกับการชำระเงิน
베트남어 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.
이탈리아어 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.
터키어 Hesabı sildiğinizde bağlantılı veriler silinecektir. Bazı oyun verilerinin silinmesi 90 gün kadar sürebilir. * Ödemeyle ilgili sorularınız için lütfen [Company Name] Müşteri Desteği ile iletişime geçin. Hesabı sildiğinizde bağlantılı veriler silinecektir. Bazı oyun verilerinin silinmesi 90 gün kadar sürebilir. * Ödemeyle ilgili sorularınız için lütfen App Store ya da [Company Name] Müşteri Desteği ile iletişime geçin.
아랍어 سيتم حذف البيانات المرتبطة عند حذف الحساب. قد يستغرق حذف بعض بيانات اللعبة ما يصل إلى٩٠ يومًا. * يرجى الاتصال بمركز دعم عملاء [Company Name] لأي استفسارات متعلقة بالدفع. سيتم حذف البيانات المرتبطة عند حذف الحساب. قد يستغرق حذف بعض بيانات اللعبة ما يصل إلى ٩٠ يومًا. * يرجى الاتصال بمتجر التطبيقات أو مركز دعم عملاء [Company Name] لأي استفسارات متعلقة بالدفع.
Note

문장 내 [회사명] 또는 [Company Name]에 게임사 고객센터 이름을 입력하세요.

구독 상품을 제공하는 게임에서는 팝업 문구에 언어별로 다음 문장을 추가하세요.

한국어 계정을 삭제하더라도 자동 구독 상품은 요금이 청구되므로 직접 구독을 해지해야 합니다.
영어 Automatic subscriptions will still be charged even if you delete your account, and you need to unsubscribe manually.
일본어 アカウントを削除しても定期購入商品は解約されず料金が請求されますので、手動で解約してください。
중국어(간체) 即使删除账号,自动订阅商品也会按期收取费用,因此必须手动解除订阅。
중국어(번체) 即使刪除帳號,自動訂閱商品仍會繼續扣款,需親自解除訂閱。
독일어 Automatische Abonnements werden auch dann noch berechnet, wenn du dein Konto gelöscht hast. Du musst dich manuell abmelden.
프랑스어 Les abonnements automatiques seront toujours facturés même si vous supprimez votre compte, vous devrez donc vous désabonner vous-même.
러시아어 Автоматическая подписка будет по-прежнему взимать плату даже при удалении аккаунта, поэтому Вам необходимо отменить подписку отдельно.
스페인어 Las suscripciones automáticas aún se cobrarán incluso si elimina su cuenta, y debe darlas de baja manualmente.
포르투갈어 As assinaturas automáticas ainda serão cobradas mesmo se você excluir sua conta, sendo necessário que você as cancele manualmente.
인도네시아어 Berlangganan otomatis akan tetap dikenakan biaya meskipun kamu menghapus akun, kamu harus membatalkan berlangganan secara manual.
태국어 การสมัครแพ็กเกจต่าง ๆ โดยอัตโนมัติจะยังมีผลอยู่แม้ว่าคุณลบบัญชีไปแล้ว และคุณต้องยกเลิกการสมัครแพ็กเกจเหล่านั้นด้วยตัวเอง
베트남어 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ý.
이탈리아어 Gli abbonamenti automatici verranno comunque addebitati anche dopo aver eliminato l'account, quindi bisogna annullare le rispettive iscrizioni separatamente.
터키어 Hesabınızı silseniz bile otomatik abonelikler ücretlendirilecektir ve manuel olarak abonelikten çıkmanız gerekir.
아랍어 سيستمر فرض رسوم على الاشتراكات التلقائية حتى إذا قمت بحذف حسابك ، وتحتاج إلى إلغاء الاشتراك يدويًا.

 

계정 삭제 완료 팝업 문구

언어 문구
한국어 계정 삭제가 완료되었습니다.
영어 The account has been deleted.
일본어 アカウント削除が完了しました。
중국어(간체) 已删除账号。
중국어(번체) 已成功刪除帳號。
독일어 Das Konto wurde gelöscht.
프랑스어 La suppression du compte a été effectuée
러시아어 Аккаунт удален.
스페인어 La cuenta se ha suprimido.
포르투갈어 A conta foi excluída.
인도네시아어 Akun telah dihapus.
태국어 บัญชีถูกลบแล้ว
베트남어 Đã hoàn thành xóa tài khoản.
이탈리아어 L'account è stato cancellato.
터키어 Hesap silme tamamlandı.
아랍어 تم حذف حسابك بنجاح.

계정 삭제 실패 팝업 문구

언어 문구
한국어 계정 삭제가 실패되었습니다. 잠시 후 다시 진행해 주세요.
영어 Failed to delete the account. Please try again later.
일본어 アカウント削除に失敗しました。しばらくしてからもう一度お試しください。
중국어(간체) 账号删除失败。请稍后再试。
중국어(번체) 帳號刪除失敗,請稍後再試。
독일어 Das Konto konnte nicht gelöscht werden. Bitte versuche es später erneut.
프랑스어 La suppression du compte a échoué. Veuillez réessayer dans quelques instants.
러시아어 Не удалось удалить аккаунт. Пожалуйста, попробуйте позже.
스페인어 Hubo un error al eliminar la cuenta. Por favor, inténtelo de nuevo más tarde.
포르투갈어 Falha ao excluir a conta. Por favor, tente novamente mais tarde.
인도네시아어 Gagal menghapus akun. Silakan coba lagi nanti.
태국어 การลบบัญชีล้มเหลว กรุณาลองใหม่ภายหลัง
베트남어 Xóa tài khoản thất bại. Vui lòng thử lại sau.
이탈리아어 Eliminazione dell'account fallito. Riprova più tardi.
터키어 Hesap silme başarısız. Daha sonra tekrar deneyiniz.
아랍어 فشل حذف الحساب. يرجى إعادة المحاولة في وقت لاحق.