콘텐츠로 이동

Funtap 퍼블리셔 연동 가이드

본 가이드는 베트남 Funtap 스토어 출시 계약을 완료한 앱을 대상으로, Hive SDK를 적용하여 상용 빌드(Service Build)를 구성하고 실제 서비스를 준비하는 방법을 설명합니다.

Hive SDK는 빌드 유형에 따른 Funtap 모듈과 설정값을 적용하여, 로그인 화면 및 사용자 정보 갱신에 필요한 UI와 API를 연동합니다. 이러한 구성을 적용하면 베트남 서비스 정책과 정부 규제 가이드라인을 준수하는 빌드가 완성됩니다.

Note

베트남 스토어 빌드 구성 시 심사용 Build와 Service Build를 구분하지 않기 때문에 Hive SDK v4 26.2.0 Android에 추가된 베트남 퍼를리싱 심사용 Appraisal Build 설정 기능은 26.5.0에서 제거합니다.

Service Build 적용 방법

Service Build는 Android 또는 iOS 앱이 베트남 퍼블리싱 라이센스 취득 후 실제 서비스를 운영하는 빌드입니다. 이 빌드에서는 서비스용 Funtap 모듈과 token 설정을 사용합니다.

사전 준비

Service Build 작업을 시작하기 전에 서비스용 token을 Funtap에서 제공받아야 합니다. Native는 hive_config.xml에, Unity는 [상단 툴바 > Hive > HiveConfig > Optional]의 Funtap token 항목에 이 값을 입력합니다. 값이 준비되지 않으면 Step 2를 완료할 수 없습니다.

Note

Hive 콘솔 > 프로비저닝 > 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를 노출하지 않습니다. isCompleted 값이 false이면 다음 단계에서 정보 업데이트 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()) {
        // isCompleted가 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.에서 isCompleted 값이 false이면 캐릭터 정보 화면 또는 설정 화면에 사용자가 직접 선택할 수 있는 메뉴를 제공합니다. 사용자가 해당 메뉴를 선택하면 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 호출 성공
    }
};

-