콘텐츠로 이동

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()를 호출하여 정부 심사 진행 여부를 확인합니다. 메서드 반환값에 따라 다음 단계 진행 여부를 결정합니다.

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. 사용자 정보 입력 완료 여부 확인

사용자 정보 입력이 필요하다면 ProviderFuntap.checkUserInfoComplete(userId)를 호출하여 필수 정보 업데이트 완료 여부를 확인합니다.

  • userId 파라미터는 로그인 성공 시 PlayerInfo 응답으로 받은 Player ID를 문자열로 전달합니다. PlayerInfo 응답 값의 세부 규격은 시작하기 전에를 참조하세요.
  • 콜백 결과 처리
    • 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)를 호출해 정보 업데이트 웹뷰를 노출합니다.

Note

hive_config.xml 파일의 skipUpdateUserInfotrue이면 화면을 노출하지 않고 성공을 반환합니다.

Note

캐릭터 정보 화면 또는 설정 화면에 사용자가 직접 선택할 수 있는 메뉴를 제공하여, 사용자가 해당 메뉴를 선택하면 API가 호출되도록 구현합니다.

본인 인증 팝업 화면 예시
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 호출 성공
    }
};

-