Gamebaseでサポートする付加機能を説明します。
API
Supported Platforms ■ UNREAL_ANDROID ■ UNREAL_IOS ■ UNREAL_WINDOWS
FString GetDeviceLanguageCode() const;
[参考]
Gamebaseのクライアントメッセージは英語(en)、韓国語(ko)、日本語(ja)のみ含みます。
| 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 |
言語コードはGamebaseDisplayLanguageCodeクラスに定義されています。
[注意]
Gamebaseでサポートする言語コードは、大文字/小文字を区別します。 「EN」または「zh-cn」と設定すると、問題が発生する場合があります。
namespace GamebaseDisplayLanguageCode
{
static const FString German(TEXT("de"));
static const FString English(TEXT("en"));
static const FString Spanish(TEXT("es"));
static const FString Finnish(TEXT("fi"));
static const FString French(TEXT("fr"));
static const FString Indonesian(TEXT("id"));
static const FString Italian(TEXT("it"));
static const FString Japanese(TEXT("ja"));
static const FString Korean(TEXT("ko"));
static const FString Portuguese(TEXT("pt"));
static const FString Russian(TEXT("ru"));
static const FString Thai(TEXT("th"));
static const FString Vietnamese(TEXT("vi"));
static const FString Malay(TEXT("ms"));
static const FString Chinese_Simplified(TEXT("zh-CN"));
static const FString Chinese_Traditional(TEXT("zh-TW"));
}
Gamebase初期化時のDisplay Languageを設定できます。
API
Supported Platforms ■ UNREAL_ANDROID ■ UNREAL_IOS
void Initialize(const FGamebaseConfiguration& configuration, const FGamebaseLaunchingInfoDelegate& Callback);
Example
void USample::Initialize(const FString& AppID, const FString& AppVersion)
{
FGamebaseConfiguration Configuration;
...
Configuration.DisplayLanguageCode = DisplayLanguage;
...
UGamebaseSubsystem* Subsystem = UGameInstance::GetSubsystem<UGamebaseSubsystem>(GetGameInstance());
Subsystem->Initialize(Configuration, FGamebaseLaunchingInfoDelegate::CreateLambda([Subsystem](const FGamebaseLaunchingInfo* LaunchingInfo, const FGamebaseError* Error)
{
if (Gamebase::IsSuccess(Error))
{
UE_LOG(LogTemp, Display, TEXT("Initialize succeeded."));
FString DisplayLanguage = Subsystem->GetDisplayLanguageCode();
}
else
{
UE_LOG(LogTemp, Display, TEXT("Initialize failed."));
}
}));
}
Gamebase初期化時、入力されたDisplay Languageを変更できます。
API
Supported Platforms ■ UNREAL_ANDROID ■ UNREAL_IOS ■ UNREAL_WINDOWS
void SetDisplayLanguageCode(const FString& languageCode);
Example
void USample::SetDisplayLanguageCode(const FString& DisplayLanguage)
{
UGamebaseSubsystem* Subsystem = UGameInstance::GetSubsystem<UGamebaseSubsystem>(GetGameInstance());
Subsystem->SetDisplayLanguageCode(DisplayLanguage);
}
現在適用されているDisplay Languageを照会できます。
API
Supported Platforms ■ UNREAL_ANDROID ■ UNREAL_IOS ■ UNREAL_WINDOWS
FString GetDisplayLanguageCode() const;
Example
void USample::GetDisplayLanguageCode()
{
UGamebaseSubsystem* Subsystem = UGameInstance::GetSubsystem<UGamebaseSubsystem>(GetGameInstance());
FString DisplayLanguage = Subsystem->GetDisplayLanguageCode();
}
Unreal Android、iOSプラットフォームでの新規言語セット追加方法は、下記のガイドを参照してください。
初期化およびSetDisplayLanguageCode APIでDisplay Languageを設定する場合、最終適用されるDisplay Languageは、入力した値と異なる値が適用される場合があります。
enが自動的に設定されます。API
Supported Platforms ■ UNREAL_ANDROID ■ UNREAL_IOS
FString GetCountryCodeOfUSIM() const;
API
Supported Platforms ■ UNREAL_ANDROID ■ UNREAL_IOS
FString GetCountryCodeOfDevice() const;

API
■ UNREAL_ANDROID ■ UNREAL_IOS
FString GetCountryCode() const;
GamebaseEventHandlerは以下のAPIを利用して簡単にListenerを追加/削除できます。
GamebaseEventHandlerは下記のAPIを利用して簡単にHandlerを追加/削除できます。
API
Supported Platforms ■ UNREAL_ANDROID ■ UNREAL_IOS ■ UNREAL_WINDOWS
FDelegateHandle AddHandler(const FGamebaseEventDelegate::FDelegate& Callback);
void RemoveHandler(const FDelegateHandle& handle);
void RemoveAllHandler();
VO
struct GAMEBASE_API FGamebaseEventMessage
{
// Eventの種類を表します。
// GamebaseEventCategoryクラスの値が割り当てられます。
FString Category;
// 各Categoryに合ったVOに変換できるJSON Stringデータです。
FString Data;
};
Example
void USample::AddEventHandler()
{
UGamebaseSubsystem* Subsystem = UGameInstance::GetSubsystem<UGamebaseSubsystem>(GetGameInstance());
Subsystem->AddEventHandler(FGamebaseEventDelegate::FDelegate::CreateLambda([](const FGamebaseEventMessage& Message)
{
if (Message.Category.Equals(GamebaseEventCategory::IdPRevoked))
{
auto IdpRevokedData = FGamebaseEventIdPRevokedData::From(Message.Data);
}
else if (Message.Category.Equals(GamebaseEventCategory::LoggedOut))
{
auto LoggedOutData = FGamebaseEventLoggedOutData::From(Message.Data);
}
else if (Message.Category.Equals(GamebaseEventCategory::ServerPushAppKickOut) ||
Message.Category.Equals(GamebaseEventCategory::ServerPushAppKickOutMessageReceived) ||
Message.Category.Equals(GamebaseEventCategory::ServerPushTransferKickout))
{
auto ServerPushData = FGamebaseEventServerPushData::From(Message.Data);
}
else if (Message.Category.Equals(GamebaseEventCategory::ObserverLaunching))
{
auto ObserverData = FGamebaseEventObserverData::From(Message.Data);
}
else if (Message.Category.Equals(GamebaseEventCategory::ObserverNetwork))
{
auto ObserverData = FGamebaseEventObserverData::From(Message.Data);
}
else if (Message.Category.Equals(GamebaseEventCategory::ObserverHeartbeat))
{
auto ObserverData = FGamebaseEventObserverData::From(Message.Data);
}
else if (Message.Category.Equals(GamebaseEventCategory::PurchaseUpdated))
{
auto PurchasableReceipt = FGamebaseEventPurchasableReceipt::From(Message.Data);
}
else if (Message.Category.Equals(GamebaseEventCategory::PushReceivedMessage))
{
auto PushMessage = FGamebaseEventPushMessage::From(Message.Data);
}
else if (Message.Category.Equals(GamebaseEventCategory::PushClickMessage))
{
auto PushMessage = FGamebaseEventPushMessage::From(Message.Data);
}
else if (Message.Category.Equals(GamebaseEventCategory::PushClickAction))
{
auto PushAction = FGamebaseEventPushAction::From(Message.Data);
}
}));
}
Event種類 |
GamebaseEventCategory | VO変換方法 | 備考 |
|---|---|---|---|
| IdPRevoked | GamebaseEventCategory::IdPRevoked | FGamebaseEventIdPRevokedData::From(Message.Data) | - |
| LoggedOut | GamebaseEventCategory::LoggedOut | FGamebaseEventLoggedOutData::From(Message.Data) | - |
| ServerPush | GamebaseEventCategory::ServerPushAppKickOut GamebaseEventCategory::ServerPushAppKickOutMessageReceived GamebaseEventCategory::ServerPushTransferKickout |
FGamebaseEventServerPushData::From(Message.Data) | - |
| Observer | GamebaseEventCategory::ObserverLaunching GamebaseEventCategory::ObserverNetwork GamebaseEventCategory::ObserverHeartbeat |
FGamebaseEventObserverData::From(Message.Data) | - |
| Purchase - プロモーション決済 - 遅延決済 |
GamebaseEventCategory::PurchaseUpdated | FGamebaseEventPurchasableReceipt::From(Message.Data) | - |
| Push - メッセージ受信 |
GamebaseEventCategory::PushReceivedMessage | FGamebaseEventPushMessage::From(Message.Data) | |
| Push - メッセージクリック |
GamebaseEventCategory::PushClickMessage | FGamebaseEventPushMessage::From(Message.Data) | |
| Push - アクションクリック |
GamebaseEventCategory::PushClickAction | FGamebaseEventPushAction::From(Message.Data) | RichMessageボタンを押すと動作します。 |
[参考]
iOS Appleidログインを使用する場合にのみ発生するイベントです。
Example
void USample::AddEventHandler()
{
UGamebaseSubsystem* Subsystem = UGameInstance::GetSubsystem<UGamebaseSubsystem>(GetGameInstance());
Subsystem->AddEventHandler(FGamebaseEventDelegate::FDelegate::CreateLambda([](const FGamebaseEventMessage& Message)
{
if (Message.Category.Equals(GamebaseEventCategory::IdPRevoked))
{
// TODO: process logout, then login again.
}
}));
}
Example
public void AddEventHandlerSample()
{
Gamebase.AddEventHandler(GamebaseEventHandler);
}
private void GamebaseEventHandler(GamebaseResponse.Event.GamebaseEventMessage message)
{
switch (message.category)
{
case GamebaseEventCategory.LOGGED_OUT:
{
GamebaseResponse.Event.GamebaseEventLoggedOutData loggedData = GamebaseResponse.Event.GamebaseEventLoggedOutData.From(message.data);
if (loggedData != null)
{
// There was a problem with the access token.
// Call login again.
}
break;
}
}
}
voidvoid USample::AddEventHandler()
{
UGamebaseSubsystem* Subsystem = UGameInstance::GetSubsystem<UGamebaseSubsystem>(GetGameInstance());
Subsystem->AddEventHandler(FGamebaseEventDelegate::FDelegate::CreateLambda([](const FGamebaseEventMessage& Message)
{
if (Message.Category.Equals(GamebaseEventCategory::LoggedOut))
{
auto LoggedOutData = FGamebaseEventLoggedOutData::From(Message.Data);
if (loggedData.IsValid() == true)
{
// There was a problem with the access token.
// Call login again.
}
}
}
}));
}
Example
void USample::AddEventHandler()
{
UGamebaseSubsystem* Subsystem = UGameInstance::GetSubsystem<UGamebaseSubsystem>(GetGameInstance());
Subsystem->AddEventHandler(FGamebaseEventDelegate::FDelegate::CreateLambda([](const FGamebaseEventMessage& Message)
{
if (Message.Category.Equals(GamebaseEventCategory::ServerPushAppKickOut) ||
Message.Category.Equals(GamebaseEventCategory::ServerPushAppKickOutMessageReceived) ||
Message.Category.Equals(GamebaseEventCategory::ServerPushTransferKickout))
{
auto serverPushData = FGamebaseEventServerPushData::From(Message.Data);
if (serverPushData.IsVaild())
{
CheckServerPush(Message.Category, *serverPushData);
}
}
}));
}
void Sample::CheckServerPush(const FString& category, const FGamebaseEventServerPushData& data)
{
if (message.category.Equals(GamebaseEventCategory::ServerPushAppKickOut))
{
// Kicked out from Gamebase server.(Maintenance, banned or etc.)
// And the game user closes the kickout pop-up.
// Return to title and initialize Gamebase again.
}
else if (message.category.Equals(GamebaseEventCategory::ServerPushAppKickOutMessageReceived))
{
// Currently, the kickout pop-up is displayed.
// If your game is running, stop it.
}
else if (message.category.Equals(GamebaseEventCategory::ServerPushTransferKickout))
{
// 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.
}
}
struct GAMEBASE_API FGamebaseEventObserverData
{
// 状態値を表す情報です。
int32 Code;
// 状態に関連するメッセージ情報です。
FString Message;
// 追加情報用の予備フィールドです。
FString Extras;
}
Example
void USample::AddEventHandler()
{
UGamebaseSubsystem* Subsystem = UGameInstance::GetSubsystem<UGamebaseSubsystem>(GetGameInstance());
Subsystem->AddEventHandler(FGamebaseEventDelegate::FDelegate::CreateLambda([](const FGamebaseEventMessage& Message)
{
if (Message.Category.Equals(GamebaseEventCategory::ObserverLaunching))
{
auto observerData = FGamebaseEventObserverData::From(Message.Data);
if (observerData.IsVaild())
{
CheckLaunchingStatus(*observerData);
}
}
else if (Message.Category.Equals(GamebaseEventCategory::ObserverNetwork))
{
auto observerData = FGamebaseEventObserverData::From(Message.Data);
if (observerData.IsVaild())
{
CheckNetwork(*observerData);
}
}
else if (Message.Category.Equals(GamebaseEventCategory::ObserverHeartbeat))
{
auto observerData = FGamebaseEventObserverData::From(Message.Data);
if (observerData.IsVaild())
{
CheckHeartbeat(*observerData);
}
}
}));
}
void USample::CheckLaunchingStatus(const FGamebaseEventObserverData& Data)
{
switch (Data.code)
{
case GamebaseLaunchingStatus::IN_SERVICE:
{
// Service is now normally provided.
break;
}
// ...
case GamebaseLaunchingStatus::INTERNAL_SERVER_ERROR:
{
// Error in internal server.
break;
}
}
}
void USample::CheckNetwork(const FGamebaseEventObserverData& Data)
{
switch ((GamebaseNetworkType)Data.code)
{
case EGamebaseNetworkType::Not:
{
// Network disconnected.
break;
}
case EGamebaseNetworkType::Mobile:
case EGamebaseNetworkType::Wifi:
case EGamebaseNetworkType::Any:
{
// Network connected.
break;
}
}
}
void USample::CheckHeartbeat(const FGamebaseEventObserverData& Data)
{
switch (Data.code)
{
case EGGamebaseErrorCode::INVALID_MEMBER:
{
// You can check the invalid user session in here.
// ex) After transferred account to another device.
break;
}
case EGGamebaseErrorCode::BANNED_MEMBER:
{
// You can check the banned user session in here.
break;
}
}
}
Example
void USample::AddEventHandler()
{
UGamebaseSubsystem* Subsystem = UGameInstance::GetSubsystem<UGamebaseSubsystem>(GetGameInstance());
Subsystem->AddEventHandler(FGamebaseEventDelegate::FDelegate::CreateLambda([](const FGamebaseEventMessage& Message)
{
if (Message.Category.Equals(GamebaseEventCategory::PurchaseUpdated))
{
auto purchasableReceipt = FGamebaseEventPurchasableReceipt::From(Message.Data);
if (purchasableReceipt.IsVaild())
{
// If the user got item by 'Promotion Code' or
// 'Lazy purchase', or 'Parents permission',...,
// this event will be occurred.
}
}
}
}));
}
VO
struct FGamebaseEventPushMessage
{
// メッセージ固有のidです。
FString Id
// Pushメッセージタイトルです。
FString Title;
// Pushメッセージ本文内容です。
FString Body;
// JSON形式でPush送信時、送信したカスタム情報を確認できます。
FString Extras;
};
Example
void USample::AddEventHandler()
{
UGamebaseSubsystem* Subsystem = UGameInstance::GetSubsystem<UGamebaseSubsystem>(GetGameInstance());
Subsystem->AddEventHandler(FGamebaseEventDelegate::FDelegate::CreateLambda([](const FGamebaseEventMessage& Message)
{
if (Message.Category.Equals(GamebaseEventCategory::PushReceivedMessage))
{
auto PushMessage = FGamebaseEventPushMessage::From(Message.Data);
if (PushMessage.IsVaild())
{
// When you clicked push Message.
// By converting the extras field of the push Message to JSON,
// you can get the custom information added by the user when sending the push.
// (For Android, an 'isForeground' field is included so that you can check if received in the foreground state.)
}
}
}));
}
Example
void USample::AddEventHandler()
{
UGamebaseSubsystem* Subsystem = UGameInstance::GetSubsystem<UGamebaseSubsystem>(GetGameInstance());
Subsystem->AddEventHandler(FGamebaseEventDelegate::FDelegate::CreateLambda([](const FGamebaseEventMessage& Message)
{
if (Message.Category.Equals(GamebaseEventCategory::PushClickMessage))
{
auto PushMessage = FGamebaseEventPushMessage::From(Message.Data);
if (PushMessage.IsVaild())
{
// When you clicked push Message.
}
}
}));
}
VO
struct FGamebaseEventPushAction
{
// ボタンアクション種類です。
FString ActionType ;
// PushMessageデータです。
FGamebaseEventPushMessage Message;
// Pushコンソールで入力したユーザーテキストです。
FString UserText;
};
Example
void USample::AddEventHandler()
{
UGamebaseSubsystem* Subsystem = UGameInstance::GetSubsystem<UGamebaseSubsystem>(GetGameInstance());
Subsystem->AddEventHandler(FGamebaseEventDelegate::FDelegate::CreateLambda([](const FGamebaseEventMessage& Message)
{
if (Message.Category.Equals(GamebaseEventCategory::PushClickAction))
{
auto PushAction = FGamebaseEventPushAction::From(Message.Data);
if (PushAction.IsVaild())
{
// When you clicked action button by 'Rich Message'.
}
}
}));
}
Game指標をGamebase Serverへ転送できます。
[注意]
Gamebase AnalyticsでサポートするすべてのAPIはログイン後に呼び出せます。
[TIP]
RequestPurchase APIを呼び出して決済が完了すると、自動的に指標を転送します。
Analytics Consoleの使用方法は、下記のガイドを参照してください。
ゲームログイン後、ゲームユーザーレベル情報を指標として転送できます。
[注意]
ゲームログイン後、SetGameUserData APIを呼び出さない場合、他の指標からLevel情報が漏れる場合があります。
APIの呼び出しに必要なパラメータは下記のとおりです。
FGamebaseAnalyticsUserData
| Name | Mandatory(M) / Optional(O) | type | Desc |
|---|---|---|---|
| UserLevel | M | int32 | ゲームユーザーレベルを表すフィールドです。 |
| ChannelId | O | FString | チャンネルを表すフィールドです。 |
| CharacterId | O | FString | キャラクター名を表すフィールドです。 |
| CharacterClassId | O | FString | 職業を表すフィールドです。 |
API
Supported Platforms ■ UNREAL_ANDROID ■ UNREAL_IOS ■ UNREAL_WINDOWS
void SetGameUserData(const FGamebaseAnalyticsUserData& gameUserData);
Example
void USample::SetGameUserData(int32 UserLevel, const FString& ChannelId, const FString& CharacterId, const FString& CharacterClassId)
{
FGamebaseAnalyticsUserData GameUserData;
GameUserData.UserLevel = UserLevel;
GameUserData.ChannelId = ChannelId;
GameUserData.CharacterId = CharacterId;
GameUserData.CharacterClassId = CharacterClassId;
UGamebaseSubsystem* Subsystem = UGameInstance::GetSubsystem<UGamebaseSubsystem>(GetGameInstance());
Subsystem->GetAnalytics().SetGameUserData(GameUserData);
}
レベルアップした時、ゲームユーザーレベル情報を指標として転送できます。
APIの呼び出しに必要なパラメータは下記の通りです。
LevelUpData
| Name | Mandatory(M) / Optional(O) | type | Desc |
|---|---|---|---|
| UserLevel | M | int32 | ゲームユーザーレベルを表すフィールドです。 |
| LevelUpTime | M | int64 | Epoch Timeで入力します。Millisecond単位で入力します。 |
API
Supported Platforms ■ UNREAL_ANDROID ■ UNREAL_IOS ■ UNREAL_WINDOWS
void TraceLevelUp(const FGamebaseAnalyticesLevelUpData& levelUpData);
Example
void USample::TraceLevelUpNow(int32 UserLevel)
{
FGamebaseAnalyticesLevelUpData levelUpData{ UserLevel, FDateTime::Now().ToUnixTimestamp() };
UGamebaseSubsystem* Subsystem = UGameInstance::GetSubsystem<UGamebaseSubsystem>(GetGameInstance());
Subsystem->GetAnalytics().TraceLevelUp(levelUpData);
}
Gamebaseは、顧客からの問い合わせに対応するための機能を提供します。
[TIP]
NHN Cloud Contactサービスと連携して使用すると、より簡単に顧客からの問い合わせに対応できます。 詳しいNHN Cloud Contactサービス利用方法は、下記のガイドを参照してください。 NHN Cloud Online Contact Guide
Gamebase コンソール > App > Customer serviceでは、以下の3つのタイプのサポートを選択できます。

| Customer Service Type | Required Login |
|---|---|
| Developer customer center | X |
| Gamebase customer center | △ |
| NHN Cloud Online Contact | O |
タイプに応じてGamebase SDKのサポートAPIは次のURLを使用します。
サポートWebビューを表示します。 URLはサポートタイプに基づいて決定されます。 ContactConfigurationでURLに追加情報を伝達できます。
FGamebaseContactConfiguration
| Parameter | Mandatory(M) / Optional(O) |
Values | Description |
|---|---|---|---|
| UserName | O | FString | ユーザー名前(ニックネーム) default : "" |
| AdditionalURL | O | FString | 開発会社独自のサポートURLの後ろにつく追加のURL default : "" |
| AdditionalParameters | O | TMap |
サポートURLの後ろにつく追加のパラメータ default:EmptyMap |
| ExtraData | O | TMap |
開発会社が任意のextra dataをサポートオープン時に伝達 default : EmptyMap |
API
Supported Platforms ■ UNREAL_ANDROID ■ UNREAL_IOS ■ UNREAL_WINDOWS
void OpenContact(const FGamebaseErrorDelegate& onCloseCallback);
void OpenContact(const FGamebaseContactConfiguration& Configuration, const FGamebaseErrorDelegate& onCloseCallback);
ErrorCode
| Error Code | Description |
|---|---|
| NOT_INITIALIZED(1) | Gamebase.initializeが呼び出されませんでした。 |
| NOT_LOGGED_IN(2) | サポートタイプが'NHN Cloud 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) | サポートWebビューがすでに表示中です。 |
Example
void USample::OpenContact()
{
UGamebaseSubsystem* Subsystem = UGameInstance::GetSubsystem<UGamebaseSubsystem>(GetGameInstance());
Subsystem->GetContact()->OpenContact(FGamebaseErrorDelegate::CreateLambda([Subsystem](const FGamebaseError* Error)
{
if (Gamebase::IsSuccess(Error))
{
UE_LOG(LogTemp, Display, TEXT("OpenContact succeeded."));
}
else
{
UE_LOG(LogTemp, Display, TEXT("OpenContact failed. (errorCode: %d, errorMessage: %s)"), Error->Code, *Error->Message);
if (Error->Code == GamebaseErrorCode::WEBVIEW_INVALID_URL)
{
// Gamebase Console Service Center URL is invalid.
// Please check the url field in the TOAST Gamebase Console.
auto LaunchingInfo = Subsystem->GetLaunching().GetLaunchingInformations();
UE_LOG(LogTemp, Display, TEXT("csUrl: %s"), *LaunchingInfo->Launching.App.RelatedUrls.CsUrl);
}
}
}));
}
サポートのWebビューを表示するのに使用されるURLを返します。
API
void RequestContactURL(const FGamebaseContactUrlDelegate& Callback);
void RequestContactURL(const FGamebaseContactConfiguration& configuration, const FGamebaseContactUrlDelegate& Callback);
ErrorCode
| Error Code | Description |
|---|---|
| NOT_INITIALIZED(1) | Gamebase.initializeが呼び出されませんでした。 |
| NOT_LOGGED_IN(2) | サポートタイプが'NHN Cloud OC'なのにログイン前に呼び出しました。 |
| UI_CONTACT_FAIL_INVALID_URL(6911) | サポートURLが存在しません。 GamebaseコンソールのサポートURLを確認してください。 |
| UI_CONTACT_FAIL_ISSUE_SHORT_TERM_TICKET(6912) | ユーザーを識別するための臨時チケットの発行に失敗しました。 |
Example
void USample::RequestContactURL(const FString& userName)
{
FGamebaseContactConfiguration Configuration{ userName };
UGamebaseSubsystem* Subsystem = UGameInstance::GetSubsystem<UGamebaseSubsystem>(GetGameInstance());
Subsystem->GetContact()->RequestContactURL(Configuration, FGamebaseContactUrlDelegate::CreateLambda([](FString url, const FGamebaseError* Error)
{
if (Gamebase::IsSuccess(Error))
{
// Open webview with 'contactUrl'
UE_LOG(LogTemp, Display, TEXT("RequestContactURL succeeded. (url = %s)"), *url);
}
else
{
UE_LOG(LogTemp, Display, TEXT("RequestContactURL failed. (errorCode: %d, errorMessage: %s)"), Error->Code, *Error->Message);
if (Error->Code == GamebaseErrorCode::UI_CONTACT_FAIL_INVALID_URL)
{
// 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.
}
}
}));
}
API
Supported Platforms ■ UNREAL_IOS
UENUM(BlueprintType)
enum class EGamebaseAppTrackingAuthorizationStatus : uint8
{
Authorized, // アプリのトラッキング要求を許可、iOS 14未満のデバイスでは常にAuthorizedを返却
Denied, // アプリのトラッキング要求を拒否
NotDetermined, // アプリのトラッキング要求許可が未決定
Restricted, // アプリのトラッキング要求を制限
Unknown // 他のOS、またはOSで定義されていない場合
};
EGamebaseAppTrackingAuthorizationStatus GetAppTrackingAuthorizationStatus();
Example
void USample::GetAppTrackingAuthorizationStatus()
{
UGamebaseSubsystem* Subsystem = UGameInstance::GetSubsystem<UGamebaseSubsystem>(GetGameInstance());
EGamebaseAppTrackingAuthorizationStatus Status = Subsystem->GetUtil()->GetAppTrackingAuthorizationStatus();
switch (Status)
{
case EGamebaseAppTrackingAuthorizationStatus::Authorized:
break;
case EGamebaseAppTrackingAuthorizationStatus::Denied:
break;
case EGamebaseAppTrackingAuthorizationStatus::NotDetermined:
break;
case EGamebaseAppTrackingAuthorizationStatus::Restricted:
break;
case EGamebaseAppTrackingAuthorizationStatus::Unknown:
break;
}
}
API
Supported Platforms ■ UNREAL_IOS
FString GetIdfa();
Example
void USample::GetIdfa()
{
UGamebaseSubsystem* Subsystem = UGameInstance::GetSubsystem<UGamebaseSubsystem>(GetGameInstance());
FString Idfa = Subsystem->GetUtil()->GetIdfa();
}
Texas SB 2420及び類似する州の法律は、未成年者の保護のためにアプリでユーザーの年齢確認を求めています。 Gamebaseは、Google Play Age Signals APIをラッピングし、このような要件を満たすAPIを提供します。
AndroidでAge Signals機能を設定する方法は、次のドキュメントを参照してください。
年齢情報を確認します。
API
Supported Platforms ■ UNREAL_ANDROID
void GetAgeSignal(const FGamebaseAgeSignalResultDelegate& Callback);
ErrorCode
| Error Code | Description |
|---|---|
| NOT_SUPPORTED(10) | Android API 23未満のデバイスで呼び出されました。 |
| AUTH_EXTERNAL_LIBRARY_ERROR(3009) | Google Play Age Signals APIでエラーを返しました。 |
Handle results
FGamebaseAgeSignalResultのUserStatusでユーザーの状態を確認できます。 Status値に従ってユーザー規制の有無を判断してください。
EGamebaseAgeSignalsVerificationStatus
ユーザー検証状態定数です。
| Status | Description |
|---|---|
| Verified | 18歳以上の成人 |
| Supervised | 保護者の同意がある未成年者 |
| SupervisedApprovalPending | 保護者承認待機中 |
| SupervisedApprovalDenied | 保護者承認拒否済み |
| Unknown | 検証されていないユーザー |
Example
void USample::GetAgeSignal()
{
UGamebaseSubsystem* Subsystem = UGameInstance::GetSubsystem<UGamebaseSubsystem>(GetGameInstance());
Subsystem->GetUtil()->GetAgeSignal(
FGamebaseAgeSignalResultDelegate::CreateLambda([](const FGamebaseAgeSignalResult* AgeSignalResult, const FGamebaseError* Error)
{
if (Gamebase::IsSuccess(Error))
{
if (!AgeSignalResult->UserStatus.IsSet())
{
// ユーザーが規制地域(テキサス、ユタ、ルイジアナ)にいないことを意味します。
// 規制対象ではないユーザーに対するアプリのロジックを進行できます。
UE_LOG(LogTemp, Display, TEXT("Not legally applicable"));
}
else
{
EGamebaseAgeSignalsVerificationStatus UserStatus =
static_cast<EGamebaseAgeSignalsVerificationStatus>(AgeSignalResult->UserStatus.GetValue());
switch (UserStatus)
{
case EGamebaseAgeSignalsVerificationStatus::Verified:
{
// 18歳以上の成人ユーザー
// 全ての機能に対するアクセス許可
// AgeLowerとAgeUpperは設定されていません
UE_LOG(LogTemp, Display, TEXT("Age 18 or older"));
break;
}
case EGamebaseAgeSignalsVerificationStatus::Supervised:
{
// 保護者の同意がある未成年者
// Texas SB 2420に従い未成年者のための制限された機能を提供
// 年齢帯を確認できます。
if (AgeSignalResult->AgeLower.IsSet() && AgeSignalResult->AgeUpper.IsSet())
{
int32 AgeLower = AgeSignalResult->AgeLower.GetValue(); // 例: 13
int32 AgeUpper = AgeSignalResult->AgeUpper.GetValue(); // 例: 17
UE_LOG(LogTemp, Display, TEXT("Supervised user, age range: %d - %d"), AgeLower, AgeUpper);
}
if (AgeSignalResult->InstallId.IsSet())
{
FString InstallId = AgeSignalResult->InstallId.GetValue();
UE_LOG(LogTemp, Display, TEXT("InstallId: %s"), *InstallId);
}
break;
}
case EGamebaseAgeSignalsVerificationStatus::SupervisedApprovalPending:
{
// 保護者の承認を待つ間、制限された機能のみ提供
// ユーザーに承認待機中であることを通知
if (AgeSignalResult->MostRecentApprovalDate.IsSet())
{
int64 ApprovalDate = AgeSignalResult->MostRecentApprovalDate.GetValue();
UE_LOG(LogTemp, Display, TEXT("Approval pending since: %lld"), ApprovalDate);
}
break;
}
case EGamebaseAgeSignalsVerificationStatus::SupervisedApprovalDenied:
{
// 保護者が承認を拒否した場合
// 制限された機能のみ提供するか、サービス利用不可を案内
UE_LOG(LogTemp, Display, TEXT("Parent or guardian has denied changes"));
break;
}
case EGamebaseAgeSignalsVerificationStatus::Unknown:
{
// 該当管轄地域で検証されていないユーザーまたは年齢確認情報を使用できない場合
// ユーザーにPlayストアを訪問して状態を解決するようにリクエストしてください。
UE_LOG(LogTemp, Display, TEXT("User is not verified or supervised"));
break;
}
}
}
}
else
{
UE_LOG(LogTemp, Display, TEXT("GetAgeSignal failed. (errorCode: %d, errorMessage: %s)"), Error->Code, *Error->Message);
if (Error->Code == GamebaseErrorCode::NOT_SUPPORTED)
{
// Android API 23未満のデバイスではサポートされません。
UE_LOG(LogTemp, Display, TEXT("Age Signals API is not supported on this device"));
}
else if (Error->Code == GamebaseErrorCode::AUTH_EXTERNAL_LIBRARY_ERROR)
{
// Google Playサービスでエラーが発生しました。
UE_LOG(LogTemp, Display, TEXT("Google Play Age Signals error"));
}
}
}));
}