Hive 프로모션은 게임을 이용하는 유저에게 게임의 새로운 소식이나 이벤트를 효과적으로 노출하는 기능을 제공한다.
대배너
Hive는 게임을 이용하는 유저에게 이벤트를 효과적으로 노출하는 기능을 제공한다. 이용중인 게임에 더 많은 참여를 유도하는 목적으로 활용하거나 다른 게임을 광고하고 보상을 제공하는 크로스 프로모션으로 활용할 수도 있다. 유저가 배너를 클릭하면 Hive 콘솔에 등록된 내용에 따라 상세 페이지, 외부 페이지, 또는 광고 게임의 다운로드 페이지로 이동한다.
웹 배너에 동영상 적용하기
웹 배너는 대배너 노출 시점에 이미지 배너가 아닌 웹 페이지를 노출하는 기능이다.
- URL 주소가 있는 웹 페이지는 모두 등록할 수 있다.
- 동영상이 포함된 웹 페이지의 경우, 동영상 플랫폼이 유튜브가 아니면 안정적인 재생을 보장할 수 없으므로 유튜브 사용을 권장한다.
- 유저가 동영상을 재생할 경우 영상이 전체 화면으로 노출된다. 이를 위해 게임에서는 영상 시작 전 게임 음량을 최소화하거나 음소거하는 코드를 추가하고, 영상이 종료된 이후에는 원래 음량으로 되돌리는 작업이 필요하다.
새소식 데이터 갱신 API 추가하기
새소식 페이지 정보는 로그인 직후 서버와 1회 통신하여 전달받습니다. 게임에서 설정한 게임 언어, 게임 서버 등의 정보를 유저가 변경하는 경우 갱신이 필요합니다. 유저가 게임을 장시간 켜두고 사용하는 경우에도 최신 정보 갱신이 이루어지지 않을 수 있습니다. 유저가 게임 로비에 접속할 때 게임에서는 새소식 정보 갱신을 수동으로 진행해야 합니다. HivePromotion 클래스의 updatePromotionData()
메서드를 호출하여 정보를 갱신하세요.
argument name | type | desc | platform | 비고 |
---|---|---|---|---|
argument 없음 | all |
1 2 3 4 5 6 7 8 9 |
C2SModule.Parameter arg = new C2SModule.Parameter (); C2SModule.Error error; if(!C2SModule.HivePromotion.UpdatePromotionData (arg, out error) { // Error 처리 } // 별도의 콜백 없음 |
1 2 3 4 5 6 7 8 9 |
Json::Value arg; C2SModule_Cocos2dx::C2SModuleError error; if( ::C2SModuleHivePromotion_UpdatePromotionData(strJSON.c_str(), &error) == false) { // Error 처리 } // 별도의 콜백 없음 |
1 2 3 4 5 6 7 8 9 10 |
NSError *error; NSDictionary* arg = @{}; [C2SModuleHivePromotion UpdatePromotionData:arg error:&error completionHandler:^(NSDictionary* resultArg, NSError* resultError) { if (resultError == nil ) { // succeed } }]; |
새소식(News)
Hive 프로모션에서 제공하는 ‘새소식’ 팝업 창을 띄우는 기능으로, Hive 콘솔에서 등록한 게임의 이벤트 배너와 공지사항이 노출된다. Hive 프로모션에 등록된 개별 이벤트를 게임에서 직접 열 수 있는 기능도 제공한다. Android 단말 플랫폼에서는 무료충전소와 쿠폰교환소 링크도 배너로 노출된다.
공지
공지 화면은 유저에게 공지할 내용을 게시판 목록 형태로 제공하는 웹 뷰이다.
무료 충전소
무료 충전소는 Hive 게임 간의 광고 네트워크로 기존 Hive 유저들이 새로운 Hive 게임을 이용할 수 있도록 유도하는 기능이다. 유저가 다운로드 받을 수 있는 게임을 목록으로 노출하고 게임을 다운로드 받아 실행하면 매체가 되는 게임에서 보상이 제공된다. iOS에서도 동일한 기능을 수행할 수 있으나 해당 마켓 정책에 따라 보상이 제공되지는 않는다.
현재 마켓 사업자의 정책에 따라 Android 단말 플랫폼에서만 보상이 제공되고 있다.
달성한 이벤트 배너 구분하기
유저가 달성한 이벤트를 새소식 페이지에서 구분하려면 additionalInfo 파라미터 값에 캠페인 번호를 전달한다.
1 |
"additionalInfo": "{"complete":[200123, 200145, 200319]}" |
프로모션 재화 지급 정보
유저가 프로모션 화면에서 쿠폰 입력 등을 수행하면 게임 서버에서 Hive 아이템 서버(재화 지급 시스템)로 재화를 조회해야 한다.
Hive 아이템 서버는 재화가 지급 되었다는 것을 게임에 알려주기 위해서 재화 지급 정보를 전달하게 된다.
프로모션 재화 지급 정보의 정의
- 프로모션 화면에 의한 재화 지급 정보는 OfferwallReward에 담겨져서 전달된다.
- OfferwallReward의 필드 설명은 다음과 같다.
errorNo | 응답 코드 |
---|---|
errorMessage | 응답 코드에 상응하는 메시지 |
result | 보상 요청 결과 |
eventID | 싱글 게임을 위한 보상 이벤트 ID |
assetCode | 싱글 게임을 위한 재화 코드 |
assetAmount | 싱글 게임을 위한 재화 개수 |
커스텀 뷰
게임 내 별도 실행 버튼으로 외부 URL 혹은 입력한 내용을 웹뷰로 노출 할 수 있는 기능을 커스텀 뷰라고 한다. 커스텀 뷰는 한 게임에서 여러 개를 적용 할 수 있어 경우에 따라 다양한 활용이 가능하다.
- 게임 내 별도 실행 버튼으로 외부 URL 혹은 입력한 내용을 뷰로 노출할 수 있다.
- 한 게임에서 여러 개의 뷰를 적용 할 수 있어 경우에 따라 다양한 활용이 가능하다.
- 커스텀 뷰 UI는 콘솔에서 전체 화면과 프레임 두 가지 타입 중에 한 가지로 선택할 수 있으며, 원하는 색상으로 커스터마이징이 가능하다.
- 커스텀 뷰와 커스텀 보드는 콘솔에서 설정한 UI 타입으로 일괄 적용된다.
커스텀 보드
커스텀 보드는 일반적인 프로모션 공지와는 다르게 해당 게임 내에서 다양한 목적으로 게시글의 목록을 노출할 수 있다.
적용 사례: MLB 9이닝스 17 게임 내 새소식 > 플레이북 메뉴 참고
배너 정보 API
Hive SDK v1.18.3부터 게임에서 배너를 원하는 규격으로 자유롭게 노출할 수 있도록 지원한다. Hive에서 제공하는 API가 배너 데이터를 가져오면, 게임에서는 제공받은 데이터를 활용하여 특정 위치에 배너를 표시할 수 있다. 배너 이미지 등록과 설정은 Hive 콘솔에서 진행하며 대배너/일반 배너 등록 방법과 동일하다. 배너 API를 호출하려면 인증 v1 또는 인증 v4를 반드시 초기화해야 하며, 초기화하지 않을 경우 데이터를 받아오는 과정에 문제가 발생할 수 있다. 데이터를 정상적으로 전달받았다면 API를 적용한 배너 클릭 시 전달받은 pid(Integer) 값을 contentsKey(String)로 형변환한다. 이 값은 C2SModuleHivePromotion_Show API의 type 값이 direct
일 때 매개변수로 전달하여 다이렉트 배너 커스텀 뷰 형태로 노출할 수도 있다.
API를 호출할 때 배너 정보는 GetBannerInfo 오브젝트에 담아 배열로 반환한다.
argument name | type | desc | platform | 비고 |
---|---|---|---|---|
campaignType | string | all: 모든 타입 event: 이벤트 타입 notice: 공지 타입 cross: 크로스 타입 |
all | 1.18.3+ (cross 타입은 1.20.3.2+) |
bannerType | string | great: 대배너 small: 일반 배너 rolling: 롤링 배너 |
all | 1.18.3+ |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
C2SModule.Parameter arg = new C2SModule.Parameter (); arg["campaignType"] = "all"; // "all", "event", "notice", "cross" arg["bannerType"] = "great"; // "great", "small", "rolling" C2SModule.Error error; if(!C2SModule.HivePromotion.GetBannerInfo (arg, out error)) { // Error 처리 } static void ResultDelegate(Api api, Parameter arg, Error error) { switch(api) { case Api.HivePromotion_GetBannerInfo: // break; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
Json::Value arg; arg["campaignType"] = "all"; // "all", "event", "notice", "cross" arg["bannerType"] = "great"; // "great", "small", "rolling" C2SModule_Cocos2dx::C2SModuleError error; if( ::C2SModuleHivePromotion_GetBannerInfo(strJSON.c_str(), &error) == false) { // Error 처리 } void SampleProject::ResultDelegate(C2SModuleApi api, const char* json, C2SModuleErrorCode code, const char* message) { switch(api) { case C2SModuleApi_HivePromotionGetBannerInfo: { // ... } } } |
1 2 3 4 5 6 7 8 9 10 |
NSError *error; NSDictionary* arg = @{@"campaignType":@"all", @"bannerType":@"great"}; [C2SModuleHivePromotion GetBannerInfo:optionSelect error:&error completionHandler:^(NSDictionary* resultArg, NSError* resultError) { if (resultError == nil ) { // succeed } }]; |
스팟 배너
스팟 배너는 Hive 프로모션 전용 기능으로 게임에서 원하는 위치 또는 타이밍에, 대배너의 UI를 가진 배너를 노출하는 기능이다. Hive 콘솔 > 프로모션 > 캠페인 등록 > 스팟 배너에서 등록 후 설정할 수 있다.
다이렉트 배너
Hive 콘솔에 등록된 캠페인 번호를 게임에서 호출하여 커스텀 뷰를 통해 직접 노출하는 기능이다. 게임에서 Hive 콘솔에 등록된 캠페인 번호를 호출하면 해당하는 배너를 불러와서 배너 영역을 구현하고, 클릭 시 해당 배너의 컨텐츠를 커스텀 뷰로 노출한다. 기존에 additionalInfo로 활용했던 mq_redirect와 동일하게 동작한다.
Hive 리뷰 팝업
게임 유저들의 긍정적인 평점 및 사용 후기는 다른 유저들이 게임을 이용하는데 영향을 미치게 된다. 리뷰 유도 팝업을 제공하면 유저의 참여 건수가 5~10배 증가하는 것으로 알려져 있다. Hive에서 제공하는 기능을 이용할 수도 있고 게임에서 리뷰 유도 팝업 UI 를 직접 구현하여 마켓 URL을 링크 해도 된다.
종료 팝업 화면
Google의 Android 앱 개발 가이드라인에 따라 게임에서도 단말의 ‘뒤로 가기’ 버튼을 누르면 이전 상태로 이동하도록 구현해야 한다. 게임이 진행 중일 때 ‘뒤로 가기’ 버튼을 누르면 ‘일시 정지’ 상태가 되고 게임을 계속할지 종료할지를 물어보게 된다. 더 이상 돌아갈 이전 상태가 없을 경우는 게임 종료 팝업을 노출하고 유저의 선택에 따라 게임을 종료한다. 이용 중인 게임을 종료 하려는 유저에게 새로운 Hive 게임의 다운로드를 유도하기 위해 ‘더 많은 게임’ 버튼을 노출한다. Hive에서 제공하는 기능을 이용할 수도 있고 게임에서 직접 구현하여 Hive 게임으로 링크 해도 된다.
Android 별점 리뷰 팝업 조건
Hive SDK v1.19.1 버전부터 Android 환경에서 게임을 이용하는 유저라면 게임 실행 중에 리뷰를 남길 수 있는 기능을 제공합니다. 기존 리뷰 팝업과 달리 마켓으로 이동하지 않아도 만족도 평가가 가능하며, 리뷰 요청에 응할 경우 작성 페이지로 즉시 이동합니다. 다음과 같이 Google에서 제공하는 정책에 따라 Android 별점 리뷰 팝업이 노출됩니다.
- 리뷰 팝업은 구글 내부 정책에 따라 노출 여부가 결정되며, 수동으로 노출 여부 변경이 불가능 합니다.
- Google Play 스토어가 설치되었으며 Android 5.0(API 수준 21) 이상을 실행하는 Android 기기에서 노출 가능합니다.
- 사용자 개인정보 보호를 강화하고 API 오용을 방지하기 위해, 구글 가이드내용에 따라 API 호출 권장 합니다.
- 개발 중인 빌드에서도 구글 내부 정책에 따라 노출 여부가 결정되며, 항상 노출을 위한 설정을 위해서는 해당 구글 가이드를 참고하세요.
Android 별점 리뷰 팝업 띄우기
Android 별점 리뷰 팝업을 띄우려면 C2SModuleHivePromotion 클래스의 show()
메서드를 type 값 reviewEx
로 설정하여 호출하세요.
1 |
hive.Promotion.showNativeReview(); |
1 |
Promotion::showNativeReview(); |
1 |
Promotion.showNativeReview(); |
1 |
[HIVEPromotion showNativeReview]; |
iOS 인게임 리뷰 팝업
iOS 환경에서는 게임 상에서 리뷰를 남길 수 있다. 기존의 리뷰 팝업과 달리 마켓으로 이동하지 않아도 별점 제출이 가능하며, 리뷰 요청에 응할 경우 작성 페이지로 즉시 이동한다.
iOS 인게임 리뷰 팝업 정책
iOS 인게임 리뷰 팝업을 사용하기 위해 Hive가 권장하는 정책은 다음과 같다.
- Hive에서 제공하는 게임 리뷰 팝업을 그대로 사용하더라도 iOS 인게임 리뷰 팝업과 동시 사용 가능
- 게임마다 다르게 설정한 리뷰 팝업을 사용하는 경우에는 iOS 인게임 리뷰 팝업과 동시 사용 불가
- Hive SDK v1.16.0, v4.10.0 이상 버전에서 동작
Apple에서 제공하는 정책에 따라 iOS 인게임 리뷰 팝업이 노출된다.
- 노출 순서나 텍스트, UI 등을 임의로 변경 불가
- 팝업은 각 앱에서 디바이스별 연 3회 까지만 노출되며, 노출 여부는 Apple 내부 정책에 따라 동작하므로 수동으로 변경 불가
- iOS 10.3 이상 버전에서 동작
- 유저가 기기 설정에서 ‘앱 내 평가 및 리뷰’ 항목을 비활성화(OFF)한 경우 노출되지 않음
- 개발 중인 빌드에서는 노출 횟수와 관계 없이 항상 노출되며, 마켓에 평점을 제출 할 수 없음
iOS 인게임 리뷰 팝업을 지원하지 않는 OS나 Android 기기에서 해당 API를 호출하는 경우 기존 Hive SDK에서 제공하는 리뷰 팝업이 노출되며, 기존 리뷰 팝업의 노출 조건과 동일하다.
iOS 인게임 리뷰 팝업 표시하기
- iOS 인게임 리뷰 팝업 스크린샷
-
예제 코드
Unity®1hive.Promotion.showNativeReview();C++1Promotion::showNativeReview();Android1Promotion.showNativeReview();iOS1[HIVEPromotion showNativeReview];
프로모션 정보 조회
Hive 프로모션 웹 뷰의 UI를 게임 UI의 컨셉에 맞추기 위해서 프로모션 웹 뷰를 게임에서 직접 구현 할 수 있다.
HivePromotion_Info API를 이용하면 Hive SDK 의 프로모션 웹 뷰가 표시하는 데이터를 게임에서 받아 볼 수 있다.
프로모션 배지 정보
프로모션 배지는 유저에게 새로운 프로모션 내용이 등록 되었음을 알려주기 위해서 게임의 버튼 UI를 부각하는 정보이다. 프로모션 배지 기능은 다음과 같다.
- 새 글이 등록되고, 노출이 시작되면 해당 정보를 게임 클라이언트에게 전달해서 유저에게 알림
- Hive 프로모션의 기능인 메인 배너, 커스텀 웹 뷰, 커스텀 보드, 공지사항 아이콘에 적용 가능
- 새 글의 유무만 게임 클라이언트에 전달하므로 배지 노출은 게임에서 구현해야 함
적용 예시 화면
게임에서 프로모션 배지 UI 구현 가이드
- Hive SDK에서 새글 ON / OFF 정보를 전달하면 해당 정보로 게임에서 배지를 노출할 수 있음
- 노출된 배지는 유저가 아이콘을 클릭하면 제거되도록 게임 내부 구현 필요
- 유저가 아이콘을 클릭하지 않더라도 다음 기간동안 지속
- 새소식(24시간), 커스텀 웹 뷰(지속 시간 임의 설정 가능), 커스텀 보드(30일), 공지사항(30일) 지속 노출 후 자동 제거 됨
프로모션 부가 정보
프로모션 뷰의 특정 이벤트 페이지를 노출하거나 프로모션 서버에 부가 정보를 전달하고 싶을 때 SetAdditionalInfo API를 이용하여 JSON 포맷의 문자열을 설정할 수 있다.
C2SModuleHivePromotion_Show
Hive SDK v1.12.0 에 추가된 API
Hive 프로모션 뷰를 출력 한다.
open과 close 각각에 따라 콜백이 돌아온다.
새소식 페이지를 노출 하기 전에 현재 데이터를 업데이트 하는 API를 호출해주어야한다. 새소식 데이터 갱신 API 추가하기 (1.19.0+)
argument name | type | desc | platform | 비고 |
---|---|---|---|---|
type | string | “news”: 뉴스 배너를 출력한다. “banner”: 대배너를 출력한다. “notice”: 공지 페이지만 출력한다. “customView”: 사용자 정의 페이지 “customBoard”: 사용자 정의 보드 “spot”: 스팟 배너를 출력한다. “direct”: 다이렉트 페이지를 출력한다. “offerwall”: 오퍼월 페이지를 출력한다. “review”: 리뷰 팝업을 출력한다. 리뷰는 “나중에 하러가기”를 하지 않는 이상 한 번만 노출된다. “moreGames”: 종료(더 많은 게임보기) 팝업 (Android Only) “reviewEx”: Android 또는 iOS의 별점 팝업을 출력하거나(v1.19.1+) Hive 리뷰 팝업을 출력한다(v1.16.0~1.19.0). |
all | “reviewEx” (v1.16.0+) |
type = news / banner / notice 일 때 | ||||
forced | bool | type이 “news”, “banner”, “notice” 일 때만 동작
true일 경우 24시간 다시보지 않기를 무시한다. false이거나 생략할 경우 24시간 안보기가 정상동작한다. |
all | |
type = customView / customBoard / spot / direct 일 때 | ||||
contentKey | string | (필수) type이 “customView”, “customBoard”, “spot”, “direct” 일 때
백오피스 캠페인 설정에서 등록한 페이지에 맞는 값을 추가한다. customView, customBoard – (커스텀 ID) |
all |
Result – Api.HivePromotion_Show
페이지가 열리고 닫히는 것에 따라 각각 콜백이 돌아온다.
argument name | type | desc | platform | 비고 |
---|---|---|---|---|
type | string | 호출 타입 | all | |
state | string | 호출한 페이지의 상태를 표시한다. open: 창이 열린 상태 close: 창이 닫힌 상태 goback: 스키마를 이용해 창이 닫힌 상태 |
all | 1.18.3+ |
C2SModuleHivePromotion_Info
Hive SDK v1.12.0 에 추가된 API
뱃지 정보 또는 뷰의 정보를 얻어 온다.
뱃지 정보를 통해 버튼에 new를 표시 할 수 있으며 필요에 따라 뷰 정보를 이용하여 개발사 자체 뷰를 구성 시 데이터를 사용할 수 있다.
argument type | type | desc | platform | 비고 |
---|---|---|---|---|
type | string | “badge” : 모든 설정된 뷰의 new 뱃지 정보 요청 “customView” : contentKey의 커스텀 뷰 정보를 요청 “customBoard” : contentKey의 커스텀 보드 정보를 요청 “spot” : contentKey의 스팟 정보를 요청 “direct” : contentKey의 다이렉트 페이지 정보를 요청 |
all | |
type = customView / customBoard / spot / direct 일 때 | ||||
contentKey | string | (필수) type이 “customView”, “customBoard”, “spot”, “direct” 일 때 백오피스 캠페인 설정에서 등록한 페이지에 맞는 값을 추가한다. (ex. 커스텀ID를 “121212”로 설정했다면 “121212”) customView, customBoard – (커스텀 ID) spot – (스팟 ID) direct – (등록된 캠페인 번호) |
all |
Result – Api.Promotion_Info
뱃지 또는 뷰의 정보를 받는다.
argument type | type | desc | platform | 비고 |
---|---|---|---|---|
뱃지 정보를 요청했을 경우 (type == “badge”) | ||||
type | string | “badge” | all | |
data | dictionary | 뱃지 데이터
target : 뱃지를 표시해줘야 하는 타겟. (NEWS, NOTICE, CUSTOMVIEW, CUSTOMBOARD가 올 수 있다.) |
all | |
뷰 정보를 요청 했을 경우 ( type == “customView”/”customBoard”/”spot”/”direct”) | ||||
type | string | “customView” : contentKey의 커스텀 뷰 정보를 요청 “customBoard” : contentKey의 커스텀 보드 정보를 요청 “spot” : contentKey의 스팟 정보를 요청 “direct” : contentKey의 다이렉트 페이지 정보를 요청 |
all | |
data | string | 요청한 뷰의 정보가 담겨있는 json 정보 | all |
data json
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 |
[data] : ( "{ "url":"https://promotion.qpyou.cn/custom/view", "postString": "{"promotion": { "forced":"on", "type_webview":"custom_view", "pid":203231, "content_key":"310000" }, "user": { "world":"kr", "device_country":"US", "hive_country":"KR", "uid":"", "mac":"02:00:00:00:00:00", "mcc":"450", "width":375, "server_id":"kr", "vid":"105129857", "language":"ko", "did":"227217605", "height":667, "timezone":null, "os_version":"8.1.1", "game_language":"ko", "country":"KR", "device":"iPhone7,2" }, "game": { "app_version":"1.12.0", "appid":"com.com2us.misample.normal.freefull.apple.global.ios.universal", "lib_version":"4.0.0", "additionalinfo":"" } }" }" ) |
C2SModuleHivePromotion_SetAdditionalInfo
Hive SDK v1.12.0 에 추가된 API
프로모션 뷰의 특정 이벤트 페이지를 노출하거나 프로모션 서버에 부가 정보를 전달하고 싶을 때 JSON 포맷의 문자열을 설정할 수 있다.
argument name | type | desc | platform | 비고 |
---|---|---|---|---|
additionalInfo | string | 프로모션 뷰의 특정 이벤트 페이지를 노출하거나 프로모션 서버에 부가 정보를 전달하고 싶을 때 JSON 포맷의 문자열을 설정할 수 있다.
프로모션 부가 정보는 JSON 포맷을 사용한다. 서버군이 따로 없는 단일 서버군이라도 아래 예제대로 넣어야 함 mq_redirect : 프로모션 캠페인 번호 (ex. “1234”) |
all |
Return
성공 실패를 YES/NO로 리턴한다.
C2SModuleHivePromotion_GetOfferwallState
Hive SDK v1.12.0 에 추가된 API
현재 앱의 오퍼월 노출 가능 여부에 대한 값을 요청한다.
argument name | type | desc | platform | 비고 |
---|---|---|---|---|
argument 없음 | all |
Result – Api.HivePromotion_GetOfferwallState
현재 앱의 오퍼월 노출 가능 여부
argument type | type | desc | platform | 비고 |
---|---|---|---|---|
offerwallState | int | -14: offerwall Activation -15: offerwall Deactivation |
all |
샘플 코드
public static bool C2SModule.HivePromotion.Show(C2SModule.Parameter arg, out C2SModule.Error error,
C2SModule.CompletionHandler completionHandler);
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 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
[배너(대배너) 노출] C2SModule.Parameter arg = new C2SModule.Parameter (); arg ["type"] = "banner"; C2SModule.Error error; if(!C2SModule.HivePromotion.Show (arg, out error)){ // Error 시 처리 } [뉴스 노출] C2SModule.Parameter arg = new C2SModule.Parameter (); arg ["type"] = "news"; C2SModule.Error error; if(!C2SModule.HivePromotion.Show (arg, out error)){ // Error 시 처리 } [공지사항 노출] C2SModule.Parameter arg = new C2SModule.Parameter (); arg ["type"] = "notice"; C2SModule.Error error; if(!C2SModule.HivePromotion.Show (arg, out error)){ // Error 시 처리 } [커스텀뷰 노출] C2SModule.Parameter arg = new C2SModule.Parameter (); arg ["type"] = "customView"; arg ["contentKey"] = "111001"; // 백오피스에 등록된 콘텐츠 키 C2SModule.Error error; if(!C2SModule.HivePromotion.Show (arg, out error)){ // Error 시 처리 } [커스텀보드 노출] C2SModule.Parameter arg = new C2SModule.Parameter (); arg ["type"] = "customBoard"; arg ["contentKey"] = "111002"; // 백오피스에 등록된 콘텐츠 키 C2SModule.Error error; if(!C2SModule.HivePromotion.Show (arg, out error)){ // Error 시 처리 } [스팟배너 노출] C2SModule.Parameter arg = new C2SModule.Parameter (); arg ["type"] = "spot"; arg ["contentKey"] = "111003"; // 백오피스에 등록된 콘텐츠 키 C2SModule.Error error; if(!C2SModule.HivePromotion.Show (arg, out error)){ // Error 시 처리 } [다이렉트배너 노출] C2SModule.Parameter arg = new C2SModule.Parameter (); arg ["type"] = "direct"; arg ["contentKey"] = "111004"; // 백오피스에 등록된 콘텐츠 키 C2SModule.Error error; if(!C2SModule.HivePromotion.Show (arg, out error)){ // Error 시 처리 } [오퍼월 노출] C2SModule.Parameter arg = new C2SModule.Parameter (); arg ["type"] = "offerwall"; C2SModule.Error error; if(!C2SModule.HivePromotion.Show (arg, out error)){ // Error 시 처리 } [리뷰 팝업 호출] C2SModule.Parameter arg = new C2SModule.Parameter (); arg ["type"] = "review"; C2SModule.Error error; if(!C2SModule.HivePromotion.Show (arg, out error)){ // Error 시 처리 } [Android 또는 iOS의 별점 팝업 호출] C2SModule.Parameter arg = new C2SModule.Parameter(); arg ["type"] = "reviewEx"; C2SModule.Error error; if(!C2SModule.HivePromotion.Show (arg, out error)){ // Error 시 처리 } |
public static bool C2SModule.HivePromotion.Info(C2SModule.Parameter arg, out C2SModule.Error error,
C2SModule.CompletionHandler completionHandler);
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 |
[뱃지 정보] C2SModule.Parameter arg = new C2SModule.Parameter (); arg ["type"] = "badge"; C2SModule.Error error; if(!C2SModule.HivePromotion.Info (arg, out error)){ // Error 시 처리 } [커스텀뷰 정보] C2SModule.Parameter arg = new C2SModule.Parameter (); arg ["type"] = "customView"; arg ["contentKey"] =111001; // 백오피스에 등록된 컨텐츠 키 C2SModule.Error error; if(!C2SModule.HivePromotion.Info (arg, out error)){ // Error 시 처리 } [커스텀보드 정보] C2SModule.Parameter arg = new C2SModule.Parameter (); arg ["type"] = "customBoard"; arg ["contentKey"] =111002; // 백오피스에 등록된 컨텐츠 키 C2SModule.Error error; if(!C2SModule.HivePromotion.Info (arg, out error)){ // Error 시 처리 } [스팟배너 정보] C2SModule.Parameter arg = new C2SModule.Parameter (); arg ["type"] = "spot"; arg ["contentKey"] =111003; // 백오피스에 등록된 컨텐츠 키 C2SModule.Error error; if(!C2SModule.HivePromotion.Info (arg, out error)){ // Error 시 처리 } [다이렉트배너 정보] C2SModule.Parameter arg = new C2SModule.Parameter (); arg ["type"] = "direct"; arg ["contentKey"] =111004; // 백오피스에 등록된 컨텐츠 키 C2SModule.Error error; if(!C2SModule.HivePromotion.Info (arg, out error)){ // Error 시 처리 } |
public static bool C2SModule.HivePromotion.SetAdditionalInfo(C2SModule.Parameter arg, out C2SModule.Error error,
C2SModule.CompletionHandler completionHandler);
1 2 3 4 5 6 |
C2SModule.Parameter arg = new C2SModule.Parameter (); Dictionary<string, string=""> dic = new Dictionary<string, string="">(); dic.Add("server", "0"); dic.Add("character", "0"); C2SModule.Error error; if(!C2SModule.HivePromotion.SetAdditionalInfo (arg, out error)){ // Error 시 처리 } |
public static bool C2SModule.HivePromotion.GetOfferwallState(C2SModule.Parameter arg, out C2SModule.Error error,
C2SModule.CompletionHandler completionHandler);
1 2 3 |
C2SModule.Parameter arg = new C2SModule.Parameter (); C2SModule.Error error; if(!C2SModule.HivePromotion.GetOfferwallState (arg, out error)){ // Error 시 처리 } |
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 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
[배너(대배너) 노출] TSharedPtr arg = MakeShareable(new FJsonObject); arg->SetStringField(TEXT("type"), TEXT("banner")); FString OutputString; TSharedRef< TJsonWriter<TCHAR, TCondensedJsonPrintPolicy< TCHAR >> > Writer = TJsonWriterFactory<TCHAR, TCondensedJsonPrintPolicy< TCHAR >>::Create(&OutputString); FJsonSerializer::Serialize(arg.ToSharedRef(), Writer); FHiveSDKModule::Get().HiveSDKUEHivePromotion_Show(OutputString); [뉴스 노출] TSharedPtr arg = MakeShareable(new FJsonObject); arg->SetStringField(TEXT("type"), TEXT("news")); FString OutputString; TSharedRef< TJsonWriter<TCHAR, TCondensedJsonPrintPolicy< TCHAR >> > Writer = TJsonWriterFactory<TCHAR, TCondensedJsonPrintPolicy< TCHAR >>::Create(&OutputString); FJsonSerializer::Serialize(arg.ToSharedRef(), Writer); FHiveSDKModule::Get().HiveSDKUEHivePromotion_Show(OutputString); [공지사항 노출] TSharedPtr arg = MakeShareable(new FJsonObject); arg->SetStringField(TEXT("type"), TEXT("notice")); FString OutputString; TSharedRef< TJsonWriter<TCHAR, TCondensedJsonPrintPolicy< TCHAR >> > Writer = TJsonWriterFactory<TCHAR, TCondensedJsonPrintPolicy< TCHAR >>::Create(&OutputString); FJsonSerializer::Serialize(arg.ToSharedRef(), Writer); FHiveSDKModule::Get().HiveSDKUEHivePromotion_Show(OutputString); [커스텀뷰 노출] TSharedPtr arg = MakeShareable(new FJsonObject); arg->SetStringField(TEXT("type"), TEXT("customView")); arg->SetStringField(TEXT("contentKey"), TEXT("111001")); // 백오피스에 등록된 콘텐츠 키 FString OutputString; TSharedRef< TJsonWriter<TCHAR, TCondensedJsonPrintPolicy< TCHAR >> > Writer = TJsonWriterFactory<TCHAR, TCondensedJsonPrintPolicy< TCHAR >>::Create(&OutputString); FJsonSerializer::Serialize(arg.ToSharedRef(), Writer); FHiveSDKModule::Get().HiveSDKUEHivePromotion_Show(OutputString); [커스텀보드 노출] TSharedPtr arg = MakeShareable(new FJsonObject); arg->SetStringField(TEXT("type"), TEXT("customBoard")); arg->SetStringField(TEXT("contentKey"), TEXT("111002")); // 백오피스에 등록된 콘텐츠 키 FString OutputString; TSharedRef< TJsonWriter<TCHAR, TCondensedJsonPrintPolicy< TCHAR >> > Writer = TJsonWriterFactory<TCHAR, TCondensedJsonPrintPolicy< TCHAR >>::Create(&OutputString); FJsonSerializer::Serialize(arg.ToSharedRef(), Writer); FHiveSDKModule::Get().HiveSDKUEHivePromotion_Show(OutputString); [스팟배너 노출] TSharedPtr arg = MakeShareable(new FJsonObject); arg->SetStringField(TEXT("type"), TEXT("spot")); arg->SetStringField(TEXT("contentKey"), TEXT("111003")); // 백오피스에 등록된 콘텐츠 키 FString OutputString; TSharedRef< TJsonWriter<TCHAR, TCondensedJsonPrintPolicy< TCHAR >> > Writer = TJsonWriterFactory<TCHAR, TCondensedJsonPrintPolicy< TCHAR >>::Create(&OutputString); FJsonSerializer::Serialize(arg.ToSharedRef(), Writer); FHiveSDKModule::Get().HiveSDKUEHivePromotion_Show(OutputString); [다이렉트배너 노출] TSharedPtr arg = MakeShareable(new FJsonObject); arg->SetStringField(TEXT("type"), TEXT("direct")); arg->SetStringField(TEXT("contentKey"), TEXT("111004")); // 백오피스에 등록된 콘텐츠 키 FString OutputString; TSharedRef< TJsonWriter<TCHAR, TCondensedJsonPrintPolicy< TCHAR >> > Writer = TJsonWriterFactory<TCHAR, TCondensedJsonPrintPolicy< TCHAR >>::Create(&OutputString); FJsonSerializer::Serialize(arg.ToSharedRef(), Writer); FHiveSDKModule::Get().HiveSDKUEHivePromotion_Show(OutputString); [오퍼월 노출] TSharedPtr arg = MakeShareable(new FJsonObject); arg->SetStringField(TEXT("type"), TEXT("offerwall")); FString OutputString; TSharedRef< TJsonWriter<TCHAR, TCondensedJsonPrintPolicy< TCHAR >> > Writer = TJsonWriterFactory<TCHAR, TCondensedJsonPrintPolicy< TCHAR >>::Create(&OutputString); FJsonSerializer::Serialize(arg.ToSharedRef(), Writer); FHiveSDKModule::Get().HiveSDKUEHivePromotion_Show(OutputString); [리뷰팝업 노출] TSharedPtr arg = MakeShareable(new FJsonObject); arg->SetStringField(TEXT("type"), TEXT("review")); FString OutputString;TSharedRef< TJsonWriter<TCHAR, TCondensedJsonPrintPolicy< TCHAR >> > Writer = TJsonWriterFactory<TCHAR, TCondensedJsonPrintPolicy< TCHAR >>::Create(&OutputString);FJsonSerializer::Serialize(arg.ToSharedRef(), Writer);FHiveSDKModule::Get().HiveSDKUEHivePromotion_Show(OutputString); |
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 |
[뱃지 정보] TSharedPtr arg = MakeShareable(new FJsonObject); arg->SetStringField(TEXT("type"), TEXT("badge")); FString OutputString;TSharedRef< TJsonWriter<TCHAR, TCondensedJsonPrintPolicy< TCHAR >> > Writer = TJsonWriterFactory<TCHAR, TCondensedJsonPrintPolicy< TCHAR >>::Create(&OutputString);FJsonSerializer::Serialize(arg.ToSharedRef(), Writer);FHiveSDKModule::Get().HiveSDKUEHivePromotion_Info(OutputString); [커스텀뷰 정보] TSharedPtr arg = MakeShareable(new FJsonObject); arg->SetStringField(TEXT("type"), TEXT("customView")); arg->SetSTringField(TEXT("contentKey"), TEXT("111001")); // 백오피스에 등록된 콘텐츠 키 FString OutputString;TSharedRef< TJsonWriter<TCHAR, TCondensedJsonPrintPolicy< TCHAR >> > Writer = TJsonWriterFactory<TCHAR, TCondensedJsonPrintPolicy< TCHAR >>::Create(&OutputString);FJsonSerializer::Serialize(arg.ToSharedRef(), Writer);FHiveSDKModule::Get().HiveSDKUEHivePromotion_Info(OutputString); [커스텀보드 정보] TSharedPtr arg = MakeShareable(new FJsonObject); arg->SetStringField(TEXT("type"), TEXT("customBoard")); arg->SetSTringField(TEXT("contentKey"), TEXT("111002")); // 백오피스에 등록된 콘텐츠 키 FString OutputString;TSharedRef< TJsonWriter<TCHAR, TCondensedJsonPrintPolicy< TCHAR >> > Writer = TJsonWriterFactory<TCHAR, TCondensedJsonPrintPolicy< TCHAR >>::Create(&OutputString);FJsonSerializer::Serialize(arg.ToSharedRef(), Writer);FHiveSDKModule::Get().HiveSDKUEHivePromotion_Info(OutputString); [스팟배너 정보] TSharedPtr arg = MakeShareable(new FJsonObject); arg->SetStringField(TEXT("type"), TEXT("spot")); arg->SetSTringField(TEXT("contentKey"), TEXT("111003")); // 백오피스에 등록된 콘텐츠 키 FString OutputString;TSharedRef< TJsonWriter<TCHAR, TCondensedJsonPrintPolicy< TCHAR >> > Writer = TJsonWriterFactory<TCHAR, TCondensedJsonPrintPolicy< TCHAR >>::Create(&OutputString);FJsonSerializer::Serialize(arg.ToSharedRef(), Writer);FHiveSDKModule::Get().HiveSDKUEHivePromotion_Info(OutputString); [다이렉트배너 정보] TSharedPtr arg = MakeShareable(new FJsonObject); arg->SetStringField(TEXT("type"), TEXT("direct")); arg->SetSTringField(TEXT("contentKey"), TEXT("111004")); // 백오피스에 등록된 콘텐츠 키 FString OutputString;TSharedRef< TJsonWriter<TCHAR, TCondensedJsonPrintPolicy< TCHAR >> > Writer = TJsonWriterFactory<TCHAR, TCondensedJsonPrintPolicy< TCHAR >>::Create(&OutputString);FJsonSerializer::Serialize(arg.ToSharedRef(), Writer);FHiveSDKModule::Get().HiveSDKUEHivePromotion_Info(OutputString); [result delegate] void MYGAMECLASS::ResultDelegate(C2SModuleApi api, const char* json, C2SModuleErrorCode code, const char* message) { switch(api) { case C2SModuleApi_HivePromotionInfo: { // ... } } } |
1 2 3 4 |
TSharedPtr arg = MakeShareable(new FJsonObject); TSharedPtr argAddInfo = MakeShareable(new FJsonObject);argAddInfo->SetStringField(TEXT("server"), TEXT("0")); // 입력(필수) - default "0"argAddInfo->SetStringField(TEXT("character"), TEXT("0")); // 입력(필수) - default "0"FString argAddInfoTXT;TSharedRef< TJsonWriter<TCHAR, TCondensedJsonPrintPolicy< TCHAR >> > WriterAddInfo = TJsonWriterFactory<TCHAR, TCondensedJsonPrintPolicy< TCHAR >>::Create(&argAddInfoTXT);FJsonSerializer::Serialize(argAddInfo.ToSharedRef(), WriterAddInfo);arg->SetStringField(TEXT("additionalInfo"),argAddInfoTXT);FString OutputString;TSharedRef< TJsonWriter<TCHAR, TCondensedJsonPrintPolicy< TCHAR >> > Writer = TJsonWriterFactory<TCHAR, TCondensedJsonPrintPolicy< TCHAR >>::Create(&OutputString);FJsonSerializer::Serialize(arg.ToSharedRef(), Writer);FHiveSDKModule::Get().HiveSDKUEHivePromotion_SetAdditionalInfo(OutputString); |
1 2 3 4 |
TSharedPtr arg = MakeShareable(new FJsonObject); FString OutputString;TSharedRef< TJsonWriter<TCHAR, TCondensedJsonPrintPolicy< TCHAR >> > Writer = TJsonWriterFactory<TCHAR, TCondensedJsonPrintPolicy< TCHAR >>::Create(&OutputString);FJsonSerializer::Serialize(arg.ToSharedRef(), Writer);FHiveSDKModule::Get().HiveSDKUEHivePromotion_GetOfferwallState(OutputString); |
+(BOOL)Show:(id)arg error:(NSError**)error completionHandler:(void(^)(NSDictionary *, NSError*))
completionHandler;
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 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
[배너(대배너) 노출] NSError* error; [C2SModuleHivePromotion Show:@{@"type":@"banner"} error:&error completionHandler:^(NSDictionary* resultArg, NSError* resultError) { if (resultError == nil) { //succeed } }]; [뉴스 노출] NSError* error; [C2SModuleHivePromotion Show:@{@"type":@"news"} error:&error completionHandler:^(NSDictionary* resultArg, NSError* resultError) { if (resultError == nil) { //succeed } }]; [공지사항 노출] NSError* error; [C2SModuleHivePromotion Show:@{@"type":@"notice"} error:&error completionHandler:^(NSDictionary* resultArg, NSError* resultError) { if (resultError == nil) { //succeed } }]; [커스텀뷰 노출] NSError* error; // contentKey : 백오피스에 등록된 콘텐츠 키 [C2SModuleHivePromotion Show:@{@"type":@"customView",@"contentKey":@"111001"} error:&error completionHandler:^(NSDictionary* resultArg, NSError* resultError) { if (resultError == nil) { //succeed } }]; [커스텀보드 노출] NSError* error; // contentKey : 백오피스에 등록된 콘텐츠 키 [C2SModuleHivePromotion Show:@{@"type":@"customBoard",@"contentKey":@"111002"} error:&error completionHandler:^(NSDictionary* resultArg, NSError* resultError) { if (resultError == nil) { //succeed } }]; [스팟배너 노출] NSError* error; // contentKey : 백오피스에 등록된 콘텐츠 키 [C2SModuleHivePromotion Show:@{@"type":@"spot",@"contentKey":@"111003"} error:&error completionHandler:^(NSDictionary* resultArg, NSError* resultError) { if (resultError == nil) { //succeed } }]; [다이렉트배너 노출] NSError* error; // contentKey : 백오피스에 등록된 콘텐츠 키 [C2SModuleHivePromotion Show:@{@"type":@"direct",@"contentKey":@"111004"} error:&error completionHandler:^(NSDictionary* resultArg, NSError* resultError) { if (resultError == nil) { //succeed } }]; [오퍼월 노출] NSError* error; [C2SModuleHivePromotion Show:@{@"type":@"offerwall"} error:&error completionHandler:^(NSDictionary* resultArg, NSError* resultError) { if (resultError == nil) { //succeed } }]; [리뷰 팝업 노출] NSError* error; [C2SModuleHivePromotion Show:@{@"type":@"review"} error:&error completionHandler:^(NSDictionary* resultArg, NSError* resultError) { if (resultError == nil) { //succeed } }]; [Android 또는 iOS의 별점 팝업 호출] NSError* error; [C2SModuleHivePromotion Show:@{@"type":@"reviewEx"} error:&error completionHandler:^(NSDictionary* resultArg, NSError* resultError) { if (resultError == nil) { //succeed } }]; |
+(BOOL)Show:(id)arg error:(NSError**)error completionHandler:(void(^)(NSDictionary *, NSError*))
completionHandler;
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 |
[뱃지 정보] NSError* error; [C2SModuleHivePromotion Info:@{@"type":@"badge"} error:&error completionHandler:^(NSDictionary* resultArg, NSError* resultError) { if (resultError == nil) { //succeed } }]; [커스텀뷰 정보] NSError* error; // contentKey : 백오피스에 등록된 콘텐츠 키 [C2SModuleHivePromotion Info:@{@"type":@"customView",@"contentKey":@"111001"} error:&error completionHandler:^(NSDictionary* resultArg, NSError* resultError) { if (resultError == nil) { //succeed } }]; [커스텀보드 정보] NSError* error; // contentKey : 백오피스에 등록된 콘텐츠 키 [C2SModuleHivePromotion Info:@{@"type":@"customBoard",@"contentKey":@"111002"} error:&error completionHandler:^(NSDictionary* resultArg, NSError* resultError) { if (resultError == nil) { //succeed } }]; [스팟배너 정보] NSError* error; // contentKey : 백오피스에 등록된 콘텐츠 키 [C2SModuleHivePromotion Info:@{@"type":@"spot",@"contentKey":@"111003"} error:&error completionHandler:^(NSDictionary* resultArg, NSError* resultError) { if (resultError == nil) { //succeed } }]; [다이렉트배너 정보] NSError* error; // contentKey : 백오피스에 등록된 콘텐츠 키 [C2SModuleHivePromotion Info:@{@"type":@"direct",@"contentKey":@"111004"} error:&error completionHandler:^(NSDictionary* resultArg, NSError* resultError) { if (resultError == nil) { //succeed } }]; |
+(BOOL)Show:(id)arg error:(NSError**)error completionHandler:(void(^)(NSDictionary *, NSError*))
completionHandler;
1 2 3 4 5 6 7 8 9 10 11 12 |
NSError* error; NSDictionary* dictionary = @{@"server":@"0",@"character":@"0"}; NSData* dictionary_data = [NSJSONSerialization dataWithJSONObject:dictionary options:NSJSONWritingPrettyPrinted error:nil]; NSString* addInfo = [[NSString alloc] initWithData:dictionary_data encoding:NSUTF8StringEncoding]; [C2SModuleHivePromotion SetAdditionalInfo:@{@"additionalInfo":addInfo} error:&error completionHandler:^(NSDictionary* resultArg, NSError* resultError) { if (resultError == nil) { //succeed } }]; |
+(BOOL)Show:(id)arg error:(NSError**)error completionHandler:(void(^)(NSDictionary *, NSError*))
1 2 3 4 5 6 7 |
NSError* error; [C2SModuleHivePromotion GetOfferwallState:nil error:&error completionHandler:^(NSDictionary* resultArg, NSError* resultError) { if (resultError == nil) { //succeed } }]; |
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 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
[배너(대배너) 노출] Json::Value arg; arg["type"] = "banner"; Json::FastWriter writer; std::string strJSON = writer.write(arg); C2SModule_Cocos2dx::C2SModuleError error; if( ::C2SModuleHivePromotion_Show( strJSON.c_str(), &error ) == false ) { CCLog( "====>>>> HivePromotion_Show error (%s)", error.get()->GetMessage() ); } [뉴스 노출] Json::Value arg; arg["type"] = "news"; Json::FastWriter writer; std::string strJSON = writer.write(arg); C2SModule_Cocos2dx::C2SModuleError error; if( ::C2SModuleHivePromotion_Show( strJSON.c_str(), &error ) == false ) { CCLog( "====>>>> HivePromotion_Show error (%s)", error.get()->GetMessage() ); } [공지사항 노출] Json::Value arg; arg["type"] = "notice"; Json::FastWriter writer; std::string strJSON = writer.write(arg); C2SModule_Cocos2dx::C2SModuleError error; if( ::C2SModuleHivePromotion_Show( strJSON.c_str(), &error ) == false ) { CCLog( "====>>>> HivePromotion_Show error (%s)", error.get()->GetMessage() ); } [커스텀뷰 노출] Json::Value arg; arg["type"] = "customView"; arg["contentKey"] = "111001"; // 백오피스에 등록된 콘텐츠 키 Json::FastWriter writer; std::string strJSON = writer.write(arg); C2SModule_Cocos2dx::C2SModuleError error; if( ::C2SModuleHivePromotion_Show( strJSON.c_str(), &error ) == false ) { CCLog( "====>>>> HivePromotion_Show error (%s)", error.get()->GetMessage() ); } [커스텀보드 노출] Json::Value arg; arg["type"] = "customBoard"; arg["contentKey"] = "111002"; // 백오피스에 등록된 콘텐츠 키 Json::FastWriter writer; std::string strJSON = writer.write(arg); C2SModule_Cocos2dx::C2SModuleError error; if( ::C2SModuleHivePromotion_Show( strJSON.c_str(), &error ) == false ) { CCLog( "====>>>> HivePromotion_Show error (%s)", error.get()->GetMessage() ); } [스팟배너 노출] Json::Value arg; arg["type"] = "spot"; arg["contentKey"] = "111003"; // 백오피스에 등록된 콘텐츠 키 Json::FastWriter writer; std::string strJSON = writer.write(arg); C2SModule_Cocos2dx::C2SModuleError error; if( ::C2SModuleHivePromotion_Show( strJSON.c_str(), &error ) == false ) { CCLog( "====>>>> HivePromotion_Show error (%s)", error.get()->GetMessage() ); } [다이렉트배너 노출] Json::Value arg; arg["type"] = "direct"; arg["contentKey"] = "111004"; // 백오피스에 등록된 콘텐츠 키 Json::FastWriter writer; std::string strJSON = writer.write(arg); C2SModule_Cocos2dx::C2SModuleError error; if( ::C2SModuleHivePromotion_Show( strJSON.c_str(), &error ) == false ) { CCLog( "====>>>> HivePromotion_Show error (%s)", error.get()->GetMessage() ); } [오퍼월 노출] Json::Value arg; arg["type"] = "offerwall"; Json::FastWriter writer; std::string strJSON = writer.write(arg); C2SModule_Cocos2dx::C2SModuleError error; if( ::C2SModuleHivePromotion_Show( strJSON.c_str(), &error ) == false ) { CCLog( "====>>>> HivePromotion_Show error (%s)", error.get()->GetMessage() ); } [리뷰 팝업 호출] Json::Value arg; arg["type"] = "review"; Json::FastWriter writer; std::string strJSON = writer.write(arg); C2SModule_Cocos2dx::C2SModuleError error; if( ::C2SModuleHivePromotion_Show( strJSON.c_str(), &error ) == false ) { CCLog( "====>>>> HivePromotion_Show error (%s)", error.get()->GetMessage() ); } [Android 또는 iOS의 별점 팝업 호출] Json::Value arg; arg["type"] = "reviewEx"; Json::FastWriter writer; std::string strJSON = writer.write(arg); C2SModule_Cocos2dx::C2SModuleError error; if( ::C2SModuleHivePromotion_Show( strJSON.c_str(), &error ) == false ) { CCLog( "====>>>> HivePromotion_Show error (%s)", error.get()->GetMessage() ); } |
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 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
[뱃지 정보] Json::Value arg; arg["type"] = "badge"; Json::StyledWriter writer; std::string strJSON = writer.write(arg); C2SModule_Cocos2dx::C2SModuleError error; if( ::C2SModuleHivePromotion_Info( strJSON.c_str(), &error ) == false ) { CCLog( "====>>>> HivePromotion_Info error (%s)", error.get()->GetMessage() ); } [커스텀뷰 정보] Json::Value arg; arg["type"] = "customView"; arg["contentKey"] = "111001"; // 백오피스에 등록된 콘텐츠 키 Json::StyledWriter writer; std::string strJSON = writer.write(arg); C2SModule_Cocos2dx::C2SModuleError error; if( ::C2SModuleHivePromotion_Info( strJSON.c_str(), &error ) == false ) { CCLog( "====>>>> HivePromotion_Info error (%s)", error.get()->GetMessage() ); } [커스텀보드 정보] Json::Value arg; arg["type"] = "customBoard"; arg["contentKey"] = "111002"; // 백오피스에 등록된 콘텐츠 키 Json::StyledWriter writer; std::string strJSON = writer.write(arg); C2SModule_Cocos2dx::C2SModuleError error; if( ::C2SModuleHivePromotion_Info( strJSON.c_str(), &error ) == false ) { CCLog( "====>>>> HivePromotion_Info error (%s)", error.get()->GetMessage() ); } [스팟배너 정보] Json::Value arg; arg["type"] = "spot"; arg["contentKey"] = "111003"; // 백오피스에 등록된 콘텐츠 키 Json::StyledWriter writer; std::string strJSON = writer.write(arg); C2SModule_Cocos2dx::C2SModuleError error; if( ::C2SModuleHivePromotion_Info( strJSON.c_str(), &error ) == false ) { CCLog( "====>>>> HivePromotion_Info error (%s)", error.get()->GetMessage() ); } [다이렉트배너 정보] Json::Value arg; arg["type"] = "direct"; arg["contentKey"] = "111004"; // 백오피스에 등록된 콘텐츠 키 Json::StyledWriter writer; std::string strJSON = writer.write(arg); C2SModule_Cocos2dx::C2SModuleError error; if( ::C2SModuleHivePromotion_Info( strJSON.c_str(), &error ) == false ) { CCLog( "====>>>> HivePromotion_Info error (%s)", error.get()->GetMessage() ); } [result delegate] void SampleProject::ResultDelegate(C2SModuleApi api, const char* json, C2SModuleErrorCode code, const char* message) { switch(api) { case C2SModuleApi_HivePromotionInfo: { // ... } } } |
1 2 3 4 5 6 7 8 9 10 11 |
Json::Value arg; Json::Value argAddInfo; Json::StyledWriter writer; argAddInfo["server"] = "0"; argAddInfo["character"] = "0"; arg["addtionalInfo"] = writer.write(argAddInfo); std::string strJSON = writer.write(arg); C2SModule_Cocos2dx::C2SModuleError error; if( ::C2SModuleHivePromotion_SetAdditionalInfo( strJSON.c_str(), &error ) == false ) { CCLog( "====>>>> HivePromotion_SetAdditionalInfo error (%s)", error.get()->GetMessage() ); } |
1 2 3 4 5 6 7 |
Json::Value arg; Json::StyledWriter writer; std::string strJSON = writer.write(arg); C2SModule_Cocos2dx::C2SModuleError error; if( ::C2SModuleHivePromotion_GetOfferwallState( strJSON.c_str(), &error ) == false ) { CCLog( "====>>>> HivePromotion_GetOfferwallState error (%s)", error.get()->GetMessage() ); } |
프로모션에 동영상 광고 도입하기
Hive SDK v1.14.0부터 YouTubeAndroidPlayerApi.jar 라이브러리를 이용해 동영상 광고 추가가 가능하다. 프로모션 도중 유저가 동영상 재생 링크를 선택하면 영상이 전체 화면으로 노출된다. 이를 위해 게임에서는 영상 시작 전 게임 음량을 최소화하거나 음소거하는 코드를 추가하고, 영상이 종료된 이후에는 원래 음량으로 되돌리는 작업을 진행해야 한다.
Hive SDK v1.17.0에서는 확장된 YouTube 기능을 사용할 수 있도록 개선되었다. YouTubeAndroidWebPlayerApi.aar 라이브러리를 이용하면 개선된 기능을 여러분의 게임에 적용시킬 수 있다.
- 영상 시작 전후 상태는 C2SModuleApi_HivePromotionPlayback 전역 콜백으로 전달된다.
- 영상 시작 시 – “state”:”start”
- 영상 종료 시 – “state”:”finish”
- iOS Xcode 필수 프레임워크에 WebKit.framework 추가.
프로모션에 동영상 광고를 추가하는 예제코드는 다음과 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
static void ResultDelegate(Api api, Parameter arg, Error error) { switch(api) { case Api.HivePromotion_Playback:{ if(arg.ContainsKey("state")) { string state = arg["state"] as string; if(state.Equals("start")) { // 게임 사운드 멈춤 } else if(state.Equals("finish")) { // 게임 사운드 재생 } } break; } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
void MYGAMECLASS::ResultDelegate(C2SModule api, const char* json, C2SModuleErrorCode code, const char* message) { switch(api) { case C2SModule_HivePromotionPlayback: { if( FJsonSerializer::Deserialize(reader, arg) == false) { // json 파싱 실패 return; } if( arg->HasField(TEXT("state") ) ) { FString state = arg->GetStringField(TEXT("state")); if(!state.IsEmpty() && state.Compar("start") == 0) { // 게임 사운드 멈춤 } else if(!state.IsEmpty() && state.Compar("finish") == 0) { // 게임 사운드 재생 } } } break; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
void SampleProject::ResultDelegate(C2SModuleApi api, const char* json, C2SModuleErrorCode code, const char* message) { switch(api) { case C2SModuleApi_HivePromotionPlayback:{ if( reader.parse(json, arg) == false ) { CCLog("====>>>> parse failed : (%s)", json); return; } std::string state = arg.get("state", "").asString(); if(state == "start") { // 게임 사운드 멈춤 } else if(state == "finish") { // 게임 사운드 재생 } break; } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
-(void)C2SModuleResult : (C2SModuleApi)api parameter:(NSDictionary *)arg error:(NSError *)error{ if(error ==nil){ switch(api){ case C2SModuleApi_HivePromotionPlayback:{ if([arg[@"state"] isEqualToString: @"start"]){ // 게임 사운드 멈춤 } if([arg[@"state"] isEqualToString: @"finish"]){ // 게임 사운드 재생 } }break; } } } |