Gamebase에서 지원하는 부가 기능을 설명합니다.
API
+ (String)Gamebase.getDeviceLanguageCode();
점검 팝업과 같이 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 는 자동으로 기본값인 영어(en)로 지정됩니다.
[참고]
- Gamebase의 클라이언트 메시지는 영어(en), 한글(ko), 일본어(ja)만 포함하고 있으므로 아래의 표에 존재하는 언어 코드라 할지라도 영어(en), 한글(ko), 일본어(ja) 이외의 언어를 지정하면 기본값인 영어(en)로 자동 설정됩니다.
- Gamebase의 클라이언트에 포함되어 있지 않은 언어셋은 직접 추가할 수 있습니다. 신규 언어셋 추가 항목을 참조하시기 바랍니다.
Code | Name |
---|---|
de | German |
en | English |
es | Spanish |
fi | Finish |
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 |
해당 언어코드는 DisplayLanguage
클래스에 정의되어 있습니다.
package com.toast.android.gamebase.base.ui;
public class DisplayLanguage {
public static class Code {
public static final String German = "de";
public static final String English = "en";
public static final String Spanish = "es";
public static final String Finish = "fi";
public static final String French = "fr";
public static final String Indonesian = "id";
public static final String Italian = "it";
public static final String Japanese = "ja";
public static final String Korean = "ko";
public static final String Portuguese = "pt";
public static final String Russian = "ru";
public static final String Thai = "th";
public static final String Vietnamese = "vi";
public static final String Malay = "ms";
public static final String Chinese_Simplified = "zh-CN";
}
...
}
Gamebase 초기화 시 Display Language를 설정할 수 있습니다.
API
+ (GamebaseConfiguration)GamebaseConfiguration.Builder.setDisplayLanguageCode(String displayLanguageCode);
Example
public class MainActivity extends AppCompatActivity {
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String appId = "T0aStC1d";
String appVersion = "1.0.0";
GamebaseConfiguration configuration = new GamebaseConfiguration.Builder(appId, appVersion)
.enableLaunchingStatusPopup(true)
.setDisplayLanguageCode("en")
.build();
Gamebase.initialize(activity, configuration, new GamebaseDataCallback<LaunchingInfo>() {
@Override
public void onCallback(final LaunchingInfo data, GamebaseException exception) {
...
}
});
...
}
...
}
Gamebase 초기화 시 입력된 Display Language를 변경할 수 있습니다.
API
+ (void)Gamebase.setDisplayLanguageCode(String displayLanguageCode);
Example
public void setDisplayLanguageCodeToEnglishInRuntime() {
Gamebase.setDisplayLanguageCode(DisplayLanguage.Code.English);
}
현재 적용된 Display Language를 조회할 수 있습니다.
API
+ (String)Gamebase.getDisplayLanguageCode();
Example
public void getDisplayLanguageCodeInRuntime() {
String currentDisplayLanguageCode = Gamebase.getDisplayLanguageCode();
}
Gamebase에서 제공하는 기본 언어(ko, en, ja) 외 다른 언어를 사용하려면 gamebase-sdk-base.aar > res > raw에 있는 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": "サービス終了"
},
}
다른 언어셋을 추가해야 할 경우에는 localizedstring.json 파일에 "${언어 코드}":{"key":"value"}
형태로 값을 추가하면 됩니다.
{
"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": "サービス終了"
},
"${언어코드}": {
"common_ok_button": "...",
...
}
}
위 JSON 형식에서 "${언어코드}":{ } 내부에 key가 누락될 경우에는 단말기에 설정된 언어
또는 en
이 자동으로 입력됩니다.
초기화 및 SetDisplayLanguageCode API를 통해 Display Language를 설정할 경우, 최종 적용되는 Display Language는 입력한 값과 다르게 적용될 수 있습니다.
en
이 자동으로 설정됩니다.API
+ (String)Gamebase.getCountryCodeOfUSIM()
API
+ (String)Gamebase.getCountryCodeOfDevice()
API
+ (String)Gamebase.getCountryCode()
API
+ (void)Gamebase.addEventHandler(GamebaseEventHandler handler);
+ (void)Gamebase.removeEventHandler(GamebaseEventHandler handler);
+ (void)Gamebase.removeAllEventHandler();
VO
class GamebaseEventMessage {
// Event 종류를 나타냅니다.
// GamebaseEventCategory 클래스의 값이 할당됩니다.
@NonNull
final public String category;
// 각 category 에 맞는 VO 로 변환할 수 있는 JSON String 데이터 입니다.
@Nullable
final public String data;
}
Example
void eventHandlerSample(Activity activity) {
Gamebase.addEventHandler(new GamebaseEventHandler() {
@Override
public void onReceive(@NonNull GamebaseEventMessage message) {
switch (message.category) {
case GamebaseEventCategory.SERVER_PUSH_APP_KICKOUT:
case GamebaseEventCategory.SERVER_PUSH_TRANSFER_KICKOUT:
GamebaseEventServerPushData serverPushData = GamebaseEventServerPushData.from(message.data);
if (serverPushData != null) {
processServerPush(activity, message.category, serverPushData);
}
break;
case GamebaseEventCategory.OBSERVER_LAUNCHING:
case GamebaseEventCategory.OBSERVER_HEARTBEAT:
case GamebaseEventCategory.OBSERVER_NETWORK:
GamebaseEventObserverData observerData = GamebaseEventObserverData.from(message.data);
if (observerData != null) {
processObserver(activity, message.category, observerData);
}
break;
case GamebaseEventCategory.PURCHASE_UPDATED:
...
case GamebaseEventCategory.PUSH_RECEIVED_MESSAGE:
...
case GamebaseEventCategory.PUSH_CLICK_MESSAGE:
...
case GamebaseEventCategory.PUSH_CLICK_ACTION:
...
default:
...
}
}
});
}
Event 종류 | GamebaseEventCategory | VO 변환 방법 | 비고 |
---|---|---|---|
ServerPush | GamebaseEventCategory.SERVER_PUSH_APP_KICKOUT GamebaseEventCategory.SERVER_PUSH_TRANSFER_KICKOUT |
GamebaseEventServerPushData.from(message.data) | - |
Observer | GamebaseEventCategory.OBSERVER_LAUNCHING GamebaseEventCategory.OBSERVER_NETWORK GamebaseEventCategory.OBSERVER_HEARTBEAT |
GamebaseEventObserverData.from(message.data) | - |
Purchase - 프로모션 결제 | GamebaseEventCategory.PURCHASE_UPDATED | PurchasableReceipt.from(message.data) | - |
Push - 메세지 수신 | GamebaseEventCategory.PUSH_RECEIVED_MESSAGE | PushMessage.from(message.data) | isForeground 값을 통해 Foreground 에서 메세지를 수신했는지 여부를 확인할 수 있습니다. |
Push - 메세지 클릭 | GamebaseEventCategory.PUSH_CLICK_MESSAGE | PushMessage.from(message.data) | isForeground 값이 없습니다. |
Push - 액션 클릭 | GamebaseEventCategory.PUSH_CLICK_ACTION | PushAction.from(message.data) | RichMessage 버튼 클릭시 동작합니다. |
Example
void eventHandlerSample(Activity activity) {
Gamebase.addEventHandler(new GamebaseEventHandler() {
@Override
public void onReceive(@NonNull GamebaseEventMessage message) {
switch (message.category) {
case GamebaseEventCategory.SERVER_PUSH_APP_KICKOUT:
case GamebaseEventCategory.SERVER_PUSH_TRANSFER_KICKOUT:
GamebaseEventServerPushData serverPushData = GamebaseEventServerPushData.from(message.data);
if (serverPushData != null) {
processServerPush(activity, message.category, serverPushData);
}
break;
default:
...
}
}
});
}
void processServerPush(String category, GamebaseEventServerPushData data) {
if (category.equals(GamebaseEventCategory.SERVER_PUSH_APP_KICKOUT)) {
// Kicked out from Gamebase server.(Maintenance, banned or etc..)
// Return to title and initialize Gamebase again.
} else if (category.equals(GamebaseEventCategory.SERVER_PUSH_TRANSFER_KICKOUT)) {
// If the user wants to move the guest account to another device,
// if the account transfer is successful,
// the login of the previous device is released,
// so go back to the title and try to log in again.
}
}
VO
class GamebaseEventObserverData {
// 상태값을 나타내는 정보입니다.
public int code;
// 상태에 관련된 메세지 정보 입니다.
@Nullable
public String message;
// 추가 정보용 예비 필드 입니다.
@Nullable
public String extras;
}
Example
void eventHandlerSample(Activity activity) {
Gamebase.addEventHandler(new GamebaseEventHandler() {
@Override
public void onReceive(@NonNull GamebaseEventMessage message) {
switch (message.category) {
case GamebaseEventCategory.OBSERVER_LAUNCHING:
case GamebaseEventCategory.OBSERVER_HEARTBEAT:
case GamebaseEventCategory.OBSERVER_NETWORK:
GamebaseEventObserverData observerData = GamebaseEventObserverData.from(message.data);
if (observerData != null) {
processObserver(activity, message.category, observerData);
}
break;
default:
...
}
}
});
}
void processObserver(String category, GamebaseEventObserverData data) {
if (category.equals(GamebaseEventCategory.OBSERVER_LAUNCHING)) {
int launchingStatusCode = data.code;
String launchingMessage = data.message;
switch (launchingStatusCode) {
case LaunchingStatus.IN_SERVICE:
// Finished maintenance.
break;
case LaunchingStatus.INSPECTING_SERVICE:
case LaunchingStatus.INSPECTING_ALL_SERVICES:
// Under maintenance.
break;
...
}
} else if (category.equals(GamebaseEventCategory.OBSERVER_HEARTBEAT)) {
int errorCode = data.code;
switch (errorCode) {
case GamebaseError.INVALID_MEMBER:
// You can check the invalid user session in here.
// ex) After transferred account to another device.
break;
case GamebaseError.BANNED_MEMBER:
// You can check the banned user session in here.
break;
}
} else if (category.equals(GamebaseEventCategory.OBSERVER_NETWORK)) {
int networkTypeCode = data.code;
// You can check the changed network status in here.
if (networkTypeCode == NetworkManager.TYPE_NOT) {
// Network disconnected.
} else {
// Network connected.
}
}
}
Example
void eventHandlerSample(Activity activity) {
Gamebase.addEventHandler(new GamebaseEventHandler() {
@Override
public void onReceive(@NonNull GamebaseEventMessage message) {
switch (message.category) {
case GamebaseEventCategory.PURCHASE_UPDATED:
PurchasableReceipt receipt = PurchasableReceipt.from(message.data);
if (receipt != null) {
// If the user got item by 'Promotion Code',
// this event will be occurred.
}
break;
default:
...
}
}
});
}
VO
class PushMessage {
// 메세지 고유의 id 입니다.
@NonNull
public String id;
// Push 메세지 제목 입니다.
@Nullable
public String title;
// Push 메세지 본문 내용 입니다.
@Nullable
public String body;
// JSONObject 로 변환하여 모든 정보를 확인할 수 있습니다.
@NonNull
public String extras;
}
Example
void eventHandlerSample(Activity activity) {
Gamebase.addEventHandler(new GamebaseEventHandler() {
@Override
public void onReceive(@NonNull GamebaseEventMessage message) {
switch (message.category) {
case GamebaseEventCategory.PUSH_RECEIVED_MESSAGE:
PushMessage pushMessage = PushMessage.from(message.data);
if (pushMessage != null) {
// When you received push message.
try {
JSONObject json = new JSONObject(pushMessage.extras);
// There is 'isForeground' information.
boolean isForeground = json.getBoolean("isForeground");
Object customValue = json.get("YourCustomKey");
} catch (Exception e) {}
}
break;
default:
...
}
}
});
}
Example
void eventHandlerSample(Activity activity) {
Gamebase.addEventHandler(new GamebaseEventHandler() {
@Override
public void onReceive(@NonNull GamebaseEventMessage message) {
switch (message.category) {
case GamebaseEventCategory.PUSH_CLICK_MESSAGE:
PushMessage clickedMessage = PushMessage.from(message.data);
if (clickedMessage != null) {
// When you clicked push message.
}
break;
default:
...
}
}
});
}
VO
class PushAction {
// 버튼 액션 종류 입니다.
@NonNull
public String actionType;
// PushMessage 데이터 입니다.
@NonNull
public PushMessage message;
// Push 콘솔에서 입력한 사용자 텍스트 입니다.
@Nullable
public String userText;
}
Example
void eventHandlerSample(Activity activity) {
Gamebase.addEventHandler(new GamebaseEventHandler() {
@Override
public void onReceive(@NonNull GamebaseEventMessage message) {
switch (message.category) {
case GamebaseEventCategory.PUSH_CLICK_ACTION:
PushAction pushAction = PushAction.from(message.data);
if (pushAction != null) {
// When you clicked action button by 'Rich Message'.
}
break;
default:
...
}
}
});
}
Game지표를 Gamebase Server로 전송할 수 있습니다.
[주의]
Gamebase Analytics에서 지원하는 모든 API는 로그인 후에 호출이 가능합니다.
[TIP]
Gamebase.Purchase.requestPurchase() API를 호출하여 결제를 진행한 경우, 결제가 완료되면 자동으로 서버로 지표가 전송됩니다.
로그인 이후 유저 레벨 정보를 설정할 수 있습니다.
[주의]
게임 로그인 이후 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
Gamebase.Analytics.setGameUserData(GameUserData gameUserData);
Example
public void onLoginSuccess() {
int userLevel = 10;
String channelId, characterId, classId;
GameUserData gameUserData = new GameUserData(userLevel);
gameUserData.channelId = channelId; // Optional
gameUserData.characterId = characterId; // Optional
gameUserData.classId = classId; // Optional
Gamebase.Analytics.setGameUserData(gameUserData);
}
레벨업이 되었을 경우 유저 레벨 정보를 변경할 수 있습니다.
API 호출에 필요한 파라미터는 아래와 같습니다.
LevelUpData
Name | Mandatory(M) / Optional(O) | type | Desc |
---|---|---|---|
userLevel | M | int | 유저 레벨을 나타내는 필드입니다. |
levelUpTime | M | long | Epoch Time으로 입력합니다.Millisecond 단위로 입력 합니다. |
API
Gamebase.Analytics.traceLevelUp(LevelUpData levelUpData);
Example
public void onLevelUp(int userLevel, long levelUpTime) {
LevelUpData levelUpData = new LevelUpData(userLevel, levelUpTime);
Gamebase.Analytics.traceLevelUp(levelUpData);
}
Gamebase에서는 고객 문의 대응을 위한 기능을 제공합니다.
[TIP]
TOAST Contact 서비스와 연동해서 사용하면 보다 쉽고 편리하게 고객 문의에 대응할 수 있습니다. 자세한 TOAST Contact 서비스 이용법은 아래 가이드를 참고하시기 바랍니다. TOAST Online Contact Guide
Gamebase 콘솔 > App > InApp URL > Service center 에서는 아래와 같이 3가지 유형의 고객센터를 선택할 수 있습니다.
Customer Service Type | Required Login |
---|---|
Developer customer center | X |
Gamebase customer center | △ |
TOAST Online Contact | O |
각 유형에 따라 Gamebase SDK 의 고객센터 API 는 다음 URL 을 사용합니다.
고객센터 웹뷰를 표시합니다. URL은 고객센터 유형에 따라 결정됩니다. ContactConfiguration으로 URL에 추가 정보를 전달할 수 있습니다.
ContactConfiguration
API | Mandatory(M) / Optional(O) | Description |
---|---|---|
newBuilder() | M | ContactConfiguration 객체는 newBuilder() 함수를 통해 생성할 수 있습니다. |
build() | M | 설정을 마친 Builder 를 Configuration 객체로 변환합니다. |
setUserName(String userName) | O | 사용자 이름(닉네임)을 전달하고자 할 때 사용합니다. TOAST 조직 상품(Online Contact) 유형에서 사용하는 필드입니다. default : null |
setAdditionalURL(String additionalURL) | O | 개발사 자체 고객센터 URL 뒤에 붙는 추가적인 URL 입니다. 고객센터 타입이 CUSTOM 인 경우에만 사용하시기 바랍니다.default : null |
setExtraData(Map |
O | 개발사가 원하는 extra data를 고객센터 오픈 시에 전달합니다. default : EmptyMap |
API
+ (void)Gamebase.Contact.openContact(@NonNull final Activity activity,
@Nullable final GamebaseCallback onCloseCallback);
+ (void)Gamebase.Contact.openContact(@NonNull final Activity activity,
@NonNull final ContactConfiguration configuration,
@Nullable final GamebaseCallback onCloseCallback);
ErrorCode
Error Code | Description |
---|---|
NOT_INITIALIZED(1) | Gamebase.initialize 가 호출되지 않았습니다. |
NOT_LOGGED_IN(2) | 고객센터 유형이 'TOAST OC' 인데 로그인 전에 호출하였습니다. |
UI_CONTACT_FAIL_INVALID_URL(6911) | 고객센터 URL 이 존재하지 않습니다. Gamebase 콘솔의 고객센터 URL 을 확인하세요. |
UI_CONTACT_FAIL_ISSUE_SHORT_TERM_TICKET(6912) | 사용자 식별을 위한 임시 티켓 발급에 실패하였습니다. |
UI_CONTACT_FAIL_ANDROID_DUPLICATED_VIEW(6913) | 고객센터 웹뷰가 이미 표시중입니다. |
Example
Gamebase.Contact.openContact(activity, new GamebaseCallback() {
@Override
public void onCallback(GamebaseException exception) {
if (Gamebase.isSuccess(exception)) {
// A user close the contact web view.
} else if (exception.code == UI_CONTACT_FAIL_INVALID_URL) { // 6911
// TODO: Gamebase Console Service Center URL is invalid.
// Please check the url field in the TOAST Gamebase Console.
} else if (exception.code == UI_CONTACT_FAIL_ANDROID_DUPLICATED_VIEW) { // 6913
// The customer center web view is already opened.
} else {
// An error occur when opening the contact web view.
}
}
});
[주의]
고객센터 문의 시 파일 첨부가 필요할 수 있습니다. 이를 위해 사용자로부터 카메라 촬영이나 Storage 저장에 대한 권한을 런타임에 획득하여야 합니다. Android Developer's Guide :Request App Permissions
Unity 사용자는 아래 가이드를 참조하여 구현할 수 있습니다. Unity Guide : Requesting Permissions
고객센터 웹뷰를 표시하는데 사용되는 URL 을 리턴합니다.
API
+ (void)Gamebase.Contact.requestContactURL(@NonNull final GamebaseDataCallback<String> callback);
+ (void)Gamebase.Contact.requestContactURL(@NonNull final ContactConfiguration configuration,
@NonNull final GamebaseDataCallback<String> callback);
ErrorCode
Error Code | Description |
---|---|
NOT_INITIALIZED(1) | Gamebase.initialize 가 호출되지 않았습니다. |
NOT_LOGGED_IN(2) | 고객센터 유형이 'TOAST OC' 인데 로그인 전에 호출하였습니다. |
UI_CONTACT_FAIL_INVALID_URL(6911) | 고객센터 URL 이 존재하지 않습니다. Gamebase 콘솔의 고객센터 URL 을 확인하세요. |
UI_CONTACT_FAIL_ISSUE_SHORT_TERM_TICKET(6912) | 사용자를 식별을 위한 임시 티켓 발급에 실패하였습니다. |
Example
ContactConfiguration configuration = ContactConfiguration.newBuilder()
.setUserName(userName)
.build();
Gamebase.Contact.requestContactURL(configuration, new GamebaseDataCallback<String>() {
@Override
public void onCallback(String contactUrl, GamebaseException exception) {
if (Gamebase.isSuccess(exception)) {
// Open webview with 'contactUrl'
} else if (exception.code == UI_CONTACT_FAIL_INVALID_URL) { // 6911
// TODO: Gamebase Console Service Center URL is invalid.
// Please check the url field in the TOAST Gamebase Console.
} else {
// An error occur when requesting the contact web view url.
}
}
});