부가 기능
Hive가 제공하는 정형화된 배너나 페이지가 아닌, 여러분이 원하는 HTML 페이지를 띄울 수 있는 커스텀 뷰와 게시판을 띄울 수 있는 커스텀 보드, 콘솔에 등록된 특정 배너를 띄울 수 있는 스팟 배너와 다이렉트 뷰를 제공합니다.
커스텀 뷰¶
게임 내 별도 실행 버튼으로 외부 URL 혹은 입력한 내용을 웹뷰로 노출 할 수 있는 기능을 커스텀 뷰라고 합니다. 커스텀 뷰는 한 게임에서 여러 개를 적용 할 수 있어 경우에 따라 다양한 활용이 가능합니다.
커스텀 뷰 등록하기¶
콘솔을 통해 커스텀 뷰를 쉽게 생성하고 구성할 수 있는 에디터를 제공합니다. 외부 링크 페이지를 표시하는 방법도 일반 커스텀 뷰를 표시하는 작업과 동일하며 외부 링크를 설정하는 작업도 콘솔을 통해 등록할 수 있습니다.
커스텀 뷰를 생성하고 등록하는 방법에 대한 자세한 내용은 콘솔 프로모션 가이드를 참고하세요.
커스텀 뷰 구현하기¶
콘솔에서 구성하고 등록한 커스텀 뷰나, 외부 페이지를 띄우는 커스텀 뷰를 띄우려면 다음 안내에 따라 Promotion 클래스의 showCustomContents()
메서드를 호출하세요.
- customType 파라미터를
PromotionCustomType.VIEW
로 설정하세요. - contentsKey 파라미터를 Console > 프로모션 > 캠페인 설정 > 게임 선택 > 커스텀 뷰 탭 > 캠페인 관리명 > 커스텀 뷰 ID로 설정하세요.
API Reference: hive.Promotion.showCustomContents
using hive;
PromotionCustomType customType = PromotionCustomType.VIEW;
String contentsKey = "12345";
Promotion.showCustomContents(customType, contentsKey, (ResultAPI result, PromotionEventType viewEventType) => {
if (!result.isSuccess()) {
return;
}
// call successful
switch (viewEventType) {
case OPEN:
// Open promotion view
break;
case CLOSE:
// Close promotion view
break;
}
});
#include "HivePromotion.h"
EHivePromotionCustomType PromotionCustomType = EHivePromotionCustomType::VIEW;
FString ContentsKey = TEXT("12345");
FHivePromotion::ShowCustomContents(PromotionCustomType, ContentsKey, FHivePromotionViewDelegate::CreateLambda([this](const FHiveResultAPI& Result, const EHivePromotionEventType& PromotionEventType) {
if (!Result.IsSuccess()) {
return;
}
// API 호출 성공
switch (PromotionEventType) {
case EHivePromotionEventType::OPEN:
// 프로모션 뷰 열림
break;
case EHivePromotionEventType::CLOSE:
// 프로모션 뷰 닫힘
break;
default:
// 기타 이벤트 발생
break;
}
}));
API Reference: Promotion::showCustomContents
#include <HIVE_SDK_Plugin/HIVE_CPP.h>
using namespace std;
using namespace hive;
PromotionCustomType customType = PromotionCustomType::VIEW;
string contentsKey = "12345";
Promotion::showCustomContents(customType, contentsKey, [=](ResultAPI result, PromotionEventType viewEventType) {
if (!result.isSuccess()) {
return;
}
// call successful
switch (viewEventType) {
case OPEN:
// Open promotion view
break;
case CLOSE:
// Close promotion view
break;
}
});
API Reference: Promotion.showCustomContents
import com.hive.Promotion
import com.hive.ResultAPI
val promotionCustomType = Promotion.PromotionCustomType.VIEW
val contentsKey = "12345"
Promotion.showCustomContents(promotionCustomType, contentsKey, object : Promotion.PromotionViewListener {
override fun onPromotionView(result: ResultAPI, promotionEventType: Promotion.PromotionViewResultType) {
if (!result.isSuccess) {
return
}
// call successful
when (promotionEventType) {
Promotion.PromotionViewResultType.OPENED -> {
// Open promotion view
}
Promotion.PromotionViewResultType.CLOSED -> {
// Close promotion view
}
}
}
})
API Reference: Promotion.INSTANCE.showCustomContents
import com.hive.Promotion;
import com.hive.ResultAPI;
Promotion.PromotionCustomType promotionCustomType = Promotion.PromotionCustomType.VIEW;
String contentsKey = "12345";
Promotion.INSTANCE.showCustomContents(promotionCustomType, contentsKey, (result, viewResultType) -> {
if (!result.isSuccess()) {
return;
}
// call successful
switch (viewResultType) {
case OPENED:
// Open promotion view
break;
case CLOSED:
// Close promotion view
break;
}
});
API Reference: PromotionInterface.showCustomContents
import HIVEService
let type = PromotionCustomType.view
let contentsKey = "12345"
PromotionInterface.showCustomContents(type, contents: contentsKey) { result, viewResultType in
if !result.isSuccess() {
return
}
// call successful
switch viewResultType {
case .open:
// Open promotion view
case .close:
// Close promotion view
}
}
API Reference: HivePromotion:showCustomContents
#import <HIVEService/HIVEService-Swift.h>
HIVEPromotionCustomType type = HIVEPromotionCustomTypeVIEW;
NSString *contentsKey = @"12345";
[HIVEPromotion showCustomContents: type contents: contentsKey handler: ^(HIVEResultAPI *result, HIVEPromotionViewResultType viewResultType) {
if (![result isSuccess]) {
return;
}
// call successful
switch (viewResultType) {
case HIVEPromotionViewResultTypeOpen:
// Open promotion view
break;
case HIVEPromotionViewResultTypeClose:
// Close promotion view
break;
}
}];
커스텀 보드¶
커스텀 보드는 일반적인 프로모션 공지와는 다르게 해당 게임 내에서 다양한 목적으로 게시글 목록을 노출할 수 있습니다.
커스텀 보드 등록하기¶
커스텀 보드를 생성하고 등록하는 방법에 대한 자세한 내용은 콘솔 프로모션 가이드를 참고하세요.
커스텀 보드 구현하기¶
커스텀 보드를 띄우기 위해서는 다음 안내에 따라 파라미터를 설정하여 Promotion 클래스의 showCustomContents()
메서드를 호출하세요.
- customType 파라미터를
PromotionCustomType.BOARD
로 설정하세요. - contentsKey 파라미터를 Console > 프로모션 > 커스텀 보드 > 게임 선택 > Board Key로 설정하세요.
다음은 커스텀 보드를 띄우는 예제 코드입니다.
API Reference: hive.Promotion.showCustomContents
using hive;
PromotionCustomType customType = PromotionCustomType.BOARD;
String contentsKey = "12345";
Promotion.showCustomContents(customType, contentsKey, (ResultAPI result, PromotionEventType viewEventType) => {
if (!result.isSuccess()) {
return;
}
// call successful
switch (viewEventType) {
case OPEN:
// Open promotion view
break;
case CLOSE:
// Close promotion view
break;
}
});
#include "HivePromotion.h"
EHivePromotionCustomType PromotionCustomType = EHivePromotionCustomType::BOARD;
FString ContentsKey = TEXT("12345");
FHivePromotion::ShowCustomContents(PromotionCustomType, ContentsKey, FHivePromotionViewDelegate::CreateLambda([this](const FHiveResultAPI& Result, const EHivePromotionEventType& PromotionEventType) {
if (!Result.IsSuccess()) {
return;
}
// API 호출 성공
switch (PromotionEventType) {
case EHivePromotionEventType::OPEN:
// 프로모션 뷰 열림
break;
case EHivePromotionEventType::CLOSE:
// 프로모션 뷰 닫힘
break;
default:
// 기타 이벤트 발생
break;
}
}));
API Reference: Promotion::showCustomContents
#include <HIVE_SDK_Plugin/HIVE_CPP.h>
using namespace std;
using namespace hive;
PromotionCustomType customType = PromotionCustomType::BOARD;
string contentsKey = "12345";
Promotion::showCustomContents(customType, contentsKey, [=](ResultAPI result, PromotionEventType viewEventType) {
if (!result.isSuccess()) {
return;
}
// call successful
switch (viewEventType) {
case OPEN:
// Open promotion view
break;
case CLOSE:
// Close promotion view
break;
}
});
API Reference: Promotion.showCustomContents
import com.hive.Promotion
import com.hive.ResultAPI
val promotionCustomType = Promotion.PromotionCustomType.BOARD
val contentsKey = "12345"
Promotion.showCustomContents(promotionCustomType, contentsKey, object : Promotion.PromotionViewListener {
override fun onPromotionView(result: ResultAPI, promotionEventType: Promotion.PromotionViewResultType) {
if (!result.isSuccess) {
return
}
// call successful
when (promotionEventType) {
Promotion.PromotionViewResultType.OPENED -> {
// Open promotion view
}
Promotion.PromotionViewResultType.CLOSED -> {
// Close promotion view
}
}
}
})
API Reference: com.hive.Promotion.showCustomContents
import com.hive.Promotion;
import com.hive.ResultAPI;
Promotion.PromotionCustomType promotionCustomType = Promotion.PromotionCustomType.BOARD;
String content_key = "12345";
Promotion.INSTANCE.showCustomContents(promotionCustomType, content_key, (result, viewResultType) -> {
if (!result.isSuccess()) {
return;
}
// call successful
switch (viewResultType) {
case OPENED:
// Open promotion view
break;
case CLOSED:
// Close promotion view
break;
}
});
API Reference: PromotionInterface.showCustomContents
import HIVEService
let type = PromotionCustomType.board
let contentsKey = "12345"
PromotionInterface.showCustomContents(type, contents: contentsKey) { result, viewResultType in
if !result.isSuccess() {
return
}
// call successful
switch viewResultType {
case .open:
// Open promotion view
case .close:
// Close promotion view
}
}
API Reference: HivePromotion:showCustomContents
#import <HIVEService/HIVEService-Swift.h>
HIVEPromotionCustomType type = HIVEPromotionCustomTypeBOARD;
NSString *contentsKey = @"12345";
[HIVEPromotion showCustomContents: type contents: contentsKey handler: ^(HIVEResultAPI *result, HIVEPromotionViewResultType viewResultType) {
if (![result isSuccess]) {
return;
}
// call successful
switch (viewResultType) {
case HIVEPromotionViewResultTypeOpen:
// Open promotion view
break;
case HIVEPromotionViewResultTypeClose:
// Close promotion view
break;
}
}];
스팟 배너¶
게임에서 원하는 위치 또는 타이밍에 전면 배너를 노출할 수 있으며, 이를 스팟 배너라고 합니다. 스팟 배너를 사용하려면 콘솔 > 프로모션 > 캠페인 등록 > 스팟 배너에서 등록 후 설정하세요.
스팟 배너를 띄우려면 다음 안내에 따라 파라미터를 설정하여 Promotion 클래스의 showCustomContents()
메서드를 호출하세요.
customType
파라미터를PromotionCustomType.SPOT
으로 설정하세요.- 일반 전면 배너를 노출하려면
contentsKey
파라미터를 Console > 프로모션 > 캠페인 설정 > 게임 설정 > 스팟 배너 탭 > 캠페인 관리명 > 스팟 배너 ID로 설정하세요. - 크로스 프로모션 전면 광고를 노출하려면
contentsKey
파라미터를ad
로 설정하세요. 스팟 배너를 이용해 원하는 시점에 크로스 프로모션 전면 광고를 노출할 수 있습니다.
Warning
contentsKey
를 이용한 배너 및 광고 노출 기능은 Hive SDK v4를 적용한 앱에서만 이용할 수 있습니다.
다음은 스팟배너를 구현한 예제 코드입니다.
API Reference: hive.Promotion.showCustomContents
using hive;
PromotionCustomType customType = PromotionCustomType.SPOT;
String contentsKey = "12345";
Promotion.showCustomContents(customType, contentsKey, (ResultAPI result, PromotionEventType viewEventType) => {
if (!result.isSuccess()) {
return;
}
// call successful
switch (viewEventType) {
case OPEN:
// Open promotion view
break;
case CLOSE:
// Close promotion view
break;
}
});
#include "HivePromotion.h"
EHivePromotionCustomType PromotionCustomType = EHivePromotionCustomType::SPOT;
FString ContentsKey = TEXT("12345");
FHivePromotion::ShowCustomContents(PromotionCustomType, ContentsKey, FHivePromotionViewDelegate::CreateLambda([this](const FHiveResultAPI& Result, const EHivePromotionEventType& PromotionEventType) {
if (!Result.IsSuccess()) {
return;
}
// API 호출 성공
switch (PromotionEventType) {
case EHivePromotionEventType::OPEN:
// 프로모션 뷰 열림
break;
case EHivePromotionEventType::CLOSE:
// 프로모션 뷰 닫힘
break;
default:
// 기타 이벤트 발생
break;
}
}));
API Reference: Promotion::showCustomContents
#include <HIVE_SDK_Plugin/HIVE_CPP.h>
using namespace std;
using namespace hive;
PromotionCustomType customType = PromotionCustomType::SPOT;
string contentsKey = "12345";
Promotion::showCustomContents(customType, contentsKey, [=](ResultAPI result, PromotionEventType viewEventType) {
if (!result.isSuccess()) {
return;
}
// call successful
switch (viewEventType) {
case OPEN:
// Open promotion view
break;
case CLOSE:
// Close promotion view
break;
}
});
API Reference: Promotion.showCustomContents
import com.hive.Promotion
import com.hive.ResultAPI
val promotionCustomType = Promotion.PromotionCustomType.SPOT
val contentsKey = "12345"
Promotion.showCustomContents(promotionCustomType, contentsKey, object : Promotion.PromotionViewListener {
override fun onPromotionView(result: ResultAPI, promotionEventType: Promotion.PromotionViewResultType) {
if (!result.isSuccess) {
return
}
// call successful
when (promotionEventType) {
Promotion.PromotionViewResultType.OPENED -> {
// Open promotion view
}
Promotion.PromotionViewResultType.CLOSED -> {
// Close promotion view
}
}
}
})
API Reference: com.hive.Promotion.showCustomContents
import com.hive.Promotion;
import com.hive.ResultAPI;
Promotion.PromotionCustomType promotionCustomType = Promotion.PromotionCustomType.SPOT;
String content_key = "12345";
Promotion.INSTANCE.showCustomContents(promotionCustomType, content_key, (result, viewResultType) -> {
if (!result.isSuccess()) {
return;
}
// call successful
switch (viewResultType) {
case OPENED:
// Open promotion view
break;
case CLOSED:
// Close promotion view
break;
}
});
API Reference: PromotionInterface.showCustomContents
import HIVEService
let type = PromotionCustomType.spot
let contentsKey = "12345"
PromotionInterface.showCustomContents(type, contents: contentsKey) { result, viewResultType in
if !result.isSuccess() {
return
}
// call successful
switch viewResultType {
case .open:
// Open promotion view
case .close:
// Close promotion view
}
}
API Reference: HivePromotion:showCustomContents
#import <HIVEService/HIVEService-Swift.h>
HIVEPromotionCustomType type = HIVEPromotionCustomTypeSPOT;
NSString *contentsKey = @"12345";
[HIVEPromotion showCustomContents: type contents: contentsKey handler: ^(HIVEResultAPI *result, HIVEPromotionViewResultType viewResultType) {
if (![result isSuccess]) {
return;
}
// call successful
switch (viewResultType) {
case HIVEPromotionViewResultTypeOpen:
// Open promotion view
break;
case HIVEPromotionViewResultTypeClose:
// Close promotion view
break;
}
}];
다이렉트 뷰¶
다이렉트 뷰란 콘솔에 등록된 캠페인 번호를 게임에서 호출하여 직접 노출하는 기능입니다. 게임에서 콘솔에 등록된 캠페인 번호를 호출하면 해당 컨텐츠를 풀 스크린 또는 프레임 타입으로 노출합니다.
Hive SDK v4.16.0부터 콘솔의 프로모션 > 캠페인 설정에서 설정한 노출타입에 따라 풀 스크린 또는 프레임 타입으로 노출할 수 있습니다.
다음은 다이렉트 뷰를 적용한 예시 화면입니다.
다이렉트 뷰를 띄우려면 다음 안내에 따라 파라미터를 설정하여 Promotion 클래스의 showCustomContents()
메서드를 호출하세요.
- customType 파라미터를
PromotionCustomType.DIRECT
로 설정하세요. - contentsKey 파라미터를 Console > 프로모션 > 캠페인 설정 > 게임 선택 > 일반배너 탭 > 캠페인 번호로 설정하세요.
다음은 다이렉트 뷰를 구현한 예제 코드입니다.
API Reference: hive.Promotion.showCustomContents
using hive;
PromotionCustomType customType = PromotionCustomType.DIRECT;
String contentsKey = "12345";
Promotion.showCustomContents(customType, contentsKey, (ResultAPI result, PromotionEventType viewEventType) => {
if (!result.isSuccess()) {
return;
}
// call successful
switch (viewEventType) {
case OPEN:
// Open promotion view
break;
case CLOSE:
// Close promotion view
break;
}
});
#include "HivePromotion.h"
EHivePromotionCustomType PromotionCustomType = EHivePromotionCustomType::DIRECT;
FString ContentsKey = TEXT("12345");
FHivePromotion::ShowCustomContents(PromotionCustomType, ContentsKey, FHivePromotionViewDelegate::CreateLambda([this](const FHiveResultAPI& Result, const EHivePromotionEventType& PromotionEventType) {
if (!Result.IsSuccess()) {
return;
}
// API 호출 성공
switch (PromotionEventType) {
case EHivePromotionEventType::OPEN:
// 프로모션 뷰 열림
break;
case EHivePromotionEventType::CLOSE:
// 프로모션 뷰 닫힘
break;
default:
// 기타 이벤트 발생
break;
}
}));
API Reference: Promotion::showCustomContents
#include <HIVE_SDK_Plugin/HIVE_CPP.h>
using namespace std;
using namespace hive;
PromotionCustomType customType = PromotionCustomType::DIRECT;
string contentsKey = "12345";
Promotion::showCustomContents(customType, contentsKey, [=](ResultAPI result, PromotionEventType viewEventType) {
if (!result.isSuccess()) {
return;
}
// call successful
switch (viewEventType) {
case OPEN:
// Open promotion view
break;
case CLOSE:
// Close promotion view
break;
}
});
API Reference: Promotion.showCustomContents
import com.hive.Promotion
import com.hive.ResultAPI
val promotionCustomType = Promotion.PromotionCustomType.DIRECT
val contentsKey = "12345"
Promotion.showCustomContents(promotionCustomType, contentsKey, object : Promotion.PromotionViewListener {
override fun onPromotionView(result: ResultAPI, promotionEventType: Promotion.PromotionViewResultType) {
if (!result.isSuccess) {
return
}
// call successful
when (promotionEventType) {
Promotion.PromotionViewResultType.OPENED -> {
// Open promotion view
}
Promotion.PromotionViewResultType.CLOSED -> {
// Close promotion view
}
}
}
})
API Reference: com.hive.Promotion.showCustomContents
import com.hive.Promotion;
import com.hive.ResultAPI;
Promotion.PromotionCustomType promotionCustomType = Promotion.PromotionCustomType.DIRECT;
String content_key = "12345";
Promotion.INSTANCE.showCustomContents(promotionCustomType, content_key, (result, viewResultType) -> {
if (!result.isSuccess()) {
return;
}
// call successful
switch (viewResultType) {
case OPENED:
// Open promotion view
break;
case CLOSED:
// Close promotion view
break;
}
});
API Reference: PromotionInterface.showCustomContents
import HIVEService
let type = PromotionCustomType.direct
let contentsKey = "12345"
PromotionInterface.showCustomContents(type, contents : contentsKey) {
result,
viewResultType in
if !result.isSuccess() {
return
}
// call successful
switch viewResultType {
case.open:
// Open promotion view
case.close:
// Close promotion view
}
}
API Reference: HivePromotion:showCustomContents
#import <HIVEService /HIVEService-Swift.h>
HIVEPromotionCustomType type = HIVEPromotionCustomTypeDIRECT;
NSString *contentsKey = @"12345";
[HIVEPromotion showCustomContents: type contents: contentsKey handler: ^(HIVEResultAPI *result,
HIVEPromotionViewResultType viewResultType) {
if (![result isSuccess]) {
return;
}
// call successful
switch (viewResultType) {
case HIVEPromotionViewResultTypeOpen:
// Open promotion view
break;
case HIVEPromotionViewResultTypeClose:
// Close promotion view
break;
}
}];
배너를 자체적으로 구현하기¶
Hive SDK는 showPromotion
메서드로 원하는 캠페인을 배너로 노출하는 기능을 제공합니다. 하지만, Hive SDK에서 제공하지 않는 배너(롤링 배너)를 노출하고 싶거나, Hive SDK에서 제공하는 배너라도 여러분이 원하는대로 커스터마이징하여 노출하고 싶을 수 있습니다. 배너를 자체적으로 구현하려면 다음 과정을 따라야합니다.
- 콘솔에 자체 구현해서 노출할 배너 정보(배너 이미지, 링크 등)를 등록합니다.
- Hive SDK의 getBannerInfo()를 실행해 배너 구현에 필요한 정보를 Hive 서버로부터 받아옵니다.
- 받아온 정보를 바탕으로 배너를 직접 구현해서 게임에서 노출합니다.
Note
Hive SDK는 모든 배너를 커스터마이징하여 게임에서 직접 노출할 수 있도록 배너 구현에 필요한 정보를 제공합니다.
롤링 배너¶
롤링 배너는 콘텐츠가 흐르는 형태인 배너입니다. 롤링 배너는 게임 스튜디오에서 직접 구현해 노출해야 합니다.
배너 정보 조회¶
배너 정보 조회(getBannerInfo
)는 게임 스튜디오가 배너를 직접 구현 시 베너를 원하는 규격으로 노출하는 데 필요한 정보를 얻는 기능입니다. 이 API가 Hive 서버에서 배너 구성에 필요한 데이터를 가져오면, 게임에서는 이 데이터를 사용해 원하는 방식대로 배너를 표시할 수 있습니다. 이 API를 호출하려면 인증 v1 또는 인증 v4를 반드시 초기화해야 하며, 초기화하지 않을 경우 데이터를 받아오는 과정에 문제가 발생할 수 있습니다.
Note
배너 클릭 시 전달받은 pid(Integer) 값을 contentsKey(String)로 형 변환한 후 Promotion 클래스의 showCustomContents()
메서드의 매개변수로 전달하여 다이렉트 뷰 형태로 노출할 수도 있습니다.
API 요청 예시¶
API Reference: hive .Promotion.getBannerInfo
using hive;
/*
ALL,
EVENT,
NOTICE,
CROSS (Cross Banner)
*/
PromotionCampaignType campaignType = PromotionCampaignType.EVENT;
/*
SMALL (band banner),
GREAT (Great Banner),
ROLLING (rolling banner)
*/
PromotionBannerType bannerType = PromotionBannerType.ROLLING;
Promotion.getBannerInfo(campaignType, bannerType, (ResultAPI result, List bannerInfoList) => {
if (result.isSuccess()) {
// call successful
}
});
// Banner type and campaign type can also be called through strings instead of enumeration.
/*
"all" (all),
"event" (event),
"notice" (notice),
"cross" (Cross Great Banner)
*/
String campaignType = "event";
/*
"small" (band banner),
"great" (great banner),
"rolling" (rolling banner)
*/
String bannerType = "rolling";
Promotion.getBannerInfoString(campaignType, bannerType, (ResultAPI result, List bannerInfoList) => {
if (result.isSuccess()) {
// call successful
}
});
#include "HivePromotion.h"
/*
ALL(전체),
EVENT(이벤트),
NOTICE(공지),
CROSS(크로스 대배너)
*/
EHivePromotionCampaignType CampaignType = EHivePromotionCampaignType::EVENT;
/*
SMALL(띠배너),
GREAT(대배너),
ROLLING(롤링배너)
*/
EHivePromotionBannerType BannerType = EHivePromotionBannerType::ROLLING;
FHivePromotion::GetBannerInfo(CampaignType, BannerType, FHivePromotionOnBannerInfoDelegate::CreateLambda([this](const FHiveResultAPI& Result, const TArray<FHivePromotionBannerInfo>& PromotionBannerInfoList) {
if (Result.IsSuccess()) {
// API 호출 성공
}
}));
// 배너 타입 및 캠페인 타입을 열거형 대신 문자열을 통해 호출할 수도 있습니다.
/*
"all"(전체),
"event"(이벤트),
"notice"(공지),
"cross"(크로스 대배너)
*/
FString CampaignType = TEXT("event");
/*
"small"(띠배너),
"great"(대배너),
"rolling"(롤링배너)
*/
FString BannerType = TEXT("rolling");
FHivePromotion::GetBannerInfoString(CampaignType, BannerType, FHivePromotionOnBannerInfoDelegate::CreateLambda([this](const FHiveResultAPI& Result, const TArray<FHivePromotionBannerInfo>& PromotionBannerInfoList) {
if (Result.IsSuccess()) {
// API 호출 성공
}
}));
API Reference: Promotion ::getBannerInfo
#include <HIVE_SDK_Plugin/HIVE_CPP.h>
using namespace std;
using namespace hive;
/*
ALL,
EVENT,
NOTICE,
CROSS (Cross Banner)
*/
PromotionCampaignType campaignType = PromotionCampaignType::EVENT;
/*
SMALL (band banner),
GREAT (Great Banner),
ROLLING (rolling banner)
*/
PromotionBannerType bannerType = PromotionBannerType::ROLLING;
Promotion::getBannerInfo(campaignType, bannerType, [=](ResultAPI result, vector bannerInfos) {
if (result.isSuccess()) {
// call successful
}
});
// Banner type and campaign type can also be called through strings instead of enumeration.
/*
"all" (all),
"event" (event),
"notice" (notice),
"cross" (Cross Great Banner)
*/
string campaignType = "event";
/*
"small" (band banner),
"great" (great banner),
"rolling" (rolling banner)
*/
string bannerType = "rolling";
Promotion::getBannerInfoString(campaignType, bannerType, [=](ResultAPI result, vector bannerInfos) {
if (result.isSuccess()) {
// call successful
}
});
API Reference: Promotion.getBannerInfo
import com.hive.Promotion
import com.hive.ResultAPI
/*
ALL,
EVENT,
NOTICE,
CROSS (Cross Banner)
*/
val campaignType = Promotion.PromotionCampaignType.EVENT
/*
SMALL (band banner),
GREAT (Great Banner),
ROLLING (rolling banner)
*/
val bannerType = Promotion
.PromotionBannerType
.ROLLING
Promotion
.getBannerInfo(
campaignType,
bannerType,
object : Promotion.PromotionBannerInfoListener {
override fun onReceiveInfo(
result : ResultAPI,
bannerInfoList : ArrayList <Promotion.PromotionBanner>?
) {
if (result.isSuccess) {
// call successful
}
}
}
)
// Banner type and campaign type can also be called through strings instead of
// enumeration.
/*
"all" (all),
"event" (event),
"notice" (notice),
"cross" (Cross Great Banner)
*/
val campaignType = "event"
/*
"small" (band banner),
"great" (great banner),
"rolling" (rolling banner)
*/
val bannerType = "rolling"
Promotion.getBannerInfoString(
campaignType,
bannerType,
object : Promotion.PromotionBannerInfoListener {
override fun onReceiveInfo(
result : ResultAPI,
bannerInfoList : ArrayList <Promotion.PromotionBanner>?
) {
if (result.isSuccess) {
// call successful
}
}
}
)
API Reference: Promotion .INSTANCE.getBannerInfo
import com.hive.Promotion;
import com.hive.ResultAPI;
/*
ALL,
EVENT,
NOTICE,
CROSS (Cross Banner)
*/
Promotion.PromotionCampaignType campaignType = Promotion.PromotionCampaignType.EVENT;
/*
SMALL (band banner),
GREAT (Great Banner),
ROLLING (rolling banner)
*/
Promotion.PromotionBannerType bannerType = Promotion.PromotionBannerType.ROLLING;
Promotion.INSTANCE.getBannerInfo(campaignType, bannerType, (result, bannerInfoList) -> {
if(result.isSuccess()) {
// call successful
}
});
// Banner type and campaign type can also be called through strings instead of enumeration.
/*
"all" (all),
"event" (event),
"notice" (notice),
"cross" (Cross Great Banner)
*/
String campaignType = "event";
/*
"small" (band banner),
"great" (great banner),
"rolling" (rolling banner)
*/
String bannerType = "rolling";
Promotion.INSTANCE.getBannerInfo(campaignType, bannerType, (result, bannerInfoList) -> {
if(result.isSuccess()) {
// call successful
}
});
API Reference: PromotionInterface.getBannerInfo
import HIVEService
/*
all (all),
event(event),
notice,
cross (cross banner)
*/
let campaignType = PromotionCampaignType.event
/*
small (band banner),
great(great banner),
rolling(rolling banner)
*/
let bannerType = PromotionBannerType.rolling
PromotionInterface.getBannerInfo(campaignType, bannerType: bannerType) { result, bannerInfoList in {
if result.isSuccess() {
// call successful
}
}
// Banner type and campaign type can also be called through strings instead of enumeration.
/*
"all" (all),
"event" (event),
"notice" (notice),
"cross" (Cross Great Banner)
*/
let campaignType = "event"
/*
"small" (band banner),
"great" (great banner),
"rolling" (rolling banner)
*/
let bannerType = "rolling"
PromotionInterface.getBannerInfoString(campaignType, bannerString: bannerType) { result, bannerInfoList in {
if result.isSuccess() {
// API call successful
}
}
API Reference: HIVEPromotion getBannerInfo
#import <HIVEService/HIVEService-Swift.h>
/*
HIVEPromotionCampaignTypeAll (All);
HIVEPromotionCampaignTypeEvent(event);
HIVEPromotionCampaignTypeNotice(Notice);
HIVEPromotionCampaignTypeCross (Cross Banner)
*/
HIVEPromotionCampaignType campaignType = HIVEPromotionCampaignTypeEvent;
/*
HIVEPromotionBannerTypeSmall (band banner),
HIVEPromotionBannerTypeGreat(Great Banner),
HIVEPromotionBannerTypeRolling
*/
HIVEPromotionBannerType bannerType = kHIVEPromotionBannerTypeRolling;
[HIVEPromotion getBannerInfo: campaignType bannerType: bannerType handler: ^(HIVEResultAPI *result, NSArray *bannerInfos) {
if ([result isSuccess]) {
// call successful
}
}];
// Banner type and campaign type can also be called through strings instead of enumeration.
/*
"all" (all),
"event" (event),
"notice" (notice),
"cross" (Cross Great Banner)
*/
NSString *campaignType = @"event";
/*
"small" (band banner),
"great" (great banner),
"rolling" (rolling banner)
*/
NSString *bannerType = @"rolling";
[HIVEPromotion getBannerInfoString: campaignType, bannerString: bannerType, handler: ^(HIVEResultAPI *result, NSArray<HIVEPromotionBanner *> *bannerInfos) {
if ([result isSuccess]) {
// call successful
}
}];
API 응답: PromotionBannerInfo¶
API 응답에서 배너 자체 구현에 필요한 배너 정보는 PromotionBannerInfo 객체에 담아 배열로 받습니다. 자세한 내용은 아래 표를 확인하세요.
필드명 | 타입 | 설명 |
pid | Integer | 프로모션 캠페인 ID |
imageUrl | String | 캠페인 배너 이미지 URL |
linkUrl | String | 캠페인 배너를 클릭했을 때 이동하는 URL |
displayStartDate | String | 캠페인 시작 시각 |
displayEndDate | String | 캠페인 종료 시각 |
utcStartDate | Integer | 캠페인 시작 시각 (Unix timestamp) |
utcEndDate | Integer | 캠페인 종료 시각 (Unix timestamp) |
typeLink | String | 캠페인 배너를 클릭했을 때 이동하는 타입 캠페인 등록 시 선택 가능
|
typeBanner | String | 캠페인 배너 타입
|
typeCampaign | String | 프로모션 캠페인 타입
|
interworkData | String | 게임 내 특정 위치로 이동할 수 있도록 API와 파라미터가 포함된 JSON 데이터입니다. String 포맷으로 전달됩니다. 예를 들어, 직접 구현한 이벤트 롤링 배너를 노출했을 때 어떤 유저가 이 배너를 클릭하면, 이 유저를 특정 이벤트 아이템 구매 화면으로 이동시킬 수 있습니다. |
캠페인 정보 조회¶
Hive는 Hive 콘솔에 설정해 둔 캠페인 정보를 조회하는 기능을 제공합니다. 이 기능은 프로모션 뷰를 이용하는 대신 여러분이 콘솔에 등록해 둔 캠페인 컨텐츠를 게임에서 직접 표시하고자 할 때 유용한 기능입니다.
조회가 가능한 캠페인 정보 종류는 커스텀 뷰, 커스텀 보드, 스팟 배너, 다이렉트 뷰 4가지 종류로 모두 Promotion 클래스의 showCustomContents()
로 표시할 수 있는 프로모션입니다.
캠페인 정보 포맷¶
Hive는 프로모션 정보를 PromotionViewInfo
오브젝트 배열로 반환합니다. 스팟 배너를 전면 배너처럼 여러 항목으로 구성할 수 있기 때문입니다. 스팟 배너를 제외한 커스텀 뷰, 커스텀 보드, 다이렉트 뷰 형태의 캠페인은 단일 형태로 구성되지만 Hive는 캠페인 종류를 구분하지 않고 모두 배열 형태로 반환합니다.
다음은 PromotionViewInfo
오브젝트 구성 정보입니다.
Name | Type | Description |
---|---|---|
url | String | 웹뷰로 로드할 페이지 URL |
postString | String | 웹뷰 로드 시 필요한 POST 스트링 |
캠페인 정보 조회하기¶
콘솔에 등록한 캠페인 정보를 조회하려면 콘솔에 등록한 프로모션 고유 ID를 첫 번째 파라미터로 설정하여 Promotion 클래스의 getViewInfo()
메서드를 호출하세요. 그리고 조회하는 캠페인에 대한 정보를 받으려는 콜백 함수를 함께 전달하세요.
다음은 310000이라는 고유 ID를 가진 캠페인에 대한 정보를 요청하는 예제 코드입니다. Android와 iOS 예제 코드에는 Hive로부터 전달 받은 정보를 직접 웹뷰를 표시하는 코드가 함께 제공되어 있습니다.
API Reference: hive.Promotion.getViewInfo
#include "HivePromotion.h"
EHivePromotionCustomType PromotionCustomType = EHivePromotionCustomType::VIEW;
FString ContentsKey = TEXT("123456");
FHivePromotion::GetViewInfo(PromotionCustomType,
ContentsKey,
FHivePromotionOnViewInfoDelegate::CreateLambda([this](const FHiveResultAPI& Result, const TArray<FHivePromotionViewInfo>& PromotionViewInfoList) {
if (Result.IsSuccess()) {
// API 호출 성공
}
}));
API Reference: Promotion::getViewInfo
#include <HIVE_SDK_Plugin/HIVE_CPP.h> using namespace std;
using namespace hive;
PromotionCustomType customType = PromotionCustomType::VIEW;
string contentsKey = "123456";
Promotion::getViewInfo(
customType,
contentsKey,
[=](ResultAPI result, vector promotionViewInfo) {
if (result.isSuccess()) {
// call successful
}
}
);
API Reference: Promotion.getViewInfo
import com.hive.Promotion
import com.hive.ResultAPI
val customType = Promotion.PromotionCustomType.VIEW
val contentsKey = "123456"
Promotion.getViewInfo(customType, contentsKey, object : Promotion.PromotionViewInfoListener {
override fun onReceiveInfo(result: ResultAPI, viewInfo: ArrayList<Promotion.PromotionViewInfo>?) {
if (result.isSuccess) {
// call successful
}
}
})
API Reference: com.hive.Promotion.getViewInfo
import com.hive.Promotion;
import com.hive.ResultAPI;
Promotion.PromotionCustomType promotionCustomType = Promotion.PromotionCustomType.VIEW;
String contentsKey = "123456";
Promotion.INSTANCE.getViewInfo(promotionCustomType, contentsKey, (result, viewInfo) -> {
if (result.isSuccess()) {
// call successful
}
});
API Reference: PromotionInterface.getViewInfo
API Reference: HIVEPromotion:getViewInfo
#import <HIVEService/HIVEService-Swift.h>
HIVEPromotionCustomType promotionType = HIVEPromotionCustomTypeVIEW;
NSString *contentsKey = @"123456";
[HIVEPromotion getViewInfo: promotionType contents: contentsKey handler: ^(HIVEResultAPI *result, NSArray<HIVEPromotionViewInfo *> *infos) {
if ([result isSuccess]) {
// call successful
}
}];
프로모션 서버에 부가 정보 전달하기¶
부가 정보란 게임사 내부적으로 정의한 데이터입니다. 게임사는 부가 정보를 프로모션 서버에 전달한 후, 게임사와 컴투스플랫폼간 논의를 거쳐 이를 다양한 서비스에 활용할 수 있습니다.
예를 들어, additionalInfo
에 플레이어 캐릭터 레벨 정보를 아래와 같이 정의할 수 있습니다.
setAdditionalInfo
메서드로 위 additionalInfo
를 프로모션 서버에 전달하도록 한 후 컴투스플랫폼과 구현 내용을 협의합니다. 예를 들어, 특정 이벤트 페이지(다이렉트 뷰, 커스텀 뷰 등)를 노출 시, 캐릭터 레벨이 50 이상인 유저는 이벤트 배너 테두리를 금색으로 노출할 수 있습니다.
또 additionalInfo
에 캠페인 번호를 넣으면 새소식 배너에 선물 상자 이미지를 추가하는 기능으로도 사용할 수 있습니다.
다음은 additionalInfo
를 전달하는 예제코드 입니다.
API Reference: hive.Promotion.setAdditionalInfo
using hive;
// Escape string processing according to the JSON Object version in the Unity package (must include backslash)
//Under Hive 4.16.2
string additionalInfo = "{\\\"myData\\\":\\\"123\\\"}";
// Hive 4.16.2 or later
string additionalInfo = "{\"myData\":\"123\"};
Promotion.setAdditionalInfo(additionalInfo)
API Reference: Promotion::setAdditionalInfo
API Reference: Promotion.setAdditionalInfo
API Reference: Promotion .INSTANCE.setAdditionalInfo
API Reference: PromotionInterface .setAdditionalInfo
API Reference: HIVEPromotion::setAdditionalInfo
부가 정보는 Hive SDK 프로모션 모든 기능에 활용할 수 있습니다. 따라서 모든 프로모션 기능을 구현하기 전에 부가 정보와 이를 활용하는 방법을 정의한 후 setAdditionalInfo
를 가장 먼저 호출하는 것을 권장합니다.
타이틀 바 없이 이벤트 페이지 표시하기¶
전면 배너, 스팟 배너, 새소식 페이지, 다이렉트 뷰 등을 통해 이벤트 페이지에 접속 시 Hive 타이틀 바를 없앨 수 있습니다. Hive 타이틀 바 없이 이벤트 페이지를 표시하려면 showCustomContents()
메서드를 호출하기 전에 Promotion 클래스의 setAdditionalInfo()
메서드를 호출하여 헤더 필드를 "off"
로 설정하세요. 아래와 같이 부가 정보(additionalInfo)를 구성해 Hive 서버에 전송하면 페이지 노출 시 타이틀 바를 제거할 수 있습니다.
다음은 타이틀 바를 해제하는 예제 코드입니다.
API Reference: hive.Promotion.setAdditionalInfo
API Reference: Promotion::setAdditionalInfo
API Reference: Promotion.setAdditionalInfo
API Reference: Promotion.INSTANCE.setAdditionalInfo
API Reference: PromotionInterface .setAdditionalInfo
API Reference: HIVEPromotion setAdditionalInfo
프로모션에 동영상 광고 도입하기¶
Hive SDK v4.7.0부터 동영상 광고를 추가할 수 있습니다. 프로모션 도중 유저가 동영상 재생 링크를 선택하면 영상이 전체 화면으로 노출됩니다. 이 기능을 도입하기 위해 게임에서 별도 함수를 호출할 필요는 없습니다. 다만 영상 시작 전 게임 음량을 최소화하거나 음소거하는 코드를 추가하고, 영상이 종료된 이후에는 원래 음량으로 되돌리는 작업을 진행해야 합니다.
- 영상 시작 전후 상태는 프로모션을 호출한 API의 핸들러로 전달됩니다. 이 때
PromotionViewResultType
으로 StartPlayback, FinishPlayback이 전달되며, Result API의 code 값으로 kPromotionStartPlayback, kPromotionFinishPlayback이 각각 전달됩니다.- iOS Xcode에 추가해야 하는 WebKit.framework, libz.tbd 두 가지 프레임워크가 추가되었습니다.
다음은 프로모션에 동영상 광고를 도입하기 위해 게임 음량을 조절하는 예제 코드입니다.
API Reference: onPromotionView
using hive;
public void onPromotionViewCB(
ResultAPI result,
PromotionEventType viewEventType
) {
if (!result.isSuccess()) {
return;
}
// call successful
switch (viewEventType) {
case OPEN:
// Open promotion view
break;
case CLOSE:
// Close promotion view
break;
case START_PLAYBACK:
// TODO: Mute game sound
break;
case FINISH_PLAYBACK:
// TODO: Resume game sound
break;
}
}
auto PromotionViewDelegate = FHivePromotionViewDelegate::CreateLambda([this](const FHiveResultAPI& Result, const EHivePromotionEventType& PromotionEventType) {
if (!Result.IsSuccess()) {
return;
}
// API 호출 성공
switch (PromotionEventType) {
case EHivePromotionEventType::OPEN:
// 프로모션 뷰 열림
break;
case EHivePromotionEventType::CLOSE:
// 프로모션 뷰 닫힘
break;
case EHivePromotionEventType::START_PLAYBACK:
// TODO: 게임 사운드 음소거
break;
case EHivePromotionEventType::FINISH_PLAYBACK:
// TODO: 게임 사운드 재개
break;
default:
// 기타 이벤트 발생
break;
}
});
API Reference: onPromotionView
#include <HIVE_SDK_Plugin/HIVE_CPP.h> using namespace std;
using namespace hive;
void PromotionTest::onPromotionView(
ResultAPI result,
PromotionEventType viewEventType
) {
if (!result.isSuccess()) {
return;
}
// call successful
switch (viewEventType) {
case OPEN:
// Open promotion view
break;
case CLOSE:
// Close promotion view
break;
case START_PLAYBACK:
// TODO: Mute game sound
break;
case FINISH_PLAYBACK:
// TODO: Resume game sound
break;
}
}
API Reference: onPromotionView
import com.hive.Promotion
import com.hive.ResultAPI
val listener = object: Promotion.PromotionViewListener {
override fun onPromotionView(result: ResultAPI, promotionEventType: Promotion.PromotionViewResultType) {
if (!result.isSuccess) {
return
}
// call successful
when (promotionEventType) {
Promotion.PromotionViewResultType.OPENED -> {
// Open promotion view
}
Promotion.PromotionViewResultType.CLOSED -> {
// Close promotion view
}
Promotion.PromotionViewResultType.START_PLAYBACK -> {
// TODO: Mute game sound
}
Promotion.PromotionViewResultType.FINISH_PLAYBACK -> {
// TODO: Resume game sound
}
else -> {}
}
}
}
API Reference: Promotion .PromotionViewListener
import com.hive.Promotion;
import com.hive.ResultAPI;
Promotion.PromotionViewListener listener = (result, promotionEventType) -> {
if (!result.isSuccess()) {
return;
}
// call successful
switch (promotionEventType) {
case OPENED:
// Open promotion view
break;
case CLOSED:
// Close promotion view
break;
case START_PLAYBACK:
// TODO: Mute game sound
break;
case FINISH_PLAYBACK:
// TODO: Resume game sound
break;
default:
break;
}
};
API Reference: PromotionViewHandler
import HIVEService
let handler = {
(result : ResultAPI, viewResultType : PromotionViewResultType) in if !result.isSuccess() {
return
}
// call successful
switch viewResultType {
case.open:
// Open promotion view
case.close:
// Close promotion view
case.startPlayBack:
// TODO: Mute game sound
case.finishPlayBack:
// TODO: Resume game sound
}
}
API Reference: HIVEPromotionViewHandler
#import <HIVEService/HIVEService-Swift.h>
HIVEPromotionViewHandler handler = ^(HIVEResultAPI* result, HIVEPromotionViewResultType viewResultType) {
if (![result isSuccess]) {
return;
}
// call successful
switch (viewResultType) {
case HIVEPromotionViewResultTypeOpen:
// Open promotion view
break;
case HIVEPromotionViewResultTypeClose:
// Close promotion view
break;
case HIVEPromotionViewResultTypeStartPlayback:
// TODO: Mute game sound
break;
case HIVEPromotionViewResultTypeFinishPlayback:
// TODO: Resume game sound
break;
}
}
};