跳转至

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 控制台 > Provisioning > SDK 设置 中控制登录后是否显示 Funtap 身份验证。

Service Build 功能会在游戏中已应用的登录流程先完成后使用。登录成功后,将 PlayerInfo 响应中收到的 PlayerID 作为后续 Funtap API 的 userId 使用。

Step 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 项。

Step 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 字段中输入已发放的密钥。

Step 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();

Step 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
    }
};

Step 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 调用成功
    }
};