Skip to content

Funtap Publisher Integration Guide

This guide explains how to configure a Service Build using Hive SDK and prepare for actual service operations, targeting apps that have completed a publishing contract for the Vietnam Funtap store.

Hive SDK applies the Funtap module and configuration values depending on the build type, integrating the UI and APIs required for the login screen and user information updates. Applying this configuration produces a build that complies with Vietnam's service policies and government regulatory guidelines.

Note

Because the Vietnam store build configuration does not distinguish between a review build and a Service Build, the Appraisal Build configuration feature added in Hive SDK v4 26.2.0 Android for Vietnam publishing review is removed in 26.5.0.

How to apply Service Build

Service Build is the build used to operate the actual service after an Android or iOS app obtains a Vietnam publishing license. This build uses the service Funtap module and token configuration.

Prerequisites

Before starting the Service Build work, you must obtain the service token from Funtap. For Native, enter this value in hive_config.xml; for Unity, enter it in the Funtap token field under [Top Toolbar > Hive > HiveConfig > Optional]. If the value is not ready, Step 2 cannot be completed.

Note

You can control whether the Funtap identity verification is displayed after login in Hive Console > Provisioning > SDK Settings.

The Service Build feature is used after the login flow already applied in the game is completed first. When login is successful, the PlayerID received as the PlayerInfo response is used as the userId for subsequent Funtap APIs.

Step 1. Configure the Funtap library

In Native, add the service dependency to the module-level build.gradle file.

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

In Unity, click ExternalDependency under [Top Toolbar > Hive] and check the Funtap item.

In Unreal Engine, check the Funtap item under [Edit > Project Settings > Hive SDK > Dependency - Android or Dependency - iOS].

Step 2. Apply the Funtap publisher configuration (token)

In Native, add the token received from the Funtap publisher to the hive_config.xml file.

<funtap token="YOUR_TOKEN" />

In Unity, click Optional under [Top Toolbar > Hive > HiveConfig] and enter the issued key in the Funtap token field.

In Unreal Engine, expand the Funtap item under [Edit > Project Settings > Hive Config > Android] and enter the issued key in the token field.

Step 3. Check for government review

To determine whether to display the manual information update menu in Service Build, the user must first be logged in successfully.

After login is complete, call ProviderFuntap.isFuntapUnderGovernmentReview() when entering the character information screen or settings screen to check whether a review is in progress.

  • If the method returns true (government regulatory review period)
  • Hive SDK automatically displays a WebView-based identity verification screen immediately after login.
  • In this case, since the identity verification process proceeds automatically, do not expose a separate manual information update UI in-game.
  • Exception handling (skipUpdateUserInfo)
  • If the skipUpdateUserInfo value in the hive_config.xml file is true, the identity verification screen is not forcibly displayed even if login is successful.

Example of the identity verification popup screen

If the result is false, proceed to the next 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. Check whether user information entry is complete

If the result from Step 3 is false, you need to determine whether the user can proceed with a manual information update. For userId, pass the PlayerID received as the PlayerInfo response after a successful login as a string. For details on the PlayerInfo response values, see Before you begin.

If the isCompleted value delivered as the result of calling ProviderFuntap.checkUserInfoComplete(userId) is true, information entry is already complete and the UI is not displayed. If isCompleted is false, provide the information update UI in the next step.

using hive;

string userId = "USER_ID";

ProviderFuntap.checkUserInfoComplete(userId, (ResultAPI result, bool isCompleted) => {
    if (result.isSuccess()) {
        // Display the information update UI if isCompleted is false
    }
});
#include "HiveProviderFuntap.h"

FString UserId = "USER_ID";

FHiveProviderFuntap::CheckUserInfoComplete(UserId, FHiveProviderFuntapOnCheckUserInfoCompleteDelegate::CreateLambda([this](const FHiveResultAPI& Result, bool bIsCompleted) {
    if (Result.IsSuccess()) {
        // Display the information update UI if isCompleted is false
    }
}));
#include <HIVE_SDK_Plugin/HIVE_CPP.h>

std::string userId = "USER_ID";

ProviderFuntap::checkUserInfoComplete(userId, [=](ResultAPI const & result, bool isCompleted) {
    if (result.isSuccess()) {
        // Display the information update UI if isCompleted is false
    }
});
import com.hive.ProviderFuntap
import com.hive.ResultAPI

val userId = "USER_ID"

ProviderFuntap.checkUserInfoComplete(userId) { result: ResultAPI, isCompleted: Boolean ->
    if (result.isSuccess) {
        // Display the information update UI if isCompleted is false
    }
}
import com.hive.ProviderFuntap;
import com.hive.ResultAPI;

String userId = "USER_ID";

ProviderFuntap.checkUserInfoComplete(userId, (result, isCompleted) -> {
    if (result.isSuccess()) {
        // Display the information update UI if isCompleted is false
    }
});
import ProviderFuntap

let userId = "USER_ID";

ProviderFuntapInterface.checkUserInfoComplete(userId) { result, isCompleted in
    if (result.isSuccess()) {
        // Display the information update UI if isCompleted is false
    }
};

Step 5. Display the information update UI

If isCompleted is false in Step 4, provide a menu that the user can select on the character information screen or settings screen. When the user selects the menu, call ProviderFuntap.showUpdateUserInfo(userId, serverId, serverName, characterId, characterName) to open the information update screen. At this point, if skipUpdateUserInfo in the hive_config.xml file is true, the screen is not displayed and success is returned.

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 call successful
    }
});
#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 call successful
    }
}));
#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 call successful
    }
});
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 call successful
    }
}
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 call successful
    }
});
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 call successful
    }
};

-