Hive가 제공하는 정형화된 배너나 페이지가 아닌, 여러분이 원하는 HTML 페이지를 띄울 수 있는 커스텀 뷰와 게시판을 띄울 수 있는 커스텀 보드, Hive 콘솔에 등록된 특정 배너를 띄울 수 있는 스팟 배너와 다이렉트 뷰를 제공합니다.
커스텀 뷰
게임 내 별도 실행 버튼으로 외부 URL 혹은 입력한 내용을 웹뷰로 노출 할 수 있는 기능을 커스텀 뷰라고 합니다. 커스텀 뷰는 한 게임에서 여러 개를 적용 할 수 있어 경우에 따라 다양한 활용이 가능합니다.
커스텀 뷰 등록하기
Hive 콘솔을 통해 커스텀 뷰를 쉽게 생성하고 구성할 수 있는 에디터를 제공합니다. 외부 링크 페이지를 표시하는 방법도 일반 커스텀 뷰를 표시하는 작업과 동일하며 외부 링크를 설정하는 작업도 Hive 콘솔을 통해 등록할 수 있습니다.
커스텀 뷰를 생성하고 등록하는 방법에 대한 자세한 내용은 Hive 콘솔 프로모션 가이드를 참고하세요.
커스텀 뷰 구현하기
Hive 콘솔에서 구성하고 등록한 커스텀 뷰나, 외부 페이지를 띄우는 커스텀 뷰를 띄우려면 다음 안내에 따라 Promotion 클래스의 showCustomContents()
메서드를 호출하세요.
- customType 파라미터를
PromotionCustomType.VIEW
로 설정하세요. - contentsKey 파라미터를 Hive Console > 프로모션 > 캠페인 설정 > 게임 선택 > 커스텀 뷰 탭 > 캠페인 관리명 > 커스텀 뷰 ID로 설정하세요.
API Reference: hive.Promotion.showCustomContents
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
using hive; PromotionCustomType customType = PromotionCustomType.VIEW; String contentsKey = "12345"; Promotion.showCustomContents(customType, contentsKey, (ResultAPI result, PromotionEventType viewEventType) => { if (!result.isSuccess()) { return; } // 호출 성공 switch (viewEventType) { case OPEN: // 프로모션 뷰 열림 break; case CLOSE: // 프로모션 뷰 닫힘 break; } }); |
API Reference: Promotion::showCustomContents
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#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; } // 호출 성공 switch (viewEventType) { case OPEN: // 프로모션 뷰 열림 break; case CLOSE: // 프로모션 뷰 닫힘 break; } }); |
API Reference: Promotion.showCustomContents
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
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 } // 호출 성공 when (promotionEventType) { Promotion.PromotionViewResultType.OPENED -> { // 프로모션 뷰 열림 } Promotion.PromotionViewResultType.CLOSED -> { // 프로모션 뷰 닫힘 } } } }) |
API Reference: Promotion.INSTANCE.showCustomContents
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
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; } // 호출 성공 switch (viewResultType) { case OPENED: // 프로모션 뷰 열림 break; case CLOSED: // 프로모션 뷰 닫힘 break; } }); |
API Reference: PromotionInterface.showCustomContents
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import HIVEService let type = PromotionCustomType.view let contentsKey = "12345" PromotionInterface.showCustomContents(type, contents: contentsKey) { result, viewResultType in if !result.isSuccess() { return } // 호출 성공 switch viewResultType { case .open: // 프로모션 뷰 열림 case .close: // 프로모션 뷰 닫힘 } } |
API Reference: HivePromotion:showCustomContents
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#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; } // 호출 성공 switch (viewResultType) { case HIVEPromotionViewResultTypeOpen: // 프로모션 뷰 열림 break; case HIVEPromotionViewResultTypeClose: // 프로모션 뷰 닫힘 break; } }]; |
커스텀 보드
커스텀 보드는 일반적인 프로모션 공지와는 다르게 해당 게임 내에서 다양한 목적으로 게시글 목록을 노출할 수 있습니다.
커스텀 보드 등록하기
커스텀 보드를 생성하고 등록하는 방법에 대한 자세한 내용은 Hive 콘솔 프로모션 가이드를 참고하세요.
커스텀 보드 구현하기
커스텀 보드를 띄우기 위해서는 다음 안내에 따라 파라미터를 설정하여 Promotion 클래스의 showCustomContents()
메서드를 호출하세요.
- customType 파라미터를
PromotionCustomType.BOARD
로 설정하세요. - contentsKey 파라미터를 Hive Console > 프로모션 > 커스텀 보드 > 게임 선택 > Board Key로 설정하세요.
다음은 커스텀 보드를 띄우는 예제 코드입니다.
API Reference: hive.Promotion.showCustomContents
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
using hive; PromotionCustomType customType = PromotionCustomType.BOARD; String contentsKey = "12345"; Promotion.showCustomContents(customType, contentsKey, (ResultAPI result, PromotionEventType viewEventType) => { if (!result.isSuccess()) { return; } // 호출 성공 switch (viewEventType) { case OPEN: // 프로모션 뷰 열림 break; case CLOSE: // 프로모션 뷰 닫힘 break; } }); |
API Reference: Promotion::showCustomContents
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#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; } // 호출 성공 switch (viewEventType) { case OPEN: // 프로모션 뷰 열림 break; case CLOSE: // 프로모션 뷰 닫힘 break; } }); |
API Reference: Promotion.showCustomContents
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
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 } // 호출 성공 when (promotionEventType) { Promotion.PromotionViewResultType.OPENED -> { // 프로모션 뷰 열림 } Promotion.PromotionViewResultType.CLOSED -> { // 프로모션 뷰 닫힘 } } } }) |
API Reference: com.hive.Promotion.showCustomContents
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
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; } // 호출 성공 switch (viewResultType) { case OPENED: // 프로모션 뷰 열림 break; case CLOSED: // 프로모션 뷰 닫힘 break; } }); |
API Reference: PromotionInterface.showCustomContents
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import HIVEService let type = PromotionCustomType.board let contentsKey = "12345" PromotionInterface.showCustomContents(type, contents: contentsKey) { result, viewResultType in if !result.isSuccess() { return } // 호출 성공 switch viewResultType { case .open: // 프로모션 뷰 열림 case .close: // 프로모션 뷰 닫힘 } } |
API Reference: HivePromotion:showCustomContents
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#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; } // 호출 성공 switch (viewResultType) { case HIVEPromotionViewResultTypeOpen: // 프로모션 뷰 열림 break; case HIVEPromotionViewResultTypeClose: // 프로모션 뷰 닫힘 break; } }]; |
스팟 배너
게임에서 원하는 위치 또는 타이밍에 전면 배너를 노출할 수 있으며, 이를 스팟 배너라고 합니다. 스팟 배너를 사용하려면 Hive 콘솔 > 프로모션 > 캠페인 등록 > 스팟 배너에서 등록 후 설정하세요.
스팟 배너를 띄우려면 다음 안내에 따라 파라미터를 설정하여 Promotion 클래스의 showCustomContents()
메서드를 호출하세요.
- customType 파라미터를
PromotionCustomType.SPOT
으로 설정하세요. - contentsKey 파라미터를 Hive Console > 프로모션 > 캠페인 설정 > 게임 설정 > 스팟 배너 탭 > 캠페인 관리명 > 스팟 배너 ID로 설정하세요. 이 기능은 SDK v4를 적용한 게임에서만 이용할 수 있습니다.
다음은 스팟배너를 구현한 예제 코드입니다.
API Reference: hive.Promotion.showCustomContents
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
using hive; PromotionCustomType customType = PromotionCustomType.SPOT; String contentsKey = "12345"; Promotion.showCustomContents(customType, contentsKey, (ResultAPI result, PromotionEventType viewEventType) => { if (!result.isSuccess()) { return; } // 호출 성공 switch (viewEventType) { case OPEN: // 프로모션 뷰 열림 break; case CLOSE: // 프로모션 뷰 닫힘 break; } }); |
API Reference: Promotion::showCustomContents
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#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; } // 호출 성공 switch (viewEventType) { case OPEN: // 프로모션 뷰 열림 break; case CLOSE: // 프로모션 뷰 닫힘 break; } }); |
API Reference: Promotion.showCustomContents
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
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 } // 호출 성공 when (promotionEventType) { Promotion.PromotionViewResultType.OPENED -> { // 프로모션 뷰 열림 } Promotion.PromotionViewResultType.CLOSED -> { // 프로모션 뷰 닫힘 } } } }) |
API Reference: com.hive.Promotion.showCustomContents
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
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; } // 호출 성공 switch (viewResultType) { case OPENED: // 프로모션 뷰 열림 break; case CLOSED: // 프로모션 뷰 닫힘 break; } }); |
API Reference: PromotionInterface.showCustomContents
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import HIVEService let type = PromotionCustomType.spot let contentsKey = "12345" PromotionInterface.showCustomContents(type, contents: contentsKey) { result, viewResultType in if !result.isSuccess() { return } // 호출 성공 switch viewResultType { case .open: // 프로모션 뷰 열림 case .close: // 프로모션 뷰 닫힘 } } |
API Reference: HivePromotion:showCustomContents
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#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; } // 호출 성공 switch (viewResultType) { case HIVEPromotionViewResultTypeOpen: // 프로모션 뷰 열림 break; case HIVEPromotionViewResultTypeClose: // 프로모션 뷰 닫힘 break; } }]; |
다이렉트 뷰
다이렉트 뷰란 Hive 콘솔에 등록된 캠페인 번호를 게임에서 호출하여 직접 노출하는 기능입니다. 게임에서 Hive 콘솔에 등록된 캠페인 번호를 호출하면 해당 컨텐츠를 풀 스크린 또는 프레임 타입으로 노출합니다.
Hive SDK v4.16.0부터 Hive 콘솔의 프로모션 > 캠페인 설정에서 설정한 노출타입에 따라 풀 스크린 또는 프레임 타입으로 노출할 수 있습니다.
다음은 다이렉트 뷰를 적용한 예시 화면입니다.
다이렉트 뷰를 띄우려면 다음 안내에 따라 파라미터를 설정하여 Promotion 클래스의 showCustomContents()
메서드를 호출하세요.
- customType 파라미터를
PromotionCustomType.DIRECT
로 설정하세요. - contentsKey 파라미터를 Hive Console > 프로모션 > 캠페인 설정 > 게임 선택 > 일반배너 탭 > 캠페인 번호로 설정하세요.
다음은 다이렉트 뷰를 구현한 예제 코드입니다.
API Reference: hive.Promotion.showCustomContents
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
using hive; PromotionCustomType customType = PromotionCustomType.DIRECT; String contentsKey = "12345"; Promotion.showCustomContents(customType, contentsKey, (ResultAPI result, PromotionEventType viewEventType) => { if (!result.isSuccess()) { return; } // 호출 성공 switch (viewEventType) { case OPEN: // 프로모션 뷰 열림 break; case CLOSE: // 프로모션 뷰 닫힘 break; } }); |
API Reference: Promotion::showCustomContents
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#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; } // 호출 성공 switch (viewEventType) { case OPEN: // 프로모션 뷰 열림 break; case CLOSE: // 프로모션 뷰 닫힘 break; } }); |
API Reference: Promotion.showCustomContents
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
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 } // 호출 성공 when (promotionEventType) { Promotion.PromotionViewResultType.OPENED -> { // 프로모션 뷰 열림 } Promotion.PromotionViewResultType.CLOSED -> { // 프로모션 뷰 닫힘 } } } }) |
API Reference: com.hive.Promotion.showCustomContents
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
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; } // 호출 성공 switch (viewResultType) { case OPENED: // 프로모션 뷰 열림 break; case CLOSED: // 프로모션 뷰 닫힘 break; } }); |
API Reference: PromotionInterface.showCustomContents
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import HIVEService let type = PromotionCustomType.direct let contentsKey = "12345" PromotionInterface.showCustomContents(type, contents: contentsKey) { result, viewResultType in if !result.isSuccess() { return } // 호출 성공 switch viewResultType { case .open: // 프로모션 뷰 열림 case .close: // 프로모션 뷰 닫힘 } } |
API Reference: HivePromotion:showCustomContents
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#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; } // 호출 성공 switch (viewResultType) { case HIVEPromotionViewResultTypeOpen: // 프로모션 뷰 열림 break; case HIVEPromotionViewResultTypeClose: // 프로모션 뷰 닫힘 break; } }]; |
배너를 자체적으로 구현하기
Hive SDK는 showPromotion
메서드로 원하는 캠페인을 배너로 노출하는 기능을 제공합니다. 하지만, Hive SDK에서 제공하지 않는 배너(롤링 배너)를 노출하고 싶거나, Hive SDK에서 제공하는 배너라도 여러분이 원하는대로 커스터마이징하여 노출하고 싶을 수 있습니다.
배너를 자체적으로 구현하려면 다음 과정을 따라야합니다.
- Hive 콘솔에 자체 구현해서 노출할 배너 정보(배너 이미지, 링크 등)를 등록합니다.
- Hive SDK의 getBannerInfo()를 실행해 배너 구현에 필요한 정보를 Hive 서버로부터 받아옵니다.
- 받아온 정보를 바탕으로 배너를 직접 구현해서 게임에서 노출합니다.
롤링 배너
롤링 배너는 콘텐츠가 흐르는 형태인 배너입니다. 롤링 배너는 게임 스튜디오에서 직접 구현해 노출해야 합니다.
배너 정보 조회
배너 정보 조회(getBannerInfo
)는 게임 스튜디오가 배너를 직접 구현 시 베너를 원하는 규격으로 노출하는 데 필요한 정보를 얻는 기능입니다. 이 API가 Hive 서버에서 배너 구성에 필요한 데이터를 가져오면, 게임에서는 이 데이터를 사용해 원하는 방식대로 배너를 표시할 수 있습니다. 이 API를 호출하려면 인증 v1 또는 인증 v4를 반드시 초기화해야 하며, 초기화하지 않을 경우 데이터를 받아오는 과정에 문제가 발생할 수 있습니다.
API 요청 예시
API Reference: hive.Promotion.getBannerInfo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
using hive; /* ALL(전체), EVENT(이벤트), NOTICE(공지), CROSS(크로스 전면 배너) */ PromotionCampaignType campaignType = PromotionCampaignType.EVENT; /* SMALL(띠배너), GREAT(전면 배너), ROLLING(롤링배너) */ PromotionBannerType bannerType = PromotionBannerType.ROLLING; Promotion.getBannerInfo(campaignType, bannerType, (ResultAPI result, List bannerInfoList) => { if (result.isSuccess()) { // 호출 성공 } }); // 배너 타입 및 캠페인 타입을 열거형 대신 문자열을 통해 호출할 수도 있습니다. /* "all"(전체), "event"(이벤트), "notice"(공지), "cross"(크로스 전면 배너) */ String campaignType = "event"; /* "small"(띠배너), "great"(전면 배너), "rolling"(롤링배너) */ String bannerType = "rolling"; Promotion.getBannerInfoString(campaignType, bannerType, (ResultAPI result, List bannerInfoList) => { if (result.isSuccess()) { // 호출 성공 } }); |
API Reference: Promotion::getBannerInfo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
#include <HIVE_SDK_Plugin/HIVE_CPP.h> using namespace std; using namespace hive; /* ALL(전체), EVENT(이벤트), NOTICE(공지), CROSS(크로스 전면 배너) */ PromotionCampaignType campaignType = PromotionCampaignType::EVENT; /* SMALL(띠배너), GREAT(전면 배너), ROLLING(롤링배너) */ PromotionBannerType bannerType = PromotionBannerType::ROLLING; Promotion::getBannerInfo(campaignType, bannerType, [=](ResultAPI result, vector bannerInfos) { if (result.isSuccess()) { // 호출 성공 } }); // 배너 타입 및 캠페인 타입을 열거형 대신 문자열을 통해 호출할 수도 있습니다. /* "all"(전체), "event"(이벤트), "notice"(공지), "cross"(크로스 전면 배너) */ string campaignType = "event"; /* "small"(띠배너), "great"(전면 배너), "rolling"(롤링배너) */ string bannerType = "rolling"; Promotion::getBannerInfoString(campaignType, bannerType, [=](ResultAPI result, vector bannerInfos) { if (result.isSuccess()) { // 호출 성공 } }); |
API Reference: Promotion.getBannerInfo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
import com.hive.Promotion import com.hive.ResultAPI /* ALL(전체), EVENT(이벤트), NOTICE(공지), CROSS(크로스 전면 배너) */ val campaignType = Promotion.PromotionCampaignType.EVENT /* SMALL(띠배너), GREAT(전면 배너), ROLLING(롤링배너) */ val bannerType = Promotion.PromotionBannerType.ROLLING Promotion.getBannerInfo(campaignType, bannerType, object : Promotion.PromotionBannerInfoListener { override fun onReceiveInfo(result: ResultAPI, bannerInfoList: ArrayList<Promotion.PromotionBanner>?) { if (result.isSuccess) { // 호출 성공 } } }) // 배너 타입 및 캠페인 타입을 열거형 대신 문자열을 통해 호출할 수도 있습니다. /* "all"(전체), "event"(이벤트), "notice"(공지), "cross"(크로스 전면 배너) */ val campaignType = "event" /* "small"(띠배너), "great"(전면 배너), "rolling"(롤링배너) */ val bannerType = "rolling" Promotion.getBannerInfoString(campaignType, bannerType, object : Promotion.PromotionBannerInfoListener { override fun onReceiveInfo(result: ResultAPI, bannerInfoList: ArrayList<Promotion.PromotionBanner>?) { if (result.isSuccess) { // 호출 성공 } } }) |
API Reference: Promotion.INSTANCE.getBannerInfo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
import com.hive.Promotion; import com.hive.ResultAPI; /* ALL(전체), EVENT(이벤트), NOTICE(공지), CROSS(크로스 전면 배너) */ Promotion.PromotionCampaignType campaignType = Promotion.PromotionCampaignType.EVENT; /* SMALL(띠배너), GREAT(전면 배너), ROLLING(롤링배너) */ Promotion.PromotionBannerType bannerType = Promotion.PromotionBannerType.ROLLING; Promotion.INSTANCE.getBannerInfo(campaignType, bannerType, (result, bannerInfoList) -> { if(result.isSuccess()) { // 호출 성공 } }); // 배너 타입 및 캠페인 타입을 열거형 대신 문자열을 통해 호출할 수도 있습니다. /* "all"(전체), "event"(이벤트), "notice"(공지), "cross"(크로스 전면 배너) */ String campaignType = "event"; /* "small"(띠배너), "great"(전면 배너), "rolling"(롤링배너) */ String bannerType = "rolling"; Promotion.INSTANCE.getBannerInfo(campaignType, bannerType, (result, bannerInfoList) -> { if(result.isSuccess()) { // 호출 성공 } }); |
API Reference: PromotionInterface.getBannerInfo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
import HIVEService /* all(전체), event(이벤트), notice(공지), cross(크로스 전면 배너) */ let campaignType = PromotionCampaignType.event /* small(띠배너), great(전면 배너), rolling(롤링배너) */ let bannerType = PromotionBannerType.rolling PromotionInterface.getBannerInfo(campaignType, bannerType: bannerType) { result, bannerInfoList in { if result.isSuccess() { // 호출 성공 } } // 배너 타입 및 캠페인 타입을 열거형 대신 문자열을 통해 호출할 수도 있습니다. /* "all"(전체), "event"(이벤트), "notice"(공지), "cross"(크로스 전면 배너) */ let campaignType = "event" /* "small"(띠배너), "great"(전면 배너), "rolling"(롤링배너) */ let bannerType = "rolling" PromotionInterface.getBannerInfoString(campaignType, bannerString: bannerType) { result, bannerInfoList in { if result.isSuccess() { // API 호출 성공 } } |
API Reference: HIVEPromotion getBannerInfo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
#import <HIVEService/HIVEService-Swift.h> /* HIVEPromotionCampaignTypeAll(전체), HIVEPromotionCampaignTypeEvent(이벤트), HIVEPromotionCampaignTypeNotice(공지), HIVEPromotionCampaignTypeCross(크로스 전면 배너) */ HIVEPromotionCampaignType campaignType = HIVEPromotionCampaignTypeEvent; /* HIVEPromotionBannerTypeSmall(띠배너), HIVEPromotionBannerTypeGreat(전면 배너), HIVEPromotionBannerTypeRolling(롤링배너) */ HIVEPromotionBannerType bannerType = kHIVEPromotionBannerTypeRolling; [HIVEPromotion getBannerInfo: campaignType bannerType: bannerType handler: ^(HIVEResultAPI *result, NSArray *bannerInfos) { if ([result isSuccess]) { // 호출 성공 } }]; // 배너 타입 및 캠페인 타입을 열거형 대신 문자열을 통해 호출할 수도 있습니다. /* "all"(전체), "event"(이벤트), "notice"(공지), "cross"(크로스 전면 배너) */ NSString *campaignType = @"event"; /* "small"(띠배너), "great"(전면 배너), "rolling"(롤링배너) */ NSString *bannerType = @"rolling"; [HIVEPromotion getBannerInfoString: campaignType, bannerString: bannerType, handler: ^(HIVEResultAPI *result, NSArray<HIVEPromotionBanner *> *bannerInfos) { if ([result isSuccess]) { // 호출 성공 } }]; |
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 콘솔에 설정해 둔 캠페인 정보를 조회하는 기능을 제공합니다. 이 기능은 Hive 프로모션 뷰를 이용하는 대신 여러분이 Hive 콘솔에 등록해 둔 캠페인 컨텐츠를 게임에서 직접 표시하고자 할 때 유용한 기능입니다.
조회가 가능한 캠페인 정보 종류는 커스텀 뷰, 커스텀 보드, 스팟 배너, 다이렉트 뷰 4가지 종류로 모두 Promotion 클래스의 showCustomContents()
로 표시할 수 있는 프로모션입니다.
캠페인 정보 포맷
Hive는 프로모션 정보를 PromotionViewInfo
오브젝트 배열로 반환합니다. 스팟 배너를 전면 배너처럼 여러 항목으로 구성할 수 있기 때문입니다. 스팟 배너를 제외한 커스텀 뷰, 커스텀 보드, 다이렉트 뷰 형태의 캠페인은 단일 형태로 구성되지만 Hive는 캠페인 종류를 구분하지 않고 모두 배열 형태로 반환합니다.
다음은 PromotionViewInfo
오브젝트 구성 정보입니다.
Name | Type | Description |
---|---|---|
url | String | 웹뷰로 로드할 페이지 URL |
postString | String | 웹뷰 로드 시 필요한 POST 스트링 |
캠페인 정보 조회하기
Hive 콘솔에 등록한 캠페인 정보를 조회하려면 Hive 콘솔에 등록한 프로모션 고유 ID를 첫 번째 파라미터로 설정하여 Promotion 클래스의 getViewInfo()
메서드를 호출하세요. 그리고 조회하는 캠페인에 대한 정보를 받으려는 콜백 함수를 함께 전달하세요.
다음은 310000이라는 고유 ID를 가진 캠페인에 대한 정보를 요청하는 예제 코드입니다. Android와 iOS 예제 코드에는 Hive로부터 전달 받은 정보를 직접 웹뷰를 표시하는 코드가 함께 제공되어 있습니다.
API Reference: hive.Promotion.getViewInfo
1 2 3 4 5 6 7 8 9 10 |
using hive; PromotionCustomType customType = PromotionCustomType.VIEW; String contentsKey = "123456"; Promotion.getViewInfo(customType, contentsKey, (ResultAPI result, List promotionViewInfoList) => { if (result.isSuccess()) { // 호출 성공 } }); |
API Reference: Promotion::getViewInfo
1 2 3 4 5 6 7 8 9 10 11 12 |
#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()) { // 호출 성공 } }); |
API Reference: Promotion.getViewInfo
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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) { // 호출 성공 } } }) |
API Reference: com.hive.Promotion.getViewInfo
1 2 3 4 5 6 7 8 9 10 11 |
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()) { // 호출 성공 } }); |
API Reference: PromotionInterface.getViewInfo
1 2 3 4 5 6 7 8 9 10 |
import HIVEService let promotionType = PromotionCustomType.view let contentsKey = "123456" PromotionInterface.getViewInfo(promotionType, contents: contentsKey) { result, infos in if result.isSuccess() { // 호출 성공 } } |
API Reference: HIVEPromotion:getViewInfo
1 2 3 4 5 6 7 8 9 10 |
#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]) { // 호출 성공 } }]; |
프로모션 서버에 부가 정보 전달하기
부가 정보란 게임사 내부적으로 정의한 데이터입니다. 게임사는 부가 정보를 Hive 프로모션 서버에 전달한 후, 게임사와 컴투스플랫폼간 논의를 거쳐 이를 다양한 서비스에 활용할 수 있습니다.
예를 들어, additionalInfo
에 플레이어 캐릭터 레벨 정보를 아래와 같이 정의할 수 있습니다.
1 2 3 4 5 |
{ "account_id": 1000338, "account_name": "test_account", "player_level": 50 } |
setAdditionalInfo
메서드로 위 additionalInfo
를 프로모션 서버에 전달하도록 한 후 컴투스플랫폼과 구현 내용을 협의합니다. 예를 들어, 특정 이벤트 페이지(다이렉트 뷰, 커스텀 뷰 등)를 노출 시, 캐릭터 레벨이 50 이상인 유저는 이벤트 배너 테두리를 금색으로 노출할 수 있습니다.또
additionalInfo
에 캠페인 번호를 넣으면 새소식 배너에 선물 상자 이미지를 추가하는 기능으로도 사용할 수 있습니다.
다음은 additionalInfo
를 전달하는 예제코드 입니다.
API Reference: hive.Promotion.setAdditionalInfo
1 2 3 4 5 6 7 8 9 10 |
using hive; // Unity 패키지 내 JSON Object 버전에 따른 Escape 문자열 처리(역슬래쉬를 포함해야함) // Hive 4.16.2 미만 string additionalInfo = "{\\\"myData\\\":\\\"123\\\"}"; // Hive 4.16.2 이상 string additionalInfo = "{\"myData\":\"123\"}; Promotion.setAdditionalInfo(additionalInfo) |
API Reference: Promotion::setAdditionalInfo
1 2 3 4 5 6 7 |
#include <HIVE_SDK_Plugin/HIVE_CPP.h> using namespace std; using namespace hive; string additionalInfo = "{\"myData\":\"123\"}; Promotion::setAdditionalInfo(additionalInfo); |
API Reference: Promotion.setAdditionalInfo
1 2 3 4 5 |
import com.hive.Promotion val additionalInfo = "{\"myData\":\"123\"}" Promotion.setAdditionalInfo(additionalInfo) |
API Reference: Promotion.INSTANCE.setAdditionalInfo
1 2 3 4 5 |
import com.hive.Promotion; String additionalInfo = "{\"myData\":\"123\"}"; Promotion.INSTANCE.setAdditionalInfo(additionalInfo); |
API Reference: PromotionInterface.setAdditionalInfo
1 2 3 4 5 |
import HIVEService let additionalInfo = "{\"myData\":\"123\"}" PromotionInterface.setAdditionalInfo(additionalInfo) |
API Reference: HIVEPromotion::setAdditionalInfo
1 2 3 4 5 |
#import <HIVEService/HIVEService-Swift.h> NSString *additionalInfo = @"{\"myData\":\"123\"}"; [HIVEPromotion setAdditionalInfo: additionalInfo]; |
부가 정보는 Hive SDK 프로모션 모든 기능에 활용할 수 있습니다. 따라서 모든 프로모션 기능을 구현하기 전에 부가 정보와 이를 활용하는 방법을 정의한 후 setAdditionalInfo
를 가장 먼저 호출하는 것을 권장합니다.
타이틀 바 없이 이벤트 페이지 표시하기
전면 배너, 스팟 배너, 새소식 페이지, 다이렉트 뷰 등을 통해 이벤트 페이지에 접속 시 Hive 타이틀 바를 없앨 수 있습니다. Hive 타이틀 바 없이 이벤트 페이지를 표시하려면 showCustomContents()
메서드를 호출하기 전에 Promotion 클래스의 setAdditionalInfo()
메서드를 호출하여 헤더 필드를 "off"
로 설정하세요. 아래와 같이 부가 정보(additionalInfo)를 구성해 Hive 서버에 전송하면 페이지 노출 시 타이틀 바를 제거할 수 있습니다.
다음은 타이틀 바를 해제하는 예제 코드입니다.
API Reference: hive.Promotion.setAdditionalInfo
1 2 3 4 5 6 7 8 9 |
using hive; // Hive 4.16.2 미만 string additionalInfo = "{\\\"header\\\":\\\"off\\\"}"; // Hive 4.16.2 이상 string additionalInfo = "{\"header\":\"off\"}"; Promotion.setAdditionalInfo(additionalInfo) |
API Reference: Promotion::setAdditionalInfo
1 2 3 4 5 6 7 |
#include <HIVE_SDK_Plugin/HIVE_CPP.h> using namespace std; using namespace hive; string additionalInfo = "{\"header\":\"off\"}"; Promotion::setAdditionalInfo(additionalInfo); |
API Reference: Promotion.setAdditionalInfo
1 2 3 4 5 |
import com.hive.Promotion val additionalInfo = "{\"header\":\"off\"}" Promotion.setAdditionalInfo(additionalInfo) |
API Reference: Promotion.INSTANCE.setAdditionalInfo
1 2 3 4 5 |
import com.hive.Promotion; String additionalInfo = "{\"header\":\"off\"}"; Promotion.INSTANCE.setAdditionalInfo(additionalInfo); |
API Reference: PromotionInterface.setAdditionalInfo
1 2 3 4 5 |
import HIVEService let additionalInfo = "{\"header\":\"off\"}" PromotionInterface.setAdditionalInfo(additionalInfo) |
API Reference: HIVEPromotion setAdditionalInfo
1 2 3 4 5 |
#import <HIVEService/HIVEService-Swift.h> NSString *additionalInfo = @"{\"header\":\"off\"}"; [HIVEPromotion setAdditionalInfo: additionalInfo]; |
프로모션에 동영상 광고 도입하기
Hive SDK v4.7.0부터 동영상 광고를 추가할 수 있습니다. 프로모션 도중 유저가 동영상 재생 링크를 선택하면 영상이 전체 화면으로 노출됩니다. 이 기능을 도입하기 위해 게임에서 별도 함수를 호출할 필요는 없습니다. 다만 영상 시작 전 게임 음량을 최소화하거나 음소거하는 코드를 추가하고, 영상이 종료된 이후에는 원래 음량으로 되돌리는 작업을 진행해야 합니다.
- 영상 시작 전후 상태는 프로모션을 호출한 API의 핸들러로 전달됩니다. 이 때
PromotionViewResultType
으로 StartPlayback, FinishPlayback이 전달되며, Result API의 code 값으로 kPromotionStartPlayback, kPromotionFinishPlayback이 각각 전달됩니다.- iOS Xcode에 추가해야 하는 WebKit.framework, libz.tbd 두 가지 프레임워크가 추가되었습니다.
다음은 프로모션에 동영상 광고를 도입하기 위해 게임 음량을 조절하는 예제 코드입니다.
API Reference: onPromotionView
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
using hive; public void onPromotionViewCB(ResultAPI result, PromotionEventType viewEventType) { if (!result.isSuccess()) { return; } // 호출 성공 switch (viewEventType) { case OPEN: // 프로모션 뷰 열림 break; case CLOSE: // 프로모션 뷰 닫힘 break; case START_PLAYBACK: // TODO: 게임 사운드 음소거 break; case FINISH_PLAYBACK: // TODO: 게임 사운드 재개 break; } } |
API Reference: onPromotionView
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#include <HIVE_SDK_Plugin/HIVE_CPP.h> using namespace std; using namespace hive; void PromotionTest::onPromotionView(ResultAPI result, PromotionEventType viewEventType) { if (!result.isSuccess()) { return; } // 호출 성공 switch (viewEventType) { case OPEN: // 프로모션 뷰 열림 break; case CLOSE: // 프로모션 뷰 닫힘 break; case START_PLAYBACK: // TODO: 게임 사운드 음소거 break; case FINISH_PLAYBACK: // TODO: 게임 사운드 재개 break; } } |
API Reference: onPromotionView
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
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 } // 호출 성공 when (promotionEventType) { Promotion.PromotionViewResultType.OPENED -> { // 프로모션 뷰 열림 } Promotion.PromotionViewResultType.CLOSED -> { // 프로모션 뷰 닫힘 } Promotion.PromotionViewResultType.START_PLAYBACK -> { // TODO: 게임 사운드 음소거 } Promotion.PromotionViewResultType.FINISH_PLAYBACK -> { // TODO: 게임 사운드 재개 } else -> {} } } } |
API Reference: Promotion.PromotionViewListener
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
import com.hive.Promotion; import com.hive.ResultAPI; Promotion.PromotionViewListener listener = (result, promotionEventType) -> { if (!result.isSuccess()) { return; } // 호출 성공 switch (promotionEventType) { case OPENED: // 프로모션 뷰 열림 break; case CLOSED: // 프로모션 뷰 닫힘 break; case START_PLAYBACK: // TODO: 게임 사운드 음소거 break; case FINISH_PLAYBACK: // TODO: 게임 사운드 재개 break; default: break; } }; |
API Reference: PromotionViewHandler
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import HIVEService let handler = { (result: ResultAPI, viewResultType: PromotionViewResultType) in if !result.isSuccess() { return } // 호출 성공 switch viewResultType { case .open: // 프로모션 뷰 열림 case .close: // 프로모션 뷰 닫힘 case .startPlayBack: // TODO: 게임 사운드 음소거 case .finishPlayBack: // TODO: 게임 사운드 재개 } } |
API Reference: HIVEPromotionViewHandler
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#import <HIVEService/HIVEService-Swift.h> HIVEPromotionViewHandler handler = ^(HIVEResultAPI* result, HIVEPromotionViewResultType viewResultType) { if (![result isSuccess]) { return; } // 호출 성공 switch (viewResultType) { case HIVEPromotionViewResultTypeOpen: // 프로모션 뷰 열림 break; case HIVEPromotionViewResultTypeClose: // 프로모션 뷰 닫힘 break; case HIVEPromotionViewResultTypeStartPlayback: // TODO: 게임 사운드 음소거 break; case HIVEPromotionViewResultTypeFinishPlayback: // TODO: 게임 사운드 재개 break; } } }; |