로그인 타입 확인하기
GetLoginType은 이전 로그인의 상태를 리턴하여 현재 어떤 타입으로 로그인해야 하는지에 대해 알려준다.
GetLoginType의 결과에 따라 다음 4가지 경우로 로그인을 진행할 수 있다
- guest : 게스트 로그인으로 플레이 했던 유저, 게스트 자동 로그인 진행
- platform : Hive 로그인으로 플레이 했던 유저, Hive 자동 로그인 진행
- authorized : Hive 로그인 후 로그아웃 또는 삭제 후 재설치를 한 유저. 자동 로그인 불가, Hive 로그인 버튼만 노출 가능
- N/A : 로그인 기록이 없는 유저. 게스트 로그인, Hive 로그인 버튼 둘 다 노출
C2SModuleSns_GetLoginType
Request
argument name | type | desc | platform | 비고 |
---|---|---|---|---|
argumet는 없으며 콜백 형식이 아닌 바로 리턴 타입 |
Response
argument name | type | desc | platform | 비고 |
---|---|---|---|---|
N/A | string | guest : 게스트 유저의 세션키가 존재, 게스트 자동 로그인 진행 platform : Hive 유저의 세션키가 존재(게스트 로그인 금지), Hive 자동 로그인 진행 authorized : 세션키는 없으나 Hive 로그인한 적이 있는 유저(자동 로그인 불가) “” : empty string 세션키 없음(자동 로그인불가) |
all |
샘플 코드
API Reference: C2SModule.Sns.GetLoginType
- public static string C2SModule.Sns.GetLoginType();
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
string authType = C2SModule.Sns.GetLoginType(); if( authType != null){ if( authType.Equals("platform")) { C2SModule.Error error3; // Hive 계정으로 자동 login 한다. if(!C2SModule.Sns.Login (null, out error)) { ... } } //value가 "guest" 이면 게스트 계정으로 접속했었던 유저 else if(null != authType && authType.Equals("guest")){ C2SModule.Parameter arg2 = new C2SModule.Parameter (); arg2 ["type"] = "guest"; C2SModule.Error error2; // 게스트 계정으로 login 한다. if(!C2SModule.Sns.Login (arg2, out error2)) { ... } }else if(null != authType && authType.Equals("authorized")){ // 자동 로그인이 불가능한 상황 // Hive 유저의 로그아웃 후 앱 종료 후 재 실행 시 상황이 이에 해당됩니다. // 게스트 로그인 버튼 노출 없이 Hive 로그인 버튼만 노출 합니다. } else{ // "autoLoginType" 키에 대한 값이 없을 경우 // 처음 설치 후 실행 시 상황이 이에 해당됩니다. // 게스트 로그인버튼과 Hive 로그인 버튼 둘 다 노출 합니다. } }else{ // 처음 설치 후 실행 시 상황이 이에 해당됩니다. // 게스트 로그인 버튼과 Hive 로그인 버튼 둘 다 노출 합니다. } |
API Reference: HiveSDKUESns_GetLoginType
- FString HiveSDKUESns_GetLoginType();
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
FString strLoginType = FHiveSDKModule::Get().HiveSDKUESns_GetLoginType(); if( !strLoginType.IsEmpty() && strLoginType.Compare("platform") == 0 ) { // "autoLoginType" 의 value가 "platform" 이면 Hive 계정으로 접속했었던 유저. C2SModule_Cocos2dx::C2SModuleError error2; if( ::C2SModuleSns_Login( (char*)NULL, &error2 ) == false ) { UE_LOG(LogTemp, Warning, TEXT( "====>>>> Platform Login error (%s)"), error2.get()->GetMessage() ); } } else if( !strLoginType.IsEmpty() && strLoginType.Compare("guest") == 0 ) { // "autoLoginType" 의 value가 "guest" 이면 게스트 계정으로 접속했었던 유저. C2SModule_Cocos2dx::C2SModuleError error3; TSharedPtr argGuestLogin = MakeShareable(new FJsonObject); argGuestLogin->SetStringField(TEXT("type"), TEXT("guest")); FString strJSON; TSharedRef< TJsonWriter<> > Writer = TJsonWriterFactory<>::Create(&strJSON); FJsonSerializer::Serialize(argGuestLogin.ToSharedRef(), Writer); if( ::C2SModuleSns_Login( TCHAR_TO_ANSI(*strJSON), &error3 ) == false ) { UE_LOG(LogTemp, Warning, TEXT( "====>>>> Guest Login error (%s)"), error3.get()->GetMessage() ); } } else if( !authType.IsEmpty() && authType.Compare("authorized") == 0 ) { // "autoLoginType" 의 value가 "authorized" 이면 // Hive 계정으로 로그인 후 // 로그 아웃을 했거나 삭제 후 재설치를 한 유저 } else { // 로그인을 한번도 하지 않은 유저 } |
API Reference: C2SModuleSns_GetLoginType
- bool C2SModuleSns_GetLoginType( );
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
std::string authType = GetLoginType(); if( !authType.empty() && authType.compare("platform") == 0 ) { // "autoLoginType" 의 value가 "platform" 이면 Hive 계정으로 접속했었던 유저. C2SModule_Cocos2dx::C2SModuleError error2; if( ::C2SModuleSns_Login( (char*)NULL, &error2 ) == false ) { CCLog( "====>>>> Platform Login error (%s)", error2.get()->GetMessage() ); } } else if( !authType.empty() && authType.compare("guest") == 0 ) { // "autoLoginType" 의 value가 "guest" 이면 게스트 계정으로 접속했었던 유저. C2SModule_Cocos2dx::C2SModuleError error3; Json::Value argGuestLogin; argGuestLogin["type"] = "guest"; Json::StyledWriter writer; std::string strJSON = writer.write(argGuestLogin); if( ::C2SModuleSns_Login( strJSON.c_str(), &error3 ) == false ) { CCLog( "====>>>> Guest Login error (%s)", error3.get()->GetMessage() ); } } else if( !authType.empty() && authType.compare("authorized") == 0 ) { // "autoLoginType" 의 value가 "authorized" 이면 // Hive 계정으로 로그인 후 // 로그 아웃을 했거나 삭제 후 재설치를 한 유저 } else { // 로그인을 한번도 하지 않은 유저 } |
API Reference: C2SModuleSns GetLoginType
- +(NSString *)GetLoginType;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
NSString* loginType = [C2SModuleSns GetLoginType]; if (loginType == nil || [loginType isEqualToString@"authorized"] == YES) { if( [loginType isEqualToString@"authorized"] == YES ) //Hive 로그인을 한적이 있다면 게스트 로그인 버튼은 노출하면 안되므로 숨기는 코드를 추가합니다. //"authorized"는 예전 로그인 기록은 있지만 자동 로그인은 불가합니다. (로그인 유도 처리) } else { if([loginType isEqualToString:@"guest"] == YES) { //게스트 유저로 자동로그인 가능합니다. } else if([loginType isEqualToString:@"platform"] == YES) { //Hive 유저로 자동로그인 가능합니다. } } |
C2SModuleSns_Session
Hive 1.20.2.3 이상 적용 Android 빌드에서 Google Play Games for PC를 사용하는 빌드인 경우 C2SModuleSns_GetLoginType이 아닌 C2SModuleSns_Session을 통해 어떤 타입으로 로그인해야 하는지 확인합니다.
Request
argument name | type | desc | platform | 비고 |
---|---|---|---|---|
service | string | “googlePlayGames”: Google Play Games for PC 적용 시 googlePlayGames 로 설정하면 Hive SDK는 Google Player Id에 연결된 Hive 계정 식별자 정보를 탐색합니다. |
Android | Hive 1.20.2.3+ |
Response
argument name | type | desc | platform | 비고 |
---|---|---|---|---|
service | string | “googlePlayGames” | Android | Hive 1.20.2.3+ |
sessionType | string |
“autoGuest”: 게스트 세션이 있는 상태, 해당 값 확인 후 C2SModuleSns_Login으로 게스트 로그인 요청을 진행한다. “autoHive”: Hive 정식유저 세션이 있는 상태, 해당 값 확인 후 C2SModuleSns_Login으로 Hive 정식유저 로그인을 요청한다. “none”: 세션이 없는 상태, 해당 값 확인 후 C2SModuleSns_Login 호출 시 게스트 버튼 노출 값(showGuestLogin 값. true 또는 false)을 설정하여 요청한다. |
Android | Hive 1.20.2.3+ |
참고 플로우(Android)
샘플 코드
1 2 3 4 5 6 7 |
C2SModule.Error error; C2SModule.Parameter arg; arg[ "service"] = "googlePlayGames" if(!C2SModule.Sns.Session(arg, out error)) { // Error시 처리 } |
1 2 3 4 5 6 7 8 9 10 |
Json::Value arg; arg["service"] = "googlePlayGames"; Json::StyledWriter writer; std::string strJSON = writer.write(arg); C2SModule_Cocos2dx::C2SModuleError error; if( ::C2SModuleSns_Session( strJSON.c_str(), &error ) == false ) { CCLog( "====>>>> Sns Session error (%s)", error.get()->GetMessage() ); } |
게스트 로그인
로그인 타입 확인의 결과가 guest이거나, 유저가 게스트 로그인 버튼을 클릭 시 사용한다.
게스트 세션키가 존재하는 경우 해당 게스트 VID로 로그인 되며, 없는 경우 새로운 게스트 VID가 생성된다.
게스트 로그인: C2SModuleSns_Login
- 로그인 요청을 한다.
- Delegate에 C2SModuleApi_SnsLogin 콜백이 내려온다.
Request
argument name | type | desc | platform | 비고 |
---|---|---|---|---|
type | string | “guest”: 게스트 로그인을 요청한다. “select” : 생성된 게스트 유저 vid와 Hive 유저 vid의 데이터를 선택하는 웹뷰를 띄운다. N/A : Hive 로그인을 요청한다. |
all | |
currentVidData | Dictionary | (optional)”select” 일 때, 현재 게스트 유저 데이터 | all | |
usedVidData | Dictionary | (optional)”select” 일 때, Hive 유저 게임 데이터 | all |
Response
argument name | type | desc | platform | 비고 |
---|---|---|---|---|
type | string | “guest” | all | |
vid | string | 게스트 유저 vid | all | |
sessionToken | string | session key | all |
샘플 코드
API Reference: C2SModule.Sns.Login
- public static bool C2SModule.Sns.Login(C2SModule.Parameter arg, out C2SModule.Error error) ;
- public static bool C2SModule.Sns.Login(C2SModule.Parameter arg, out C2SModule.Error error, C2SModule.CompletionHandler completionHandler);
1 2 3 4 5 6 7 8 |
C2SModule.Error error; C2SModule.Parameter arg; arg["type"] = "guest"; if(!C2SModule.Sns.Login(arg, out error)) { // Error시 처리 } |
API Reference: HiveSDKUESns_Login
- void HiveSDKUESns_Login(FString fstrJson);
1 2 3 4 5 6 |
TSharedPtr arg = MakeShareable(new FJsonObject); arg->SetStringField(TEXT("type"), TEXT("guest")); FString OutputString; TSharedRef< TJsonWriter<> > Writer = TJsonWriterFactory<>::Create(&OutputString); FJsonSerializer::Serialize(arg.ToSharedRef(), Writer); FHiveSDKModule::Get().HiveSDKUESns_Login(OutputString); |
API Reference: C2SModuleSns_Login
- bool C2SModuleSns_Login(const char* pstrJson, C2SModule_Cocos2dx::C2SModuleError* pkError,
C2SModule_Cocos2dx::C2SModuleCompletionHandler* completionHandler = NULL);
1 2 3 4 5 6 7 8 9 10 |
Json::Value argGuestLogin; argGuestLogin["type"] = "guest"; Json::StyledWriter writer; std::string strJSON = writer.write(argGuestLogin); C2SModule_Cocos2dx::C2SModuleError error; if( ::C2SModuleSns_Login( strJSON.c_str(), &error ) == false ) { CCLog( "====>>>> Guest Login error (%s)", error.get()->GetMessage() ); } |
API Reference: C2SModuleSns Login
- +(BOOL)Login:(id)arg error:(NSError**)error;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
NSError* error; id arg = nil; //게스트로 로그인하려면 type에 "guest"를 넣어줍니다. //Hive 유저 로그인을 요청하려면 파라메터로 nil을 넣어주면 됩니다. if(isGuestLogin == YES) arg = @{@"type":@"guest"}; [C2SModuleSns Login:arg error:&error completionHandler:^(NSDictionary* resultArg,NSError* resultError){ if(resultError == nil) { //로그인 관련 처리를 합니다. } }]; |
Hive 로그인
Hive 로그인은 Hive에 가입하여 계정을 생성하거나, Google+, Facebook 계정과 연동을 통해 생성된 계정을 이용하여 로그인하는 것을 의미한다. Hive 로그인은 다음 3가지 경우에 구현한다.
- 로그인 타입 확인의 결과가 platform일 경우
- 게임 타이틀에서 유저가 Hive 로그인 버튼을 클릭 시
- 게스트 로그인 상태에서 유저가 Hive 로그인 버튼을 클릭 시
게스트 로그인 상태에서 Hive 계정으로 로그인을 하게 되면 Hive 내부적으로 게스트 유저의 VID에 Hive 유저의 UID를 매핑하여 Hive로 전환을 하게 된다.
- Select User가 발생하는 경우
-
예외 상황
Select User 상황에서 로그인 된 Hive 계정이 VID 제재된 상황
유저가 제재 계정을 선택한 경우, 해당 계정에 대한 제재 안내 팝업을 띄우고 LIVE 로그인 세션을 삭제한다. 이후 다시 Hive 계정 전환을 하려면 재로그인이 필요하다. 또한, 유저가 Hive 계정 전환에 실패 시 게스트 계정 상태로 유지된다.
자동 로그인
Hive 로그인 세션이 존재하면 세션을 통해서 자동으로 로그인하는 것이 가능하다.
Login Sessionkey 만료
로그인 시 Invalid Sessionkey (10) 에러가 발생 할 경우 세션이 유효하지 않은 상황으로 자동 로그인이 불가하다. 이때 수동 로그인으로 전환이 필요하며 게임 화면에 Hive 로그인 버튼을 노출 해야 한다.
Hive 로그인: C2SModuleSns_Login
로그인을 요청한다.
Request
argument name | type | desc | platform | 비고 |
---|---|---|---|---|
type | string | “guest” : 게스트 로그인을 요청한다. “select” : 생성된 게스트 유저 vid와 Hive 유저 vid의 데이터를 선택하는 웹뷰를 띄운다. “customSelect” : selectVid로 Hive 유저 전환 요청한다.(1.10.1+) (게스트 vid와 Hive 유저 vid의 데이터를 선택하는 자체 UI에서 선택한 유저의 vid 를 호출) N/A: Hive 로그인을 요청한다. |
all | |
showGuestLogin | string | true: IdP 리스트 로그인 페이지에 게스트 버튼을 노출한다. type이 N/A인 경우만 사용 가능하다. 또한 showGuestLogin 설정은 Google Play Games for PC를 적용한 경우만 사용 가능하다. (예: Hive 1.20.2.3을 사용하여 Android 빌드에 GPG for PC를 적용하였다면 Hive 1.20.2.3을 사용하는 iOS 빌드도 showGuestLogin 설정 필요, 자세한 설명은 하단에 ‘IdP 로그인 페이지’ 설명 참고) false: IdP 리스트 로그인 페이지에 게스트 버튼을 노출하지 않는다. (로그아웃 이후 타이틀 이동 후 로그인 화면을 띄우거나 게스트 상태에서 정식 계정 전환시 게스트 버튼을 노출하지 않도록 false로 설정합니다) |
all | |
type = “select” 일 때 | ||||
currentVidData | Dictionary | 현재 게스트 데이터 | all | |
usedVidData | Dictionary | Hive 유저 게임 데이터 | all | |
type = “customSelect” 일 때 | ||||
selectVid | string | Hive 유저 전환 요청 vid | all | 1.10.1+ |
Response
로그인 결과값을 받는다. (Hive 로그인일 때)
- 정식 로그인 시
argument name | type | desc | platform | 비고 |
---|---|---|---|---|
vid | string | 로그인 센터 vid – 유저 식별자로 유니크한 값 | all | |
uid | string | Hive 로그인시 발급되는 유니크한 값 | all | |
sessionToken | string | session key | all |
- Select 상황 발생 시
argument name | type | desc | platform | 비고 |
---|---|---|---|---|
type | string | “select” | all | |
currentVid | string | 현재 로그인한 vid | all | |
usedVid | string | 매칭되는 Hive 유저의 vid | all |
- showGuestLogin = true 로 호출한 경우
유저가 Hive 정식 로그인을 진행하였다면 위 ‘정식 로그인 시’ 와 동일한 결과를 갖는다. 그러나, 노출된 Hive 로그인 페이지에서 ‘게스트 로그인’ 버튼을 수행하였을 경우 C2SModule.Error 값으로 NeedGuestLogin(-202) 값을 받는다. 이런 경우 유저가 게스트 로그인을 원하는 상황이기 때문에 이후 C2SModuleSns_Login을 type = guest 로 다시 호출하여 게스트 로그인을 진행한다. 자세한 설명은 하단 ‘IdP 로그인 페이지’를 참고한다.
샘플 코드
API Reference: C2SModule.Sns.Login
- public static bool C2SModule.Sns.Login(C2SModule.Parameter arg, out C2SModule.Error error) ;
- public static bool C2SModule.Sns.Login(C2SModule.Parameter arg, out C2SModule.Error error, C2SModule.CompletionHandler completionHandler);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
/*Hive 로그인*/ C2SModule.Error error; C2SModule.Parameter arg; if(!C2SModule.Sns.Login(arg, out error)) { // Error시 처리 } /*Data Select - Select*/ C2SModule.Error error; string currentVid = argResult["currentVid"] as string; string usedVid = argResult["usedVid"] as string; C2SModule.Parameter argCurrent; argCurrent["vid"] = currentVid; C2SModule.Parameter currentData; currentData["Name"] = "test1"; currentData["Level"] = "1"; currentData["Gold"] = "11"; currentData["Cash"] = "111"; argCurrent["data"] = currentData; C2SModule.Parameter argUsed; argUsed["vid"] = usedVid; C2SModule.Parameter usedData; usedData["Name"] = "test2"; usedData["Level"] = "2"; usedData["Gold"] = "22"; usedData["Cash"] = "222"; argUsed["data"] = usedData; C2SModule.Parameter arg; arg["type"] = "select"; arg["currentVidData"] = argCurrent; arg["usedVidData"] = argUsed; if(!C2SModule.Sns.Login(arg, out error) { // Error 시 처리 } /*Data Select - customSelect*/ string selectVid = (커스텀 셀렉트 뷰에서 Hive 유저 전환으로 선택한 유저의 vid 값); C2SModule.Error error; C2SModule.Parameter arg; arg["type"] = "customSelect"; arg["selectVid"] = selectVid; if(!C2SModule.Sns.Login(arg, out error) { // 에러 시 처리 } |
API Reference: HiveSDKUESns_Login
- void HiveSDKUESns_Login(FString fstrJson);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 |
/*Hive 로그인*/ TSharedPtr argHiveLogin = MakeShareable(new FJsonObject); FString OutputString; TSharedRef< TJsonWriter<> > Writer = TJsonWriterFactory<>::Create(&OutputString); FJsonSerializer::Serialize(argHiveLogin.ToSharedRef(), Writer); FHiveSDKModule::Get().HiveSDKUESns_Login(OutputString); /*Data Select - Select*/ void MYGAMECLASS::ResultDelegate(C2SModuleApi api, const char* json, C2SModuleErrorCode code, const char* message) { switch(api) { case C2SModuleApi_SnsLogin: { if ( FJsonSerializer::Deserialize( reader, arg ) == false ){ if (json != NULL){ UE_LOG(LogTemp, Warning, TEXT("====>>>> parse failed : (%s)"), json ); } else { UE_LOG(LogTemp, Warning, TEXT("json Empty.(Null)")); } return; } // "type"키가 있는지 확인한다. if(arg->HasField(TEXT("type") ) ) { FString rst_type = arg->GetStringField("type"); // "type"의 value가 "select"라면 선택 창을 띄워 어떤 데이터를 유지할지 선택하게 한다. if( !rst_type.IsEmpty() && rst_type.Compare("select") == 0 ) { FString currentVid = arg->GetStringField("currentVid"); FString usedVid = arg->GetStringField("usedVid"); //게스트, Hive 유저 예제 데이터 // 게스트 유저 vid와 데이터 TSharedPtr argCurrent = MakeShareable(new FJsonObject); argCurrent->SetStringField(TEXT("vid"), currentVid); TSharedPtr currentData = MakeShareable(new FJsonObject); currentData->SetStringField(TEXT("Name"), TEXT("test1")); currentData->SetStringField(TEXT("Level"), TEXT("1")); currentData->SetStringField(TEXT("Gold"), TEXT("11")); currentData->SetStringField(TEXT("Cash"), TEXT("111")); argCurrent->SetObjectField(TEXT("data"), currentData); // 마지막 로그인했던 Hive 유저의 vid와 데이터 TSharedPtr argUsed = MakeShareable(new FJsonObject); argUsed->SetStringField(TEXT("vid"), usedVid); TSharedPtr usedData = MakeShareable(new FJsonObject); usedData->SetStringField(TEXT("Name"), TEXT("test2")); usedData->SetStringField(TEXT("Level"), TEXT("2")); usedData->SetStringField(TEXT("Gold"), TEXT("22")); usedData->SetStringField(TEXT("Cash"), TEXT("222")); argUsed->SetObjectField(TEXT("data"), usedData); TSharedPtr arg2 = MakeShareable(new FJsonObject); arg2->SetStringField(TEXT("type"), TEXT("select")); arg2->SetObjectField(TEXT("currentVidData"), argCurrent); arg2->SetObjectField(TEXT("usedVidData"), argUsed); FString strJSON; TSharedRef< TJsonWriter<> > Writer = TJsonWriterFactory<>::Create(&strJSON); FJsonSerializer::Serialize(arg2.ToSharedRef(), Writer); UE_LOG(LogTemp, Warning, TEXT("====>>>> Login Select json : (%s)"), *strJSON ); C2SModule_Cocos2dx::C2SModuleError error2; if( ::C2SModuleSns_Login( TCHAR_TO_ANSI(*strJSON), &error2 ) == false ) { // CCLog( "====>>>> Guest Login error (%s)", error2.get()->GetMessage() ); } } else { //Save login VID userVID = arg->GetStringField("vid"); } } else { //Save login VID userVID = arg->GetStringField("vid"); } } break; } } /*Data Select - customSelect*/ void MYGAMECLASS::ResultDelegate(C2SModuleApi api, const char* json, C2SModuleErrorCode code, const char* message) { switch(api) { case C2SModuleApi_SnsLogin: { if ( FJsonSerializer::Deserialize( reader, arg ) == false ){ if (json != NULL){ UE_LOG(LogTemp, Warning, TEXT("====>>>> parse failed : (%s)"), json ); } else { UE_LOG(LogTemp, Warning, TEXT("json Empty.(Null)")); } return; } // "type"키가 있는지 확인합니다. if(arg->HasField(TEXT("type") ) ) { FString rst_type = arg->GetStringField("type"); // "type"의 value가 "select"라면 선택 창을 띄워 어떤 데이터를 유지할지 선택하게 합니다. if( !rst_type.IsEmpty() && rst_type.Compare("select") == 0 ) { // 커스텀 셀렉트 뷰를 띄워 정식전환할 계정을 선택합니다. FString selectVid = (정식전환할 계정의 vid); TSharedPtr arg2 = MakeShareable(new FJsonObject); arg2->SetStringField(TEXT("type"), TEXT("customSelect")); arg2->SetStringField(TEXT("selectVid"), selectVid); FString strJSON; TSharedRef< TJsonWriter<> > Writer = TJsonWriterFactory<>::Create(&strJSON); FJsonSerializer::Serialize(arg2.ToSharedRef(), Writer); UE_LOG(LogTemp, Warning, TEXT("====>>>> Login Select json : (%s)"), *strJSON ); C2SModule_Cocos2dx::C2SModuleError error2; if( ::C2SModuleSns_Login( TCHAR_TO_ANSI(*strJSON), &error2 ) == false ) { // CCLog( "====>>>> Guest Login error (%s)", error2.get()->GetMessage() ); } } else { //Save login VID userVID = arg->GetStringField("vid"); } } else { //Save login VID userVID = arg->GetStringField("vid"); } } break; } } |
API Reference: C2SModuleSns_Login
- bool C2SModuleSns_Login(const char* pstrJson, C2SModule_Cocos2dx::C2SModuleError* pkError,
C2SModule_Cocos2dx::C2SModuleCompletionHandler* completionHandler = NULL);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
/*Hive 로그인*/ Json::Value argGuestLogin; Json::StyledWriter writer; std::string strJSON = writer.write(argGuestLogin); C2SModule_Cocos2dx::C2SModuleError error; if( ::C2SModuleSns_Login( strJSON.c_str(), &error ) == false ) { CCLog( "====>>>> Guest Login error (%s)", error.get()->GetMessage() ); } /*Data Select - Select*/ void SampleProject::ResultDelegate(C2SModuleApi api, const char* json, C2SModuleErrorCode code, const char* message) { switch(api) { case C2SModuleApi_SnsLogin: { // "type"키가 있는지 확인합니다. if( arg.isMember("type") ) { std::string rst_type = arg.get("type", "").asString(); // "type"의 value가 "select"라면 선택 창을 띄워 어떤 데이터를 유지할지 선택하게 된다. if( !rst_type.empty() && rst_type.compare("select") == 0 ) { std::string currentVid = arg.get("currentVid", "").asString(); std::string usedVid = arg.get("usedVid", "").asString(); // 게스트 유저 vid와 데이터 Json::Value argCurrent; argCurrent["vid"] = currentVid; Json::Value currentData; currentData["Name"] = "test1"; currentData["Level"] = "1"; currentData["Gold"] = "11"; currentData["Cash"] = "111"; argCurrent["data"] = currentData; // 마지막 로그인했던 Hive 유저의 vid와 데이터 Json::Value argUsed; argUsed["vid"] = usedVid; Json::Value usedData; usedData["Name"] = "test2"; usedData["Level"] = "2"; usedData["Gold"] = "22"; usedData["Cash"] = "222"; argUsed["data"] = usedData; Json::Value arg2; arg2["type"] = "select"; arg2["currentVidData"] = argCurrent; arg2["usedVidData"] = argUsed; Json::StyledWriter writer; std::string strJSON = writer.write(arg2); C2SModule_Cocos2dx::C2SModuleError error2; if( ::C2SModuleSns_Login( strJSON.c_str(), &error2 ) == false ) { CCLog( "====>>>> Guest Login error (%s)", error2.get()->GetMessage() ); } } else { vid = arg.get("vid", "").asString(); } } } } /*Data Select - customSelect*/ void SampleProject::ResultDelegate(C2SModuleApi api, const char* json, C2SModuleErrorCode code, const char* message) { switch(api) { case C2SModuleApi_SnsLogin: { // "type"키가 있는지 확인한다. if( arg.isMember("type") ) { std::string rst_type = arg.get("type", "").asString(); // "type"의 value가 "select"라면 선택 창을 띄워 어떤 데이터를 유지할지 선택하게 한다. if( !rst_type.empty() && rst_type.compare("select") == 0 ) { // Hive 유저로 전환 할 계정의 vid std::string selectVid = arg.get("selectVid", "").asString(); Json::Value arg2; arg2["type"] = "customSelect"; arg2["selectVid"] = selectVid; Json::StyledWriter writer; std::string strJSON = writer.write(arg2); C2SModule_Cocos2dx::C2SModuleError error2; if( ::C2SModuleSns_Login( strJSON.c_str(), &error2 ) == false ) { CCLog( "====>>>> Guest Login error (%s)", error2.get()->GetMessage() ); } } else { vid = arg.get("vid", "").asString(); } } } } |
API Reference: C2SModuleSns Login
- +(BOOL)Login:(id)arg error:(NSError**)error;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
/*Hive 로그인*/ NSError* error; id arg = nil; //게스트로 로그인하려면 type에 "guest"를 넣어준다. //Hive 유저 로그인을 요청하려면 파라메터로 nil을 넣어준다. if(isGuestLogin == YES) arg = @{@"type":@"guest"}; [C2SModuleSns Login:arg error:&error completionHandler:^(NSDictionary* resultArg,NSError* resultError){ if(resultError == nil) { //로그인 관련 처리를 한다. } }]; /*Data Select - Select*/ [C2SModuleSns Login:arg error:&error completionHandler:^(NSDictionary* resultArg,NSError* resultError){ if(resultError == nil) { NSString* type = resultArg[@"type"]; if(type != nil && [type isEqualToString:@"select"] == YES) { NSString* usedVid = [resultArg objectForKey:@"usedVid"]; NSString* currentVid = [resultArg objectForKey:@"currentVid"]; NSMutableDictionary* selectData = [[NSMutableDictionary alloc] init]; NSMutableDictionary* currentUserData = [[NSMutableDictionary alloc] init]; NSMutableDictionary* usedUserData = [[NSMutableDictionary alloc] init]; usedUserData["vid"] = usedVid; //웹뷰에 노출될 유저정보 셋팅 usedUserData["data"] = @{@"name":@"name1",@"gold":@"100"}; currentUserData["vid"] = currentVid; //웹뷰에 노출될 유저정보 셋팅 currentUserData["data"] = @{@"name":@"name2",@"gold":@"1000"}; selectData[@"type"] = @"select"; selectData[@"usedVidData"] = currentUserData; selectData[@"currentVidData"] = usedUserData; NSError* error; [C2SModuleSns Login:selectData error:&error completionHandler:^(NSDictionary *selectResultArg, NSError *selectResutError) { if(selectResutError == nil) { //Hive 유저 로그인과 같은 처리를 한다. } }]; } } }]; /*Data Select - customSelect*/ [C2SModuleSns Login:arg error:&error completionHandler:^(NSDictionary* resultArg,NSError* resultError){ if(resultError == nil) { NSString* type = resultArg[@"type"]; if(type != nil && [type isEqualToString:@"select"] == YES) { (커스텀 셀렉트 뷰에서 Hive 유저로 전환 할 계정을 선택) NSString* selectVid = (Hive 유저로 전환 할 계정의 vid); NSMutableDictionary* arg2 = [[NSMutableDictionary alloc] init]; arg2[@"type"] = @"customSelect"; arg2[@"selectVid"] = selectVid; NSError* error; [C2SModuleSns Login:arg2 error:&error completionHandler:^(NSDictionary *selectResultArg, NSError *selectResutError) { if(selectResutError == nil) { //Hive 유저 로그인과 같은 처리를 한다. } }]; } } |
IDP 로그인 페이지
Hive 1.20.2.3 버전부터 Android 빌드가 Google Play Games for PC를 적용한 경우 C2SModuleSns_Login 호출 시 IdP 로그인 페이지를 노출할 수 있다. Android의 GPG for PC 적용 상태에 영향을 받아 iOS 빌드도 IdP 로그인 페이지로 노출된다. (Hive 서버에서 제어됨) 단, 이 경우 iOS 빌드도 Hive 1.20.2.3 이상 버전이 적용되어야 한다.
C2SModuleSns_Login 호출 시 Argument 값에 showGuestLogin = true 를 설정한 경우 게스트 로그인 버튼을 노출할 수 있다. 유저가 게스트 로그인 버튼을 누른 경우 C2SModuleSns_Login 콜백의 error 값으로 NeedGuestLogin(-202)가 전달된다. 이 경우 다시 C2SModuleSns_Login에 type = guest 값을 설정 후 호출하여 게스트 로그인을 진행시킨다.
게스트 버튼을 노출하고 싶지 않은 경우 showGuestLogin = false 값을 설정하여 C2SModuleSns_Login을 호출한다(예: C2SModuleSns_Logout 후 다시 로그인 유도 시). IdP 로그인 페이지를 통해 게스트 버튼을 활성화할 수 있기 때문에 게임앱에선 자체구현하고 있는 ‘게스트 로그인’, ‘Hive 로그인’ 2개의 버튼을 제거하고 하나의 ‘로그인’ 버튼으로 로그인을 유도한다.
IdP 로그인 페이지를 활용한 Android, iOS 로그인 플로우는 아래를 참고한다.
로그아웃
로그아웃을 한다.
Request
argument name | type | desc | platform | 비고 |
---|---|---|---|---|
Hive 정식 유저 로그아웃 | ||||
argumet 없음 | ||||
회원 탈퇴 후 로그아웃 (게스트, Hive 정식 유저 탈퇴에 해당) | ||||
type | string | “userExit” | all | 1.19.5.2, 1.20.0+ |
Response
argument name | type | desc | platform | 비고 |
---|---|---|---|---|
argument는 없으며 로그아웃 완료 후 Result Callback 전달 |
샘플 코드
API Reference: C2SModule.Sns.Logout
- public static bool C2SModule.Sns.Logout(C2SModule.Parameter arg, out C2SModule.Error error) ;
- public static bool C2SModule.Sns.Logout(C2SModule.Parameter arg, out C2SModule.Error error,
C2SModule.CompletionHandler completionHandler);
1 2 3 |
C2SModule.Error error; C2SModule.Parameter arg; C2SModuleSns.Logout(arg, out error); |
API Reference: HiveSDKUESns_Logout
- void HiveSDKUESns_Logout(FString fstrJson);
1 2 |
FString empty; FHiveSDKModule::Get().HiveSDKUESns_Logout(empty); |
API Reference: C2SModuleSns_Logout
- bool C2SModuleSns_Logout(const char* pstrJson, C2SModule_Cocos2dx::C2SModuleError* pkError,
C2SModule_Cocos2dx::C2SModuleCompletionHandler* completionHandler = NULL);
1 2 3 4 |
C2SModule_Cocos2dx::C2SModuleError error; if( ::C2SModuleSns_Logout( (char*)NULL, &error) == false ) { CCLog( "====>>>> Logout error (%s)", error.get()->GetMessage() ); } |
API Reference: C2SModuleSns Logout
- +(BOOL)Logout:(id)arg error:(NSError**)error;
- +(BOOL)Logout:(id)arg error:(NSError**)error completionHandler:(void(^)(NSDictionary *, NSError*))
completionHandler;
1 2 3 4 5 6 7 |
NSError* error; [C2SModuleSns Logout:nil error:&error completionHandler:^(NSDictionary* resultArg,NSError* resultError){ if(resultError == nil) { //로그아웃 관련 처리를 한다. } }]; |
인증 에러 코드
Hive Module error code | code | desc |
---|---|---|
Success | 0 | 성공 |
Server Error | 1 | 서버 내부 에러 |
Invalid AppID | 2 | 등록되지 않은 AppID |
Invalid GameID | 3 | 등록되지 않은 GameID (현재는 AppID만 보고 판단하므로 미사용) |
Invalid Api | 4 | 유효하지 않은 API 호출 |
Invalid platform | 5 | 유효하지 않은 platform (현재는 Hive만 사용하므로 미사용) |
Invalid account | 6 | 발급되지 않았거나 유효하지 않은 VID |
Invalid Sessionkey | 10 | 유효하지 않은 세션. 해당 VID의 세션키가 변경되었거나 잘못된 세션키를 보냈을 경우. |
Kakao server connect error | 100 | Hive 로그인시 카카오 서버로 세션검증을 위한 연결 시도 실패 (현재 카카오는 지원 안함) |
Kakao auth error | 101 | Hive 로그인시 카카오서버를 통한 카카오 계정 세션검증 실패 (현재 카카오는 지원 안함) |
Hub server connection error | 102 | Hive 로그인시 Hive 소셜 서버로 세션검증을 위한 연결 시도 실패 |
Hub auth error | 103 | Hive 로그인시 Hive 소셜 서버를 통한 UID 세션검증 실패 |
database connect fail | 1000 | 내부 Database 연결 실패로 처리 불가 상태 |
database error | 1001 | Database 연결은 되었으나 처리를 할 수 없는 에러 발생 |
blocking | 2000 | 블럭된 유저(vid, uid, did)로 로그인 실패 |