跳轉至

Funtap 發行商對接指南

本指南適用於已完成越南 Funtap 商店發行合約的應用程式,說明如何使用 Hive SDK 設定 Service Build 並準備實際服務營運。

Hive SDK 會依建置類型套用 Funtap 模組與設定值,並整合登入畫面及使用者資訊更新所需的 UI 與 API。套用此設定後,即可產生符合越南服務政策與政府監管指南的建置版本。

Note

由於越南商店建置設定不區分審核建置與 Service Build,因此 Hive SDK v4 26.2.0 Android 中為越南發行審核新增的 Appraisal Build 設定功能已在 26.5.0 中移除。

Service Build 套用方式

Service Build 是 Android 或 iOS 應用程式取得越南發行授權後,用於營運實際服務的建置版本。此建置使用服務用 Funtap 模組與 token 設定。

事前準備

開始 Service Build 作業前,必須先向 Funtap 取得服務用 token。Native 請將此值輸入至 hive_config.xml;Unity 請在 [上方工具列 > Hive > HiveConfig > Optional] 下的 Funtap token 欄位中輸入此值。若未準備好該值,則無法完成 Step 2。

Note

可在 Hive 控制台 > 佈建 > SDK 設定 中控制登入後是否顯示 Funtap 身分驗證。

Service Build 功能會在遊戲中已套用的登入流程先完成後使用。登入成功後,請將 PlayerInfo 回應中收到的 PlayerID 作為後續 Funtap API 的 userId 使用。

步驟 1. 設定 Funtap 程式庫

Native 請在模組層級的 build.gradle 檔案中新增服務用相依性。

// Funtap Service 模組
implementation "com.com2us.android.hive:hive-authv4-provider-funtap"

在 Unity 中,於 [上方工具列 > Hive] 下點擊 ExternalDependency 後,勾選 Funtap 項目。

在 Unreal Engine 中,於 [Edit > Project Settings > Hive SDK > Dependency - Android 或 Dependency - iOS] 下勾選 Funtap 項目。

步驟 2. 套用 Funtap 發行商設定值(token)

Native 請在 hive_config.xml 檔案中新增從 Funtap 發行商取得的 token

<funtap token="YOUR_TOKEN" />

在 Unity 中,於 [上方工具列 > Hive > HiveConfig] 下點擊 Optional 後,在 Funtap 的 token 欄位中輸入已核發的金鑰。

在 Unreal Engine 中,於 [Edit > Project Settings > Hive Config > Android] 下展開 Funtap 項目後,在 token 欄位中輸入已核發的金鑰。

步驟 3. 確認是否處於政府審核期間

若要在 Service Build 中判斷是否顯示手動資訊更新選單,必須先確認使用者已成功登入。

登入完成後,進入角色資訊畫面或設定畫面時呼叫 ProviderFuntap.isFuntapUnderGovernmentReview(),確認是否正在進行審核。

  • 若方法回傳 true(政府監管審核期間)
  • Hive SDK 會在登入後立即自動顯示以 WebView 為基礎的身分驗證畫面。
  • 在此情況下,由於身分驗證流程會自動進行,請勿在遊戲內額外顯示手動資訊更新 UI。
  • 例外處理 (skipUpdateUserInfo)
  • hive_config.xml 檔案中的 skipUpdateUserInfo 值為 true,即使登入成功,也不會強制顯示身分驗證畫面。

身分驗證彈出視窗畫面範例

結果為 false 時,請進行下一個 Step。

using hive;

bool result = ProviderFuntap.isFuntapUnderGovernmentReview();
#include "HiveProviderFuntap.h"

bool bResult = FHiveProviderFuntap::IsFunTapUnderGovernmentReview();
#include <HIVE_SDK_Plugin/HIVE_CPP.h>

bool result = ProviderFuntap::isFuntapUnderGovernmentReview();
import com.hive.ProviderFuntap

val result = ProviderFuntap.isFuntapUnderGovernmentReview()
import com.hive.ProviderFuntap;

boolean result = ProviderFuntap.isFuntapUnderGovernmentReview();
import ProviderFuntap

let result = ProviderFuntapInterface.isFuntapUnderGovernmentReview();

步驟 4. 確認使用者資訊輸入是否完成

若 Step 3 的結果為 false,則需要判斷使用者是否可以進行手動資訊更新。userId 請傳入登入成功後從 PlayerInfo 回應中收到的字串形式 PlayerID。有關 PlayerInfo 回應值的詳細資訊,請參閱開始之前

若呼叫 ProviderFuntap.checkUserInfoComplete(userId) 的結果所傳遞的 isCompleted 值為 true,表示資訊輸入已完成,因此不顯示 UI。若 isCompletedfalse,則在下一個 Step 提供資訊更新 UI。

using hive;

string userId = "USER_ID";

ProviderFuntap.checkUserInfoComplete(userId, (ResultAPI result, bool isCompleted) => {
    if (result.isSuccess()) {
        // 若 isCompleted 為 false,顯示資訊更新 UI
    }
});
#include "HiveProviderFuntap.h"

