Gamebase에서 지원하는 부가적인 기능을 설명합니다.
API
+ (NSString *)idfa;
[주의]
iOS 14 이상부터 IDFA 값 요청 시, 사용자 권한을 받아야합니다. 사용자 권한 요청할 때 노출시킬 문구를 info.plist에 설정을 해야 합니다. info.plist에 'Privacy - Tracking Usage Description'을 설정하십시오.
API
+ (NSString *)deviceLanguageCode;
점검 팝업 창과 같이 Gamebase가 표시하는 언어는 단말기에 설정된 언어로 표시됩니다.
그런데 게임에서 표시하는 언어를 단말기에 설정된 언어가 아닌, 별도의 옵션으로 언어를 변경할 수 있는 게임이 있습니다. 예를 들어, 단말기에 설정된 언어는 영어 이지만 게임 표시 언어를 일본어로 변경한 경우, Gamebase에서 표시하는 언어도 일본어로 변경하고 싶지만 Gamebase가 표시하는 언어는 단말기에 설정된 언어인 영어로 표시됩니다.
이와 같이 단말기에 설정된 언어가 아닌, 다른 언어로 Gamebase 메시지를 표시하고 싶은
애플리케이션을 위해 Gamebase 는 Display Language
라는 기능을 제공합니다.
Gamebase는 Display Language로 설정한 언어로 Gamebase 메시지를 표시합니다. Display Language에 입력하는 언어 코드는 반드시 아래의 표(Gamebase에서 지원하는 언어코드의 종류)에 지정된 코드만을 사용할 수 있습니다.
[주의]
- Display Language는 단말기 설정 언어와 무관하게 Gamebase의 표시 언어를 변경하고 싶은 경우에만 사용하시기 바랍니다.
- Display Language Code는 ISO-639 형태의 값으로, 대소문자를 구분합니다. 'EN'이나 'zh-cn'과 같이 설정하면 문제가 발생할 수 있습니다.
- 만일 Display Language Code로 입력한 값이 아래의 표(Gamebase에서 지원하는 언어코드의 종류)에 존재하지 않는다면, Display Langauge Code는 Gamebase 콘솔에서 설정한 기본 언어로 지정됩니다.
- 만일 Gamebase 콘솔에서 언어 설정을 하지 않았다면 영어(en)가 기본 언어로 설정됩니다.
[참고]
- Gamebase의 클라이언트 메시지는 영어(en), 한글(ko), 일본어(ja)만 포함하고 있으므로 아래의 표에 존재하는 언어 코드라 할지라도 영어(en), 한글(ko), 일본어(ja) 이외의 언어를 지정하면 기본값인 영어(en)로 자동 설정됩니다.
- Gamebase의 클라이언트에 포함되어 있지 않은 언어셋은 직접 추가할 수 있습니다. 신규 언어셋 추가 항목을 참조하시기 바랍니다.
Code | Name |
---|---|
de | German |
en | English |
es | Spanish |
fi | Finnish |
fr | French |
id | Indonesian |
it | Italian |
ja | Japanese |
ko | Korean |
pt | Portuguese |
ru | Russian |
th | Thai |
vi | Vietnamese |
ms | Malay |
zh-CN | Chinese-Simplified |
zh-TW | Chinese-Traditional |
해당 언어 코드는 TCGBConstants.h
에 정의되어 있습니다.
#pragma mark - DisplayLanguageCode
extern NSString* const kTCGBDisplayLanguageCodeGerman;
extern NSString* const kTCGBDisplayLanguageCodeEnglish;
extern NSString* const kTCGBDisplayLanguageCodeSpanish;
extern NSString* const kTCGBDisplayLanguageCodeFinnish;
extern NSString* const kTCGBDisplayLanguageCodeFrench;
extern NSString* const kTCGBDisplayLanguageCodeIndonesian;
extern NSString* const kTCGBDisplayLanguageCodeItalian;
extern NSString* const kTCGBDisplayLanguageCodeJapanese;
extern NSString* const kTCGBDisplayLanguageCodeKorean;
extern NSString* const kTCGBDisplayLanguageCodePortuguese;
extern NSString* const kTCGBDisplayLanguageCodeRussian;
extern NSString* const kTCGBDisplayLanguageCodeThai;
extern NSString* const kTCGBDisplayLanguageCodeVietnamese;
extern NSString* const kTCGBDisplayLanguageCodeMalay;
extern NSString* const kTCGBDisplayLanguageCodeChineseSimplified;
extern NSString* const kTCGBDisplayLanguageCodeChineseTraditional;
Gamebase 초기화 시 Display Language를 설정할 수 있습니다.
API
+ (void)initializeWithConfiguration:(TCGBConfiguration *)configuration completion:(InitializeCompletion)completion;
Example
- (void)initializeWithDisplayLanguageConfiguration {
TCGBConfiguration* config = [TCGBConfiguration configurationWithAppID:@"your app(project) ID" appVersion:@"your app version"];
[config setDisplayLanguageCode:kTCGBDisplayLanguageCodeEnglish];
[TCGBGamebase initializeWithConfiguration:config completion:^(LaunchingInfo launchingData, TCGBError *error) {
if ([TCGBGamebase isSuccessWithError:error] == YES) {
NSLog(@"TCGBGamebase initialization is succeeded");
// Check status of you app.
// If status of app is maintenance or terminated service or etc, you must blocking UI and you should make user cannot log in your service.
// You can use [TCGBLaunching launchingStatus] method to check status of your app.
}
else {
NSLog(@"TCGBGamebase initialization is failed with error:[%@]", [error description]);
}
}];
}
Gamebase 초기화 시 입력된 Display Language를 변경할 수 있습니다.
API
+ (void)setDisplayLanguageCode:(NSString *)languageCode;
Example
- (void)setDisplayLanguageCode {
[TCGBGamebase setDisplayLanguageCode:kTCGBDisplayLanguageCodeEnglish];
}
현재 적용된 Display Language를 조회할 수 있습니다.
API
+ (NSString *)displayLanguageCode;
Example
- (void)getDisplayLanguageCode()
{
NSString* displayLanguage = [TCGBGamebase displayLanguageCode];
}
Gamebase에서 제공하는 기본 언어(ko, en, ja, zh-CN, zh-TW, th) 외 다른 언어를 사용하는 경우에는 Xcode 프로젝트의 Copy Bundle Resources
에 localizedstring.json 파일을 추가하면 됩니다.
localizedstring.json에 정의되어 있는 형식은 아래와 같습니다.
{
"en": {
"common_ok_button": "OK",
"common_cancel_button": "Cancel",
...
"launching_service_closed_title": "Service Closed"
},
"ko": {
"common_ok_button": "확인",
"common_cancel_button": "취소",
...
"launching_service_closed_title": "서비스 종료"
},
"ja": {
"common_ok_button": "確認",
"common_cancel_button": "キャンセル",
...
"launching_service_closed_title": "サービス終了"
},
"zh-CN": {
"common_ok_button": "确定",
"common_cancel_button": "取消",
...
"launching_service_closed_title": "关闭服务"
},
"zh-TW": {
"common_ok_button": "好",
"common_cancel_button": "取消",
...
"launching_service_closed_title": "服務關閉"
},
"th": {
"common_ok_button": "ยืนยัน",
"common_cancel_button": "ยกเลิก",
...
"launching_service_closed_title": "ปิดให้บริการ"
},
"de": {},
"es": {},
...
"ms": {}
}
다른 언어셋을 추가해야 할 경우에는 localizedstring.json 파일의 해당 언어코드에 "key":"value"
형태로 값을 추가하면 됩니다.
{
"en": {
"common_ok_button": "OK",
"common_cancel_button": "Cancel",
...
"launching_service_closed_title": "Service Closed"
},
...
"vi": {
"common_ok_button": "value",
"common_cancel_button": "value",
...
"launching_service_closed_title": "value"
},
"ms": {}
}
초기화 및 setDisplayLanguageCode: API를 통해 Display Language를 설정할 경우, 최종 적용되는 Display Language는 입력한 값과 다르게 적용될 수 있습니다.
en
이 기본값으로 설정됩니다.API
+ (NSString *)deviceCountryCode;
API
+ (void)addEventHandler:(GamebaseEventHandler)handler;
+ (void)removeEventHandler:(GamebaseEventHandler)handler;
+ (void)removeAllEventHandler;
VO
@interface TCGBGamebaseEventMessage : NSObject <TCGBValueObject>
@property (nonatomic, strong, nonnull) NSString* category;
@property (nonatomic, strong, nullable) NSString* data;
@end
Example
- (void)eventHandler_addEventHandler {
void(^eventHandler)(TCGBGamebaseEventMessage *) = ^(TCGBGamebaseEventMessage * _Nonnull message) {
if ([message.category isEqualToString:kTCGBIdPRevoked] == YES) {
TCGBGamebaseEventIdPRevokedData* idPRevokedData = [TCGBGamebaseEventIdPRevokedData gamebaseEventIdPRevokedDataFromJsonString:message.data];
if (idPRevokedData != nil) {
//TODO: process idp revoked
}
} else if ([message.category isEqualToString:kTCGBLoggedOut] == YES) {
TCGBGamebaseEventLoggedOutData* loggedOutData = [TCGBGamebaseEventLoggedOutData gamebaseEventLoggedOutDataFromJsonString:message.data];
if (loggedOutData != nil) {
//TODO: process loggedOut
}
} else if ([message.category isEqualToString:kTCGBServerPushAppKickoutMessageReceived] == YES
|| [message.category isEqualToString:kTCGBServerPushAppKickout] == YES
|| [message.category isEqualToString:kTCGBServerPushTransferKickout] == YES) {
TCGBGamebaseEventServerPushData* serverPushData = [TCGBGamebaseEventServerPushData gamebaseEventServerPushDataFromJsonString:message.data];
if (serverPushData != nil) {
//TODO: process server push
}
} else if ([message.category isEqualToString:kTCGBObserverLaunching] == YES
|| [message.category isEqualToString:kTCGBObserverHeartbeat] == YES
|| [message.category isEqualToString:kTCGBObserverNetwork] == YES) {
TCGBGamebaseEventObserverData* observerData = [TCGBGamebaseEventObserverData gamebaseEventObserverDataFromJsonString:message.data];
if (observerData != nil) {
//TODO: process observer
}
} else if ([message.category isEqualToString:kTCGBPurchaseUpdated] == YES) {
} else if ([message.category isEqualToString:kTCGBPushReceivedMessage] == YES) {
} else if ([message.category isEqualToString:kTCGBPushClickMessage] == YES) {
} else if ([message.category isEqualToString:kTCGBPushClickAction] == YES) {
}
};
[TCGBGamebase addEventHandler:eventHandler];
}
Event 종류 | GamebaseEventCategory | VO 변환 방법 | 비고 |
---|---|---|---|
IdPRevoked | kTCGBIdPRevoked | [TCGBGamebaseEventIdPRevokedData gamebaseEventIdPRevokedDataFromJsonString:message.data] | - |
LoggedOut | kTCGBLoggedOut | [TCGBGamebaseEventLoggedOutData gamebaseEventLoggedOutDataFromJsonString:message.data] | - |
ServerPush | kTCGBServerPushAppKickoutMessageReceived kTCGBServerPushAppKickout kTCGBServerPushTransferKickout |
[TCGBGamebaseEventServerPushData gamebaseEventServerPushDataFromJsonString:message.data] | - |
Observer | kTCGBObserverLaunching kTCGBObserverHeartbeat kTCGBObserverNetwork |
[TCGBGamebaseEventObserverData gamebaseEventObserverDataFromJsonString:message.data] | - |
Purchase - 프로모션 결제 | kTCGBPurchaseUpdated | [TCGBPurchasableReceipt purchasableReceiptFromJsonString:message.data] | - |
Push - 메시지 수신 | kTCGBPushReceivedMessage | [TCGBPushMessage pushMessageFromJsonString:message.data] | - |
Push - 메시지 클릭 | kTCGBPushClickMessage | [TCGBPushMessage pushFromJsonString:message.data] | - |
Push - 액션 클릭 | kTCGBPushClickAction | [TCGBPushMessage pushFromJsonString:message.data] | RichMessage 버튼 클릭 시 동작합니다. |
[참고]
iOS Appleid 로그인을 사용하는 경우에만 발생할 수 있는 이벤트입니다.
@interface TCGBGamebaseEventIdPRevokedData : NSObject <TCGBValueObject>
@property (nonatomic, assign) int64_t code;
@property (nonatomic, strong) NSString* idPType;
@property (nonatomic, strong) NSArray<NSString *>* authMappingList;
@property (nonatomic, strong) NSString* extras;
@end
Example
- (void)eventHandler_addEventHandler {
void(^eventHandler)(TCGBGamebaseEventMessage *) = ^(TCGBGamebaseEventMessage * _Nonnull message) {
if ([message.category isEqualToString:kTCGBIdPRevoked] == YES) {
TCGBGamebaseEventIdPRevokedData *idPRevokedData = [TCGBGamebaseEventIdPRevokedData gamebaseEventIdPRevokedDataFromJsonString:message.data];
if (idPRevokedData == nil) { return; }
NSString *revokedIdP = idPRevokedData.idPType;
switch (idPRevokedData.code) {
case IDP_REVOKED_WITHDRAW:
{
// 현재 사용 중지된 IdP로 로그인되어 있고, 매핑된 IdP 목록이 없을 때를 의미합니다.
// 유저에게 현재 계정이 탈퇴 처리된 것을 알려 주세요.
[TCGBGamebase withdrawWithViewController:nil completion:^(TCGBError *error) {
...
}];
break;
}
case IDP_REVOKED_OVERWRITE_LOGIN_AND_REMOVE_MAPPING:
{
// 현재 사용 중지된 IdP로 로그인되어 있고, 사용 중지된 IdP 외에 다른 IdP가 매핑되어 있는 경우를 의미합니다.
// 유저가 authMappingList 중 다시 로그인할 IdP를 선택하도록 하고, 선택한 IdP로 로그인한 뒤에는 사용 중지된 IdP의 연동을 해제해 주세요.
NSString *selectedIdPType = "유저가 선택한 IdP";
NSMutableDictionary *additionalInfo = [NSMutableDictionary dictionary];
additionalInfo[kTCGBAuthLoginWithCredentialIgnoreAlreadyLoggedInKeyname] = @(YES);
[TCGBGamebase loginWithType:selectedIdPType additionalInfo:additionalInfo viewController:viewController completion:^(TCGBAuthToken *authToken, TCGBError *loginError) {
if ([TCGBGamebase isSuccessWithError:loginError]) {
[TCGBGamebase removeMappingWithType:revokedIdP viewController:nil completion:^(TCGBError * _Nullable removeMappingError) {
...
}];
}
}];
break;
}
case IDP_REVOKED_REMOVE_MAPPING:
{
// 현재 계정에 매핑된 IdP 중 사용 중지된 IdP가 있을 경우를 의미합니다.
// 유저에게 현재 계정에서 사용 중지된 IdP가 연동 해제됨을 알려 주세요.
[TCGBGamebase removeMappingWithType:revokedIdP viewController:nil completion:^(TCGBError *error) {
...
}];
break;
}
}
}
};
[TCGBGamebase addEventHandler:eventHandler];
}
Example
- (void)eventHandler_addEventHandler {
void(^eventHandler)(TCGBGamebaseEventMessage *) = ^(TCGBGamebaseEventMessage * _Nonnull message) {
[self printLogAndShowAlertWithData:[message prettyJsonString] error:nil alertTitle:@"addEventHandler Result"];
if ([message.category isEqualToString:kTCGBLoggedOut] == YES) {
TCGBGamebaseEventLoggedOutData* loggedOutData = [TCGBGamebaseEventLoggedOutData gamebaseEventLoggedOutDataFromJsonString:message.data];
if (loggedOutData != nil) {
//TODO: process loggedOut
}
}
};
[TCGBGamebase addEventHandler:eventHandler];
}
Example
- (void)eventHandler_addEventHandler {
void(^eventHandler)(TCGBGamebaseEventMessage *) = ^(TCGBGamebaseEventMessage * _Nonnull message) {
[self printLogAndShowAlertWithData:[message prettyJsonString] error:nil alertTitle:@"addEventHandler Result"];
if ([message.category isEqualToString:kTCGBServerPushAppKickoutMessageReceived] == YES) {
TCGBGamebaseEventServerPushData* serverPushData = [TCGBGamebaseEventServerPushData gamebaseEventServerPushDataFromJsonString:message.data];
if (serverPushData != nil) {
//TODO: process server push
}
} else if ([message.category isEqualToString:kTCGBServerPushAppKickout] == YES) {
TCGBGamebaseEventServerPushData* serverPushData = [TCGBGamebaseEventServerPushData gamebaseEventServerPushDataFromJsonString:message.data];
if (serverPushData != nil) {
//TODO: process server push
}
} else if ([message.category isEqualToString:kTCGBServerPushTransferKickout] == YES) {
TCGBGamebaseEventServerPushData* serverPushData = [TCGBGamebaseEventServerPushData gamebaseEventServerPushDataFromJsonString:message.data];
if (serverPushData != nil) {
//TODO: process server push
}
}
};
[TCGBGamebase addEventHandler:eventHandler];
}
VO
@interface TCGBGamebaseEventObserverData : NSObject <TCGBValueObject>
@property (nonatomic, assign) int64_t code;
@property (nonatomic, strong, nullable) NSString* message;
@property (nonatomic, strong, nullable) NSString* extras;
@end
Example
- (void)eventHandler_addEventHandler {
void(^eventHandler)(TCGBGamebaseEventMessage *) = ^(TCGBGamebaseEventMessage * _Nonnull message) {
if ([message.category isEqualToString:kTCGBObserverLaunching] == YES) {
TCGBGamebaseEventObserverData* observerData = [TCGBGamebaseEventObserverData gamebaseEventObserverDataFromJsonString:message.data];
if (observerData != nil) {
int launchingStatusCode = observerData.code;
NSString* launchingMessage = observerData.message;
switch (launchingStatusCode) {
case IN_SERVICE:
// Finished maintenance.
break;
case INSPECTING_SERVICE:
case INSPECTING_ALL_SERVICES:
// Under maintenance.
break;
...
}
}
}
else if ([message.category isEqualToString:kTCGBObserverHeartbeat] == YES) {
TCGBGamebaseEventObserverData* observerData = [TCGBGamebaseEventObserverData gamebaseEventObserverDataFromJsonString:message.data];
int errorCode = observerData.code;
switch (errorCode) {
case TCGB_ERROR_INVALID_MEMBER:
// You can check the invalid user session in here.
// ex) After transferred account to another device.
break;
case TCGB_ERROR_BANNED_MEMBER:
// You can check the banned user session in here.
break;
}
}
else if ([message.category isEqualToString:kTCGBObserverNetwork] == YES) {
TCGBGamebaseEventObserverData* observerData = [TCGBGamebaseEventObserverData gamebaseEventObserverDataFromJsonString:message.data];
NetworkStatus networkTypeCode = observerData.code;
// You can check the changed network status in here.
if (networkTypeCode == NotReachable || networkTypeCode == ReachabilityIsNotDefined) {
// Network disconnected.
} else {
// Network connected.
}
}
};
[TCGBGamebase addEventHandler:eventHandler];
}
Example
- (void)eventHandler_addEventHandler {
void(^eventHandler)(TCGBGamebaseEventMessage *) = ^(TCGBGamebaseEventMessage * _Nonnull message) {
TCGBPurchasableReceipt* receipt = [TCGBPurchasableReceipt purchasableReceiptFromJsonString:message.data];
if (receipt != nil) {
// If user purchase item from appstore promoting iap
// this event will be occurred.
}
};
[TCGBGamebase addEventHandler:eventHandler];
}
VO
@interface TCGBPushMessage : NSObject <TCGBValueObject>
@property (nonatomic, strong, nonnull) NSString* identifier;
@property (nonatomic, strong, nullable) NSString* title;
@property (nonatomic, strong, nullable) NSString* body;
@property (nonatomic, strong, nonnull) NSString* extras;
@end
Example
- (void)eventHandler_addEventHandler {
void(^eventHandler)(TCGBGamebaseEventMessage *) = ^(TCGBGamebaseEventMessage * _Nonnull message) {
if ([message.category isEqualToString:kTCGBPushReceivedMessage] == YES) {
TCGBPushMessage* pushMessage = [TCGBPushMessage pushMessageFromJsonString:message.data];
if (pusMessage != nil) {
//TODO: process
}
}
};
[TCGBGamebase addEventHandler:eventHandler];
}
Example
- (void)eventHandler_addEventHandler {
void(^eventHandler)(TCGBGamebaseEventMessage *) = ^(TCGBGamebaseEventMessage * _Nonnull message) {
if ([message.category isEqualToString:kTCGBPushClickMessage] == YES) {
TCGBPushMessage* pushMessage = [TCGBPushMessage pushMessageFromJsonString:message.data];
if (pusMessage != nil) {
//TODO: process
}
}
};
[TCGBGamebase addEventHandler:eventHandler];
}
VO
@interface TCGBPushAction : NSObject <TCGBValueObject>
@property (nonatomic, strong, nonnull) NSString* actionType;
@property (nonatomic, strong, nullable) TCGBPushMessage* message;
@property (nonatomic, strong, nullable) NSString* userText;
@end
Example
- (void)eventHandler_addEventHandler {
void(^eventHandler)(TCGBGamebaseEventMessage *) = ^(TCGBGamebaseEventMessage * _Nonnull message) {
if ([message.category isEqualToString:kTCGBPushClickAction] == YES) {
TCGBPushAction* pushMessage = [TCGBPushAction pushActionFromJsonString:message.data];
if (pushAction != nil) {
//TODO: process
}
}
};
[TCGBGamebase addEventHandler:eventHandler];
}
Game지표를 Gamebase Server로 전송할 수 있습니다.
[주의]
Gamebase Analytics에서 지원하는 모든 API는 로그인 후에 호출할 수 있습니다.
[TIP]
TCGBPurchase의 requestPurchaseWithItemSeq:viewController:completion API의 호출을 통한 결제 또는 setPromotionIAPHandler를 통한 프로모션 결제를 완료하면 자동으로 지표를 전송합니다.
Analytics Console 사용법은 아래 가이드를 참고하십시오.
게임 로그인 이후 게임 유저 레벨 정보를 지표로 전송할 수 있습니다.
[주의]
게임 로그인 이후 SetGameUserData API를 호출하지 않으면 다른 지표에서 Level 정보가 누락될 수 있습니다.
API 호출에 필요한 파라미터는 아래와 같습니다.
GameUserData
Name | Mandatory(M) / Optional(O) | type | Desc |
---|---|---|---|
userLevel | M | int | 게임 유저 레벨을 나타내는 필드입니다. |
channelId | O | String | 채널을 나타내는 필드입니다. |
characterId | O | String | 캐릭터 이름을 나타내는 필드입니다. |
classId | O | String | 직업을 나타내는 필드입니다. |
API
+ (void)setGameUserData:(nonnull TCGBAnalyticsGameUserData *)gameUserData;
Example
- (void)setGameUserDataWithLevel:(int)level channelId:(NSString *)channelId characterId:(NSString *)characterId {
TCGBAnalyticsGameUserData* gameUserData = [TCGBAnalyticsGameUserData gameUserDataWithUserLevel:level];
[gameUserData setChannelId:channelId];
[gameUserData setCharacterId:characterId];
[TCGBAnalytics setGameUserData:gameUserData];
}
레벨업이 되었을 경우 게임 유저 레벨 정보를 지표로 전송할 수 있습니다.
API 호출에 필요한 파라미터는 아래와 같습니다.
LevelUpData
Name | Mandatory (M) / Optional (O) | type | Desc |
---|---|---|---|
userLevel | M | int | 게임 유저 레벨을 나타내는 필드입니다. |
levelUpTime | M | long | Epoch time으로 입력합니다.밀리초(ms) 단위로 입력합니다. |
API
+ (void)traceLevelUpWithLevelUpData:(nonnull TCGBAnalyticsLevelUpData *)levelUpData;
Example
- (void)traceLevelUpWith:(int)level levelUpTime:(long long)levelUpTime channelId:(NSString *)channelId characterId:(NSString *)characterId {
TCGBAnalyticsLevelUpData* levelUpData = [TCGBAnalyticsLevelUpData levelUpDataWithUserLevel:level levelUpTime:levelUpTime];
[TCGBAnalytics traceLevelUpWithLevelUpData:levelUpData];
}
Gamebase에서는 고객 문의 대응을 위한 기능을 제공합니다.
[TIP]
NHN Cloud Contact 서비스와 연동해서 사용하면 보다 쉽고 편리하게 고객 문의에 대응할 수 있습니다. 자세한 NHN Cloud Contact 서비스 이용법은 아래 가이드를 참고하시기 바랍니다. NHN Cloud Online Contact Guide
Gamebase 콘솔 > App > InApp URL > Service center 에서는 아래와 같이 3가지 유형의 고객 센터를 선택할 수 있습니다.
Customer Service Type | Required Login |
---|---|
Developer customer center | X |
Gamebase customer center | △ |
NHN Cloud Online Contact | △ |
각 유형에 따라 Gamebase SDK의 고객 센터 API는 다음 URL을 사용합니다.
Gamebase 콘솔에 입력한 고객 센터 URL 웹뷰를 나타낼 수 있는 기능입니다. TCGBContactConfiguration으로 URL에 추가 정보를 전달할 수 있습니다.
TCGBContactConfiguration
Parameter | Mandatory(M) / Optional(O) |
Values | Description |
---|---|---|---|
userName | O | string | 사용자 이름(닉네임) default: nil |
additionalURL | O | string | 개발사 자체 고객 센터 URL 뒤에 붙는 추가적인 URL 고객 센터 타입이 CUSTOM 인 경우에만 사용default: nil |
additionalParameters | O | dictionary<string, string> | 고객 센터 URL 뒤에 붙는 추가적인 파라미터 default: nil |
extraData | O | dictionary<string, string> | 개발사가 원하는 extra data를 고객 센터 오픈 시에 전달 default: nil |
API
+ (void)openContactWithViewController:(UIViewController *)viewController
completion:(void(^)(TCGBError *error))completion;
+ (void)openContactWithViewController:(UIViewController *)viewController
configuration:(TCGBContactConfiguration *)configuration
completion:(void(^)(TCGBError *error))completion;
Error Code
Error | Error Code | Description |
---|---|---|
TCGB_ERROR_NOT_INITIALIZED | 1 | Gamebase가 초기화되어 있지 않습니다. |
TCGB_ERROR_UI_CONTACT_FAIL_INVALID_URL | 6911 | 고객 센터 URL이 존재하지 않습니다. Gamebase 콘솔의 고객 센터 URL을 확인하세요. |
TCGB_ERROR_UI_CONTACT_FAIL_ISSUE_SHORT_TERM_TICKET | 6912 | 사용자 식별을 위한 임시 티켓 발급에 실패하였습니다. |
Example
[TCGBContact openContactWithViewController:self completion:^(TCGBError *error) {
if ([TCGBGamebase isSuccessWithError:error] == YES) {
// A user close the contact web view.
} else if (error.code == TCGB_ERROR_UI_CONTACT_FAIL_INVALID_URL) {
// TODO: Gamebase Console Service Center URL is invalid.
// Please check the url field in the TOAST Gamebase Console.
} else {
// TODO: Error occur when opening the contact web view.
}
}];
[주의]
고객 센터 문의 시 파일 첨부를 위해 카메라 또는 앨범 접근이 필요할 수 있습니다. info.plist에 'Privacy - Camera Usage Description', 'Privacy — Microphone Usage Description'을 설정하십시오.
고객 센터 웹뷰를 표시하는데 사용되는 URL을 얻을 수 있습니다.
API
+ (void)requestContactURLWithCompletion:(void(^)(NSString *contactUrl, TCGBError *error))completion;
+ (void)requestContactURLWithConfiguration:(TCGBContactConfiguration *)configuration
completion:(void(^)(NSString *contactUrl, TCGBError *error))completion;
Error Code
Error | Error Code | Description |
---|---|---|
TCGB_ERROR_NOT_INITIALIZED | 1 | Gamebase가 초기화되어 있지 않습니다. |
TCGB_ERROR_UI_CONTACT_FAIL_INVALID_URL | 6911 | 고객 센터 URL이 존재하지 않습니다. Gamebase 콘솔의 고객 센터 URL을 확인하세요. |
TCGB_ERROR_UI_CONTACT_FAIL_ISSUE_SHORT_TERM_TICKET | 6912 | 사용자 식별을 위한 임시 티켓 발급에 실패하였습니다. |
Example
[TCGBContact requestContactURLWithCompletion^(NSString *contactUrl, TCGBError *error){
if ([TCGBGamebase isSuccessWithError:error] == YES) {
NSLog(@"ContactURL: %@", contactUrl);
} else if (error.code == TCGB_ERROR_UI_CONTACT_FAIL_INVALID_URL) {
// TODO: Gamebase Console Service Center URL is invalid.
// Please check the url field in the TOAST Gamebase Console.
} else {
// TODO: Error occur when request contact url.
}
}];