FString UserId = "USER_ID";

FHiveProviderFuntap::CheckUserInfoComplete(UserId, FHiveProviderFuntapOnCheckUserInfoCompleteDelegate::CreateLambda([this](const FHiveResultAPI& Result, bool bIsCompleted) {
    if (Result.IsSuccess()) {
        // 若 bIsCompleted 為 false,顯示資訊更新 UI
    }
}));
#include <HIVE_SDK_Plugin/HIVE_CPP.h>

std::string userId = "USER_ID";

ProviderFuntap::checkUserInfoComplete(userId, [=](ResultAPI const & result, bool isCompleted) {
    if (result.isSuccess()) {
        // 若 isCompleted 為 false,顯示資訊更新 UI
    }
});
import com.hive.ProviderFuntap
import com.hive.ResultAPI

val userId = "USER_ID"

ProviderFuntap.checkUserInfoComplete(userId) { result: ResultAPI, isCompleted: Boolean ->
    if (result.isSuccess) {
        // 若 isCompleted 為 false,顯示資訊更新 UI
    }
}
import com.hive.ProviderFuntap;
import com.hive.ResultAPI;

String userId = "USER_ID";

ProviderFuntap.checkUserInfoComplete(userId, (result, isCompleted) -> {
    if (result.isSuccess()) {
        // 若 isCompleted 為 false,顯示資訊更新 UI
    }
});
import ProviderFuntap

let userId = "USER_ID";

ProviderFuntapInterface.checkUserInfoComplete(userId) { result, isCompleted in
    if (result.isSuccess()) {
        // 若 isCompleted 為 false,顯示資訊更新 UI
    }
};

步驟 5. 顯示資訊更新 UI

若 Step 4 中 isCompletedfalse,請在角色資訊畫面或設定畫面提供使用者可選擇的選單。使用者選擇該選單時,呼叫 ProviderFuntap.showUpdateUserInfo(userId, serverId, serverName, characterId, characterName) 開啟資訊更新畫面。此時,若 hive_config.xml 檔案中的 skipUpdateUserInfotrue,則不會顯示畫面並回傳成功。

using hive;

string userId = "USER_ID";
string serverId = "SERVER_ID";
string serverName = "SERVER_NAME";
string characterId = "CHARACTER_ID";
string characterName = "CHARACTER_NAME";

ProviderFuntap.showUpdateUserInfo(userId, serverId, serverName, characterId, characterName, (ResultAPI result) => {
    if (result.isSuccess()) {
        // API 呼叫成功
    }
});
#include "HiveProviderFuntap.h"

FString UserId = "USER_ID";
FString ServerId = "SERVER_ID";
FString ServerName = "SERVER_NAME";
FString CharacterId = "CHARACTER_ID";
FString CharacterName = "CHARACTER_NAME";

FHiveProviderFuntap::ShowUpdateUserInfo(UserId, ServerId, ServerName, CharacterId, CharacterName, FHiveProviderFuntapOnShowUpdateUserInfoDelegate::CreateLambda([this](const FHiveResultAPI& Result) {
    if (Result.IsSuccess()) {
        // API 呼叫成功
    }
}));
#include <HIVE_SDK_Plugin/HIVE_CPP.h>

std::string userId = "USER_ID";
std::string serverId = "SERVER_ID";
std::string serverName = "SERVER_NAME";
std::string characterId = "CHARACTER_ID";
std::string characterName = "CHARACTER_NAME";

ProviderFuntap::showUpdateUserInfo(userId, serverId, serverName, characterId, characterName, [=](ResultAPI const & result) {
    if (result.isSuccess()) {
        // API 呼叫成功
    }
});
import com.hive.ProviderFuntap
import com.hive.ResultAPI

val userId = "USER_ID"
val serverId = "SERVER_ID"
val serverName = "SERVER_NAME"
val characterId = "CHARACTER_ID"
val characterName = "CHARACTER_NAME"

ProviderFuntap.showUpdateUserInfo(userId, serverId, serverName, characterId, characterName) { result: ResultAPI ->
    if (result.isSuccess) {
        // API 呼叫成功
    }
}
import com.hive.ProviderFuntap;
import com.hive.ResultAPI;

String userId = "USER_ID";
String serverId = "SERVER_ID";
String serverName = "SERVER_NAME";
String characterId = "CHARACTER_ID";
String characterName = "CHARACTER_NAME";

ProviderFuntap.showUpdateUserInfo(userId, serverId, serverName, characterId, characterName, (result) -> {
    if (result.isSuccess()) {
        // API 呼叫成功
    }
});
import ProviderFuntap

let userId = "USER_ID";
let serverId = "SERVER_ID";
let serverName = "SERVER_NAME";
let characterId = "CHARACTER_ID";
let characterName = "CHARACTER_NAME";

ProviderFuntapInterface.showUpdateUserInfo(userId, serverId, serverName, characterId, characterName) { result in
    if (result.isSuccess()) {
        // API 呼叫成功
    }
};