머큐리는 웹뷰를 통해 공지사항, 하우스 애드, 커스텀 웹뷰, 배지 이벤트 배너를 노출한다.
전체 공지사항 및 모듈 적용한 앱의 공지사항 노출
Hive 공지사항을 연동하여 머큐리를 적용한 앱 및 전체 게임을 대상으로 공지사항을 노출하고, 공지사항은 Hive 백오피스에서 관리한다.
웹 이벤트 및 크로스 프로모션 노출
머큐리를 적용한 앱에 한정된 이벤트나 전체 이벤트, 크로스 프로모션에 관련한 정보를 노출
추천 게임 노출
Hive 추천게임과 Hive에서 유저 다운로드 기록을 확인하여, 현재 유저가 다운받지 않은 게임을 추천
Hive의 추천게임은 우선순위가 있음
커스텀 웹뷰 & 뱃지
게임 내에서 외부 컨텐츠를 웹뷰로 노출
- 게임 내 별도 실행 버튼으로 외부 URL혹은 입력한 내용을 웹뷰로 노출 할 수 있는 머큐리 기능
다양하게 활용 가능한 게임 내 웹뷰 시스템
- 다국어 지원은 물론 한 게임에 여러 개의 웹뷰를 적용 할 수 있어 경우에 따라 다양한 활용이 가능
머큐리
UI
광고 이미지는 450×800, 800×450 크기로 제작하여 백오피스에 업로드한다.
(좌) Landscape (우) Portrait
(좌) Landscape (우) Portrait
Full Banner
Web Banner
웹 배너는 대배너 노출 시점에 이미지 배너가 아닌 웹 페이지를 노출하는 기능이다.
- URL 주소가 있는 웹 페이지는 모두 등록할 수 있다.
- 동영상이 포함된 웹 페이지의 경우, 동영상 플랫폼이 유튜브가 아니면 안정적인 재생을 보장할 수 없으므로 유튜브 사용을 권장한다.
- 유저가 동영상을 재생할 경우 영상이 전체 화면으로 노출된다. 이를 위해 게임에서는 영상 시작 전 게임 음량을 최소화하거나 음소거하는 코드를 추가하고, 영상이 종료된 이후에는 원래 음량으로 되돌리는 작업이 필요하다.
Notice와 Event의 차이
- Notice => Notice 상단, Event 배너 하단
- Event => Event 배너 상단, Notice 하단
머큐리 이벤트
mq_redirect를 사용하면 머큐리 이벤트 페이지를 바로 출력할 수 있다.
(addtionalInfo에 {“mq_redirect“:”이벤트 번호“} 를 적용하여 호출하면 백오피스에 등록된 머큐리 이벤트 페이지가 머큐리 메인페이지를 출력하지 않고 바로 해당 이벤트 페이지가 출력된다.)
(“header”:”on” 시 이벤트 페이지 )
ex)”addtionalInfo”:”{“server”:”서버 지역 코드값”,”character”:”0″, “mq_redirect”:”이벤트번호”}”
mq_redirect로 호출할 때, 2016/07/04일 이후 등록된 이벤트에 한해 “header”:”off”를 추가하면 이벤트 페이지 상단의 헤더가 나타나지 않는다.
(“header”:”off” 시 이벤트 페이지)
ex)”addtionalInfo”:”{“server”:”서버 지역 코드값”,”character”:”0″, “mq_redirect”:”이벤트번호”, “header”:”off”}”
- 머큐리 이벤트 페이지 연결 시 전달하는 데이터
key | 설명 | 비고 | ||
---|---|---|---|---|
uid | 유저 uid 또는 vid | |||
hash | 유저 (uid 또는 vid)를 검증하기 위한 암호화 데이터 | |||
did | 단말 고유 아이디 | |||
lang | 브라우저 언어(단말 설정 언어) | |||
go_back | 머큐리 내부 이동시 상단 “돌아가기” 링크 주소 | |||
title | 머큐리 내부 이동시 상단 타이틀 | |||
main | 머큐리 내부 이동시 상단 “돌아가기” 텍스트 | |||
eld | 이벤트 번호 | |||
addtionalinfo | 게임 클라이언트 추가 정보 전달 | 서버정보 등… |
- 머큐리는 다음의 정보를 가지고 있다.
-
AppID: (com.com2us.smon.~, com.gamevil.dragonblaze.~ 형태)
- 기본 언어: 영어
1. 머큐리 공지사항 노출 언어 결정 방식
조건 | 공지 Type | 머큐리 언어 공지 등록 여부 | Default 언어 공지 등록 여부 | 최종 노출 공지사항 언어 |
---|---|---|---|---|
조건1 | 게임공지 | O | — | 머큐리 언어 |
전체공지 | — | |||
조건2 | 게임공지 | X | O | Default 언어 |
전체공지 | — | — | ||
조건3 | 게임공지 | X | X | 머큐리 언어 |
전체공지 | O | — | ||
조건4 | 게임공지 | X | X | Default 언어 |
전체공지 | X | O | ||
조건5 | 게임공지 | X | X | NULL |
전체공지 | X | X |
예시)
해당 AppID에 등록된 공지 = 게임 공지
Hive 전체 공지, Com2uS 전체 공지, Gamevil 전체 공지 = 전체 공지
머큐리 언어 = 프랑스어, Default 언어 = 영어로 설정
1) 프랑스어로 등록된 게임 공지가 있는가? 프랑스어, 없으면 2) 로
2) 영어로 등록된 게임 공지가 있는가? 영어, 없으면 3) 로
3) 프랑스어로 등록된 전체 공지가 있는가? 프랑스어, 없으면 4) 로
4) 영어로 등록된 전체 공지가 있는가? 영어, 없으면 노출되는 공지사항 없음.
2. 머큐리 공지사항 리스트 순서 결정 방식
1) TOP 설정 ON인 게임 공지를 TOP 순에 따라 노출 (마지막에 TOP으로 설정된 공지사항이 최상단에
노출)
2) TOP 설정 ON인 전체 공지를 TOP 순에 따라
3) TOP 설정 OFF인 나머지 공지를 등록일에 따라 (등록일이 최신일수록 상단으로 노출)
리뷰 팝업
유저에게 마켓 리뷰(별점)를 유도하는 팝업
(16개국 언어를 지원하며 디폴트 언어는 영어)
게임 더보기 팝업
More games는 App종료 시 노출하게 하는 팝업으로 Hive 탑재
게임을 추천하며, ios는 정책 위반으로 Android만 지원
(16개국 언어를 지원하며 기본 언어는 영어)
Android 별점 리뷰 팝업 조건
Hive SDK v1.19.1 버전부터 Android 환경에서 게임을 이용하는 유저라면 게임 실행 중에 리뷰를 남길 수 있는 기능을 제공합니다. 기존 리뷰 팝업과 달리 마켓으로 이동하지 않아도 만족도 평가가 가능하며, 리뷰 요청에 응할 경우 작성 페이지로 즉시 이동합니다. 다음과 같이 Google에서 제공하는 정책에 따라 Android 별점 리뷰 팝업이 노출됩니다.
- 리뷰 팝업은 구글 내부 정책에 따라 노출 여부가 결정되며, 수동으로 노출 여부 변경이 불가능 합니다.
- Google Play 스토어가 설치되었으며 Android 5.0(API 수준 21) 이상을 실행하는 Android 기기에서 노출 가능합니다.
- 사용자 개인정보 보호를 강화하고 API 오용을 방지하기 위해, 구글 가이드내용에 따라 API 호출 권장 합니다.
- 개발 중인 빌드에서도 구글 내부 정책에 따라 노출 여부가 결정되며, 항상 노출을 위한 설정을 위해서는 해당 구글 가이드를 참고하세요.
Android 별점 리뷰 팝업 띄우기
Android 별점 리뷰 팝업을 띄우려면 C2SModulePromotion 클래스의 show()
메서드를 type 값 reviewEx
로 설정하여 호출하세요.
1 |
hive.Promotion.showNativeReview(); |
1 |
Promotion::showNativeReview(); |
1 |
Promotion.showNativeReview(); |
1 |
[HIVEPromotion showNativeReview]; |
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 인게임 리뷰 팝업 표시하기
Hive 웹
- PC & 모바일 웹
- 공지사항 내 Check 된 AppID 마켓이 Google 또는 Apple이 포함된 공지사항 + 전체공지 (Hive 전체 공지, 컴투스 전체 공지, 컴투스홀딩스 전체 공지)를 등록일 순으로 노출
- INGAME
- 해당 게임의 마켓 정보에 따라 공지사항 내 Check 된 AppID 마켓이 해당 게임 마켓과 동일한 공지사항 + Hive 전체 공지 + 해당 게임 회사 정보의 전체 공지를 등록일 순으로 노출
오퍼월
머큐리 함수 (C2SModulePromotion_Show)를 통해 오퍼월을 호출할 수 있다.
커스텀 웹뷰
커스텀 뷰는 다음과 같은 커스텀 기능을 제공한다.
- 게임 내 별도 실행 버튼으로 외부 URL 혹은 입력한 내용을 뷰로 노출할 수 있다.
- 한 게임에서 여러 개의 뷰를 적용 할 수 있어 경우에 따라 다양한 활용이 가능하다.
- 커스텀 뷰 UI는 콘솔에서 전체 화면과 프레임 두 가지 타입 중에 한 가지로 선택할 수 있으며, 원하는 색상으로 커스터마이징이 가능하다.
- 커스텀 뷰와 커스텀 보드는 콘솔에서 설정한 UI 타입으로 일괄 적용된다.
커스텀 보드
커스텀 보드는 게임별로 일반 공지 외 해당 게임 내에서만 노출할 수 있는 게시글을 노출하기 위해 만들어짐
게시글은 운영자가 등록한 글만 노출된다.
View는 머큐리 View를 사용
커스텀 보드 생성시 발급되는 커스텀 보드 key를 게임에서 사용한다.
배너 정보 API
Hive SDK v1.18.3부터 게임에서 배너를 원하는 규격으로 자유롭게 노출할 수 있도록 지원한다. Hive에서 제공하는 API가 배너 데이터를 가져오면, 게임에서는 제공받은 데이터를 활용하여 특정 위치에 배너를 표시할 수 있다. 배너 이미지 등록과 설정은 Hive 콘솔에서 진행하며 대배너/일반 배너 등록 방법과 동일하다. 배너 API를 호출하려면 인증 v1 또는 인증 v4를 반드시 초기화해야 하며, 초기화하지 않을 경우 데이터를 받아오는 과정에 문제가 발생할 수 있다. 데이터를 정상적으로 전달받았다면 API를 적용한 배너 클릭 시 전달받은 pid(Integer) 값을 C2SModulePromotion_Show API의 mq_redirect
에 추가하여 다이렉트 배너 커스텀 뷰 형태로 노출할 수도 있다.
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.Promotion.GetBannerInfo (arg, out error)) { // Error 처리 } static void ResultDelegate(Api api, Parameter arg, Error error) { switch(api) { case Api.Promotion_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( ::C2SModulePromotion_GetBannerInfo(strJSON.c_str(), &error) == false) { // Error 처리 } void SampleProject::ResultDelegate(C2SModuleApi api, const char* json, C2SModuleErrorCode code, const char* message) { switch(api) { case C2SModuleApi_PromotionGetBannerInfo: { // ... } } } |
1 2 3 4 5 6 7 8 9 10 |
NSError *error; NSDictionary* arg = @{@"campaignType":@"all", @"bannerType":@"great"}; [C2SModulePromotion GetBannerInfo:optionSelect error:&error completionHandler:^(NSDictionary* resultArg, NSError* resultError) { if (resultError == nil ) { // succeed } }]; |
도식도
C2SModulePromotion_Show
프로모션 뷰를 출력 한다. 또한 머큐리 이벤트 페이지를 출력할 수 있다.
(addtionalInfo에 {“mq_redirect”:”이벤트 번호”} 를 적용하여 호출하면 백오피스에 등록된 머큐리 이벤트 페이지가 머큐리 메인페이지를 출력하지 않고 바로 해당 이벤트 페이지가 출력된다.)
(mq_redirect로 호출할 때, 2016/07/04일 이후 등록된 이벤트에 한해 “header”:”off”를 추가하면 이벤트 페이지 상단의 헤더가 나타나지 않는다.)
additionalInfo에 필수로 서버 정보를 넣어야 한다.
(해당 서버 정보를 이용하여 각 서버군의 맞게 요청하는 랜딩페이지가 제작 된다.)
type = “review” 이면 콜백이 없다.
(참조) 백오피스 연동 – 머큐리
(참조) 백오피스 연동 – 오퍼월
(참조) 백오피스 연동 – 커스텀 웹뷰 & 뱃지
argument name | type | desc | platform | 비고 |
---|---|---|---|---|
type | string | “notice” : 공지 배너를 출력한다. “event”: 이벤트 배너를 출력한다. “fullBanner”: 대배너를 출력한다. “offerwall”: 오퍼월을 출력한다. “noticeOnly”: 머큐리 공지만 출력한다. “customWebview”: 백오피스에 등록된 사용자 정의 페이지 (커스텀 보드 : 200001~299999) (커스텀 웹뷰 : 300000~499999) “review”:리뷰 팝업을 출력한다. 리뷰는 “나중에 하러가기” 하지 않는 이상 한 번만 노출된다. “moreGames”:게임 더보기 팝업(android only) “reviewEx”: Android 또는 iOS의 별점 팝업을 출력하거나(v1.19.1+) Hive 리뷰 팝업을 출력한다.(v1.16.0~1.19.0) “fullBanner”: 대배너를 출력한다. (social_initialize API 호출 시 useImageBanner를 true로 설정했다면 이미지 기반의 대배너 출력, useImageBanner 설정값이 없거나 false라면 웹뷰 기반의 대배너 출력) “fullBannerLegacy”: 대배너를 출력한다. (social_Initialize API 호출 시 useImageBanner를 true로 설정했다면 웹뷰 기반의 대배너 출력) (v1.19.1+) |
all | “reviewEx” (v1.16.0+) “fullBannerLegacy” (v1.19.1+) |
forced | bool | type이 “notice” 와 “event” 일 때만 동작 true일 경우 24시간 다시보지 않기를 무시한다. (주의:24시간 다시보기가 적용되지 않으므로 버튼 액션으로 보는 등 특정 액션에서만 사용해야 함.) false이거나 생략할 경우 24시간 안보기가 정상동작한다. |
all | |
additionalInfo | string | (필수) Hive 아이템을 통해 게임 서버의 API에 전달 될 데이터 Hive 아이템 등을 통해 별도의 가공 없이 게임 서버 API 또는 게임 서버의 중계용 API 등 그에 준하는 API에 전달될 값임. 최종 게임 서버에 주요 키값이 전달되기 전에 필터링을 거쳐야 할 필요가 있을 때, 필터링을 위한 데이터를 저장하기 위한 json format의 parameter이다.(필수)서버군이 따로 없는 단일 서버군이라도 아래 예제대로 넣어야 함 ex)”addtionalInfo”:”{“server”:”서버 지역 코드값”,”character”:”0″}” – 머큐리 이벤트 페이지 노출 시 ex) “addtionalInfo”:”{“server”:”서버 지역 코드값”,”character”:”0″, “mq_redirect”:”이벤트번호”}” – 머큐리 이벤트 페이지 노출 시(머큐리 헤더 off) ex)”addtionalInfo”:”{“server”:”서버 지역 코드값”,”character”:”0″, “mq_redirect”:”이벤트번호”, “header”:”off”}” – 서버 지역 코드값 : 서버 지역 코드값은 ‘ISO 3166 alpha-2’ 코드를 기준으로 하며 Hive 연동 가이드라인 > 게임서버 ID 항목을 참고한다. > 이벤트 번호: 백오피스 머큐리에 등록된 일반 배너 번호 |
all | |
type == “customWebview” 일 때 | ||||
viewId | int | 백오피스에 설정된 사용자 정의 페이지의 아이디 | all | – |
Result – Api.Promotion_Show
콜백으로 오퍼월 버튼 노출 여부 정보가 오며 대배너가 모두 닫히면 콜백이 내려온다. (백오피스 오퍼월 세팅 페이지의 오퍼월 노출 여부 항목과 연동)
argument name | type | desc | platform | 비고 |
---|---|---|---|---|
type | string | 호출 타입 | all | – |
offerwallstate | int | 오퍼월 상태 값 : -14(Activation), -15(Deactivation) |
all | – |
state | string | 호출한 페이지의 상태를 표시한다. close: 창이 닫힌 상태 goback: 스키마를 이용해 창이 닫힌 상태 |
all | 1.18.3+ |
type == “moreGames” 일 때 | ||||
finishApp | int | 게임 종료 여부 : -1 (게임 종료), 0 (게임 재개) / More Games 팝업 호출시 내려옴 |
android | – |
C2SModulePromotion_Info
뱃지 정보 또는 웹뷰의 정보를 얻어 온다.
뱃지 정보를 통해 버튼에 new를 표시 할 수 있으며 필요에 따라 웹뷰 정보를 이용하여 개발사 자체 웹뷰를 구성 시 데이터를 사용할 수 있다.
argument type | type | desc | platform | 비고 |
---|---|---|---|---|
type | string | “badge” : viewId (notice, event, noticeOnly, 커스튭뷰) 의 뱃지 정보 요청 “view” : viewId 전체의 뷰의 웹뷰 정보를 요청 |
all | 1.5.0+ |
viewId | string or int | “fullBanner” : 대배너의 정보 (type view Only) “notice” : 공지 페이지의 정보를 얻는다. “event” : 이벤트 페이지의 정보를 얻는다. “noticeOnly” : 공지 페이지의 정보를 얻는다. (이벤트가 붙지않는 머큐리페이지) 커스텀 웹뷰 번호 : integer타입으로 넣는다. |
all | 1.5.0+ |
Result – Api.Promotion_Info
뱃지 정보 또는 웹뷰의 정보를 리턴 받는다.
argument type | type | desc | platform | 비고 |
---|---|---|---|---|
뱃지 정보를 요청했을 경우 (type == “badge”) | ||||
type | string | “badge” | all | 1.5.0+ |
viewId | string or int | “main” : 머큐리 메인페이지 정보 (“event”or”notice”일 경우) “noticeOnly” 커스텀 웹뷰 번호 (integer) |
all | 1.5.0+ |
badgeType | string | “new” “none” |
all | 1.5.0+ |
웹뷰 정보를 요청 했을 경우 ( type == “view”) | ||||
type | string | “view” | all | 1.5.0+ |
viewId | string or int | “fullBanner” “notice” “event” “noticeOnly” 커스텀 웹뷰 번호 (integer) |
all | 1.5.0+ |
data | string | 요청한 웹뷰의 정보가 담겨있는 json 정보 | all | 1.5.0+ |
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 39 40 41 |
"data": "{"customviewinfo": {"origin": {"webview": [ { "down_url":"http://com2us.com/...", //클릭 시 이동 url "webview_type":"main", //"cpi": 크로스 프로 모션, "fullbanner": 대배너 , main : 머큐리 메인 "hratio":16, //16 세로 비율 ( board 가 custom 일때만 ) "cpi_type":0, //내부 처리를 위한 값 ( 클라이언트는 신경쓸 필요 없음) "image_url":"http://com2us.com/...", //이미지 url "action":"none", //"market" : 마켓 이동, "webout":브라우저 이벤트 페이지 이동 "pid":"1345", //이벤트 고유 아이디 "margin":30, //30%마진 (좌우 각각 15%) -(board가 custom 일 때만) "board":"full", //"full" : 전체 크기로 웹뷰 호출 "custom" : 지정된 크기로 웹뷰 노출 "act":"button", //"init" : 저동 노출 "button" : 강제 노출 "notice" : 공지 노출 "custom" : 커스톰 웹뷰(모듈에서 보내는 값) "showtype":"-12", //act에 따른 머큐리 페이지 구성 ID "url":"http://test.mercury.com2us.com/mercury_new", //웹뷰 랜딩 URL "wratio":0, //9 <=가로 비율 (board가 custom 일 때만) } ], "show":2, //-1(에러), 0(미노출), 1(노출), 2(강제노출) "badge": [ { "expire":720, //만료 시간 (시간범위: 0 ~ 제한없음) "startdate":1434070800, //이벤트 시작 시간 (밀리초 GMT) "act":"custom", //"init" : 저동 노출 "button" : 강제 노출 "notice" : 공지 노출 "custom" : 커스톰 웹뷰(모듈에서 보내는 값) "showtype":200001, //act에 따른 머큐리 페이지 구성 ID "term":30, //뱃지 정보 서버 재요청 주기 기준 (분) "badgetype":"new" //뱃지 종류 } ] ,"error":0 ,"count":1 ,"type":"0" ,"errormsg":"success" }, "url":"http://test.mercury.com2us.com/mercury_new" } } |
C2SModulePromotion_GetOfferwallState
argument name | type | desc | platform | 비고 |
---|---|---|---|---|
argumet는 없으며 Return -14: offerwall Activation -15: offerwall Deactivation |
android |
샘플 코드
Unity3d:C2SModule.Promotion.Show
1 2 3 |
public static bool C2SModule.Promotion.Show(C2SModule.Parameter arg, out C2SModule.Error error) ; public static bool C2SModule.Promotion.Show(C2SModule.Parameter arg, out C2SModule.Error error, C2SModule.CompletionHandler completionHandler); |
1 2 3 |
Overview - 콜백으로 오퍼월 버튼 노출 여부 정보가 옴 또한 대배너가 모두 닫히면 콜백이 내려온다 |
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 105 |
[대배너 노출] C2SModule.Parameter arg = new C2SModule.Parameter (); arg ["type"] = "fullBanner"; // additionalInfo 추가 Dictionary<string, string=""> dic = new Dictionary<string, string="">(); dic.Add ("server", "0"); dic.Add ("character", "0"); string additionalInfo = MiniJSON.Json.Serialize (dic); arg ["additionalInfo"] = additionalInfo; C2SModule.Error error; if(!C2SModule.Promotion.Show (arg, out error)){ // Error 시 처리 } [머큐리 메인페이지 노출] C2SModule.Parameter arg = new C2SModule.Parameter (); arg ["type"] = "notice"; //메인페이지 상단에 공지 우선 //arg ["type"] = "event"; //메인페이지 상단에 이벤트 우선 // additionalInfo 추가 Dictionary<string, string=""> dic = new Dictionary<string, string="">(); dic.Add ("server", "0"); dic.Add ("character", "0"); string additionalInfo = MiniJSON.Json.Serialize (dic); arg ["additionalInfo"] = additionalInfo; C2SModule.Error error; if(!C2SModule.Promotion.Show (arg, out error)){ // Error 시 처리} [머큐리 이벤트 페이지 노출] C2SModule.Parameter arg = new C2SModule.Parameter (); arg ["type"] = "notice"; //메인페이지 상단에 공지 우선 //arg ["type"] = "event"; //메인페이지 상단에 이벤트 우선 // additionalInfo 추가 Dictionary<string, string=""> dic = new Dictionary<string, string="">(); dic.Add ("server", "0"); dic.Add ("character", "0"); dic.Add ("mq_redirect","1982"); // 이벤트 페이지 직접 노출 dic.Add ("header","off"); // 이벤트 페이지 직접 노출 시 머큐리 헤더 미노출 string additionalInfo = MiniJSON.Json.Serialize (dic); arg ["additionalInfo"] = additionalInfo; C2SModule.Error error; if(!C2SModule.Promotion.Show (arg, out error)){ // Error 시 처리} [오퍼월 노출] C2SModule.Parameter arg = new C2SModule.Parameter (); arg ["type"] = "offerwall"; //메인페이지 상단에 공지 우선 // additionalInfo 추가 Dictionary<string, string=""> dic = new Dictionary<string, string="">(); dic.Add ("server", "0"); dic.Add ("character", "0"); string additionalInfo = MiniJSON.Json.Serialize (dic); arg ["additionalInfo"] = additionalInfo; C2SModule.Error error; if(!C2SModule.Promotion.Show (arg, out error)) { // Error 시 처리 } [공지만 출력] C2SModule.Parameter arg = new C2SModule.Parameter (); arg ["type"] = "noticeOnly"; //공지 사항만 // additionalInfo 추가 Dictionary<string, string=""> dic = new Dictionary<string, string="">(); dic.Add ("server", "0"); dic.Add ("character", "0"); string additionalInfo = MiniJSON.Json.Serialize (dic); arg ["additionalInfo"] = additionalInfo; C2SModule.Error error; if(!C2SModule.Promotion.Show (arg, out error)){ // Error 시 처리} [커스텀 웹뷰 노출] C2SModule.Parameter arg = new C2SModule.Parameter (); arg ["type"] = "customWebview"; arg ["viewId"] = 300001; // additionalInfo 추가 Dictionary<string, string=""> dic = new Dictionary<string, string="">(); dic.Add ("server", "0"); dic.Add ("character", "0"); string additionalInfo = MiniJSON.Json.Serialize (dic); arg ["additionalInfo"] = additionalInfo; C2SModule.Error error; if(!C2SModule.Promotion.Show (arg, out error)){ // Error 시 처리} [리뷰 팝업 띄우기] C2SModule.Parameter arg = new C2SModule.Parameter (); arg ["type"] = "review"; // additionalInfo 추가 Dictionary<string, string=""> dic = new Dictionary<string, string="">(); dic.Add ("server", "0"); dic.Add ("character", "0"); string additionalInfo = MiniJSON.Json.Serialize (dic); arg ["additionalInfo"] = additionalInfo; C2SModule.Error error; if(!C2SModule.Promotion.Show (arg, out error)){ // Error 시 처리} [Android 또는 iOS의 별점 팝업 호출] C2SModule.Parameter arg = new C2SModule.Parameter(); arg ["type"] = "reviewEx"; // additionalInfo 추가 Dictionary<string, string=""> dic = new Dictionary<string, string="">(); dic.Add ("server", "0"); dic.Add ("character", "0"); string additionalInfo = MiniJSON.Json.Serialize (dic); arg ["additionalInfo"] = additionalInfo; C2SModule.Error error; if(!C2SModule.Promotion.Show (arg, out error)){ // Error 시 처리} |
Unity3d:C2SModule.Promotion.Info
1 2 3 |
public static bool C2SModule.Promotion.Info(C2SModule.Parameter arg, out C2SModule.Error error) ; public static bool C2SModule.Promotion.Info(C2SModule.Parameter arg, out C2SModule.Error error, C2SModule.CompletionHandler completionHandler); |
1 2 3 |
Overview - 뱃지 정보 또는 웹뷰의 정보를 얻어 온다. (1.5.0 추가) 뱃지 정보를 통해 버튼에 new를 표시 할 수 있으며 필요에 따라 웹뷰 정보를 이용하여 개발사 자체 웹뷰를 구성 시 데이터를 사용할 수 있다. |
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 |
[공지 배너/이벤트/대배너/공지 배너Only 뱃지 정보] C2SModule.Parameter arg = new C2SModule.Parameter (); arg ["type"] = "badge"; arg ["viewId"] = "notice"; // "event", "fullBanner", "noticeOnly" C2SModule.Error error; if(!C2SModule.Promotion.Info (arg, out error)) { // Error 시 처리 } [커스텀 웹뷰 뱃지 정보] C2SModule.Parameter arg = new C2SModule.Parameter (); arg ["type"] = "badge"; arg ["viewId"] = 300001; // 300000~500000 사이의 커스텀웹뷰 id C2SModule.Error error; if(!C2SModule.Promotion.Info (arg, out error)) { // Error 시 처리 } [공지 배너/이벤트/대배너/공지 배너Only 웹뷰 정보] C2SModule.Parameter arg = new C2SModule.Parameter (); arg ["type"] = "view"; arg ["viewId"] = "notice"; // "event", "fullBanner", "noticeOnly" C2SModule.Error error; if(!C2SModule.Promotion.Info (arg, out error)) { // Error 시 처리 } [커스텀 웹뷰 정보] C2SModule.Parameter arg = new C2SModule.Parameter (); arg ["type"] = "view"; arg ["viewId"] = 300001; // 300000~500000 사이의 커스텀웹뷰 id C2SModule.Error error; if(!C2SModule.Promotion.Info (arg, out error)) { // Error 시 처리 } static void ResultDelegate(Api api, Parameter arg, Error error) { switch(api) { case Api.Promotion_Info: // break; ... } } |
Unity3d:C2SModule.Promotion.GetOfferwallState
1 |
public static int C2SModule.Promotion.GetOfferwallState(); |
1 2 |
Overview - 콜백으로 오퍼월 버튼 노출 여부 정보가 옴. 또한 대배너가 모두 닫히면 콜백이 내려온다 |
1 2 3 4 |
if( C2SModule.Promotion.GetOfferwallState() == -14 ) { // 게임 UI의 Offerwall 호출 버튼 노출 } |
Unreal:HiveSDKUEPromotion_Show
1 |
void HiveSDKUEPromotion_Show(FString fstrJson); |
1 2 3 |
Overview - 콜백으로 오퍼월 버튼 노출 여부 정보가 오며 대배너가 모두 닫히면 Promotion_Show콜백이 내려온다 |
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 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 |
[대배너 노출] TSharedPtr arg = MakeShareable(new FJsonObject); arg->SetStringField(TEXT("type"), TEXT("fullBanner")); 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(C2SModuleArgKey_ADDITIONAL_INFO),argAddInfoTXT); FString OutputString; TSharedRef< TJsonWriter<TCHAR, TCondensedJsonPrintPolicy< TCHAR >> > Writer = TJsonWriterFactory<TCHAR, TCondensedJsonPrintPolicy< TCHAR >>::Create(&OutputString); FJsonSerializer::Serialize(arg.ToSharedRef(), Writer); FHiveSDKModule::Get().HiveSDKUEPromotion_Show(OutputString); [머큐리 메인페이지 노출] TSharedPtr arg = MakeShareable(new FJsonObject); arg->SetStringField(TEXT("type"), TEXT("notice")); //메인페이지 상단에 공지 우선 //arg->SetStringField(TEXT("type"), TEXT("event")); //메인페이지 상단에 이벤트 우선 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(C2SModuleArgKey_ADDITIONAL_INFO),argAddInfoTXT); FString OutputString; TSharedRef< TJsonWriter<TCHAR, TCondensedJsonPrintPolicy< TCHAR >> > Writer = TJsonWriterFactory<TCHAR, TCondensedJsonPrintPolicy< TCHAR >>::Create(&OutputString); FJsonSerializer::Serialize(arg.ToSharedRef(), Writer); FHiveSDKModule::Get().HiveSDKUEPromotion_Show(OutputString); [머큐리 이벤트 페이지 노출] TSharedPtr arg = MakeShareable(new FJsonObject); arg->SetStringField(TEXT("type"), TEXT("notice")); //메인페이지 상단에 공지 우선 //arg->SetStringField(TEXT("type"), TEXT("event")); //메인페이지 상단에 이벤트 우선 TSharedPtr argAddInfo = MakeShareable(new FJsonObject); argAddInfo->SetStringField(TEXT("server"), TEXT("0")); // 입력(필수) - default "0" argAddInfo->SetStringField(TEXT("character"), TEXT("0")); // 입력(필수) - default "0" argAddInfo->SetStringField(TEXT("mq_redirect"), TEXT("0")); // 입력(선택) 이벤트 바로이동. argAddInfo->SetStringField(TEXT("header"),TEXT("off")); // 입력(선택) 이벤트 바로이동 시 헤더 off FString argAddInfoTXT; TSharedRef< TJsonWriter<TCHAR, TCondensedJsonPrintPolicy< TCHAR >> > WriterAddInfo = TJsonWriterFactory<TCHAR, TCondensedJsonPrintPolicy< TCHAR >>::Create(&argAddInfoTXT); FJsonSerializer::Serialize(argAddInfo.ToSharedRef(), WriterAddInfo); arg->SetStringField(TEXT(C2SModuleArgKey_ADDITIONAL_INFO),argAddInfoTXT); FString OutputString; TSharedRef< TJsonWriter<TCHAR, TCondensedJsonPrintPolicy< TCHAR >> > Writer = TJsonWriterFactory<TCHAR, TCondensedJsonPrintPolicy< TCHAR >>::Create(&OutputString); FJsonSerializer::Serialize(arg.ToSharedRef(), Writer); FHiveSDKModule::Get().HiveSDKUEPromotion_Show(OutputString); [오퍼월 노출] TSharedPtr arg = MakeShareable(new FJsonObject); arg->SetStringField(TEXT("type"), TEXT("offerwall")); 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(C2SModuleArgKey_ADDITIONAL_INFO),argAddInfoTXT); FString OutputString; TSharedRef< TJsonWriter<TCHAR, TCondensedJsonPrintPolicy< TCHAR >> > Writer = TJsonWriterFactory<TCHAR, TCondensedJsonPrintPolicy< TCHAR >>::Create(&OutputString); FJsonSerializer::Serialize(arg.ToSharedRef(), Writer); FHiveSDKModule::Get().HiveSDKUEPromotion_Show(OutputString); [공지만 출력] TSharedPtr arg = MakeShareable(new FJsonObject); arg->SetStringField(TEXT("type"), TEXT("noticeOnly")); //공지 사항만 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(C2SModuleArgKey_ADDITIONAL_INFO),argAddInfoTXT); FString OutputString; TSharedRef< TJsonWriter<TCHAR, TCondensedJsonPrintPolicy< TCHAR >> > Writer = TJsonWriterFactory<TCHAR, TCondensedJsonPrintPolicy< TCHAR >>::Create(&OutputString); FJsonSerializer::Serialize(arg.ToSharedRef(), Writer); FHiveSDKModule::Get().HiveSDKUEPromotion_Show(OutputString); [커스텀 웹뷰 노출] TSharedPtr arg = MakeShareable(new FJsonObject); arg->SetStringField(TEXT("type"), TEXT("customWebview")); arg->SetNumberField(TEXT("viewId"), 300001);// 300000~500000 사이의 해당 웹뷰 id 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(C2SModuleArgKey_ADDITIONAL_INFO),argAddInfoTXT); FString OutputString; TSharedRef< TJsonWriter<TCHAR, TCondensedJsonPrintPolicy< TCHAR >> > Writer = TJsonWriterFactory<TCHAR, TCondensedJsonPrintPolicy< TCHAR >>::Create(&OutputString); FJsonSerializer::Serialize(arg.ToSharedRef(), Writer); FHiveSDKModule::Get().HiveSDKUEPromotion_Show(OutputString); [리뷰 팝업띄우기] TSharedPtr arg = MakeShareable(new FJsonObject); arg->SetStringField(TEXT("type"), TEXT("review")); 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(C2SModuleArgKey_ADDITIONAL_INFO),argAddInfoTXT); FString OutputString; TSharedRef< TJsonWriter<TCHAR, TCondensedJsonPrintPolicy< TCHAR >> > Writer = TJsonWriterFactory<TCHAR, TCondensedJsonPrintPolicy< TCHAR >>::Create(&OutputString); FJsonSerializer::Serialize(arg.ToSharedRef(), Writer); FHiveSDKModule::Get().HiveSDKUEPromotion_Show(OutputString); [MoreGames Popup] TSharedPtr arg = MakeShareable(new FJsonObject); arg->SetStringField(TEXT("type"), TEXT("moreGames")); 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(C2SModuleArgKey_ADDITIONAL_INFO),argAddInfoTXT);FString OutputString;TSharedRef< TJsonWriter<TCHAR, TCondensedJsonPrintPolicy< TCHAR >> > Writer = TJsonWriterFactory<TCHAR, TCondensedJsonPrintPolicy< TCHAR >>::Create(&OutputString);FJsonSerializer::Serialize(arg.ToSharedRef(), Writer);UHiveSamplePromotion::promotionHiveSDK(OutputString); |
Unreal:HiveSDKUEPromotion_Info
1 |
void HiveSDKUEPromotion_Info(FString fstrJson); |
1 2 3 |
Overview - 뱃지 정보 또는 웹뷰의 정보를 얻어 온다. (1.5.0 추가) 뱃지 정보를 통해 버튼에 new를 표시 할 수 있으며 필요에 따라 웹뷰 정보를 이용하여 개발사 자체 웹뷰를 구성 시 데이터를 사용할 수 있다. |
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 |
[공지 배너/이벤트/대배너/공지 배너Only 뱃지 정보] TSharedPtr arg = MakeShareable(new FJsonObject); arg->SetStringField(TEXT("type"), TEXT("badge")); arg->SetStringField(TEXT("viewId"), TEXT("notice")); // "event", "fullBanner", "noticeOnly" FString OutputString;TSharedRef< TJsonWriter<> > Writer = TJsonWriterFactory<>::Create(&OutputString);FJsonSerializer::Serialize(arg.ToSharedRef(), Writer);FHiveSDKModule::Get().HiveSDKUEPromotion_Info(OutputString); [커스텀웨뷰 뱃지 정보] TSharedPtr arg = MakeShareable(new FJsonObject); arg->SetStringField(TEXT("type"), TEXT("badge")); arg->SetNumberField(TEXT("viewId"), 300001); // 300000~500000 사이의 커스텀웹뷰 id FString OutputString;TSharedRef< TJsonWriter<> > Writer = TJsonWriterFactory<>::Create(&OutputString);FJsonSerializer::Serialize(arg.ToSharedRef(), Writer);FHiveSDKModule::Get().HiveSDKUEPromotion_Info(OutputString); [대배너,공지사항,이벤트,공지사항 Only 웹뷰 정보] TSharedPtr arg = MakeShareable(new FJsonObject); arg->SetStringField(TEXT("type"), TEXT("view")); arg->SetStringField(TEXT("viewId"), TEXT("notice"));// "event", "fullBanner", "noticeOnly" FString OutputString;TSharedRef< TJsonWriter<> > Writer = TJsonWriterFactory<>::Create(&OutputString);FJsonSerializer::Serialize(arg.ToSharedRef(), Writer);FHiveSDKModule::Get().HiveSDKUEPromotion_Info(OutputString); [커스텀 웹뷰 정보] TSharedPtr arg = MakeShareable(new FJsonObject); arg->SetStringField(TEXT("type"), TEXT("view")); arg->SetNumberField(TEXT("viewId"), 300001); // 300000~500000 사이의 커스텀웹뷰 id FString OutputString;TSharedRef< TJsonWriter<> > Writer = TJsonWriterFactory<>::Create(&OutputString);FJsonSerializer::Serialize(arg.ToSharedRef(), Writer);FHiveSDKModule::Get().HiveSDKUEPromotion_Info(OutputString); [result delegate] void MYGAMECLASS::ResultDelegate(C2SModuleApi api, const char* json, C2SModuleErrorCode code, const char* message) { switch(api) { case C2SModuleApi_PromotionInfo: { // ... } } } |
Unreal:GetOfferwallState
1 |
int GetOfferwallState(); |
1 2 |
Overview - 오퍼월 노출 여부를 리턴한다. |
1 2 3 4 5 6 |
#if PLATFORM_ANDROID if( ::GetOfferwallState() == -14 ) { // 게임 UI의 Offerwall 호출 버튼 노출 } #endif |
iOS:C2SModulePromotion Show
1 2 3 |
+(BOOL)Show:(id)arg error:(NSError**)error; +(BOOL)Show:(id)arg error:(NSError**)error completionHandler:(void(^)(NSDictionary *, NSError*)) completionHandler; |
1 2 3 |
Overview - 콜백으로 오퍼월 버튼 노출 여부 정보가 옴 또한 대배너가 모두 닫히면 콜백이 내려온다 |
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 105 106 107 108 109 110 111 112 113 |
[대배너 노출] 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]; [C2SModulePromotion Show:@{@"type":@"fullBanner",@"additionalInfo":addInfo} error:&error completionHandler:^(NSDictionary* resultArg, NSError* resultError) { if (resultError == nil) { //succeed } }]; [머큐리 메인페이지 노출] 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]; [C2SModulePromotion Show:@{@"type":@"notice",@"additionalInfo":addInfo} error:&error completionHandler:^(NSDictionary* resultArg, NSError* resultError) { if (resultError == nil) { //succeed } }]; [머큐리 이벤트 페이지 노출] NSError* error; NSDictionary* dictionary = @{@"server":@"0",@"character":@"0",@"mq_redirect":@"1818",@"header":@"off"}; // 이벤트 페이지 직접 노출시 머큐리 헤더 미노출 NSData* dictionary_data = [NSJSONSerialization dataWithJSONObject:dictionary options:NSJSONWritingPrettyPrinted error:nil]; NSString* addInfo = [[NSString alloc] initWithData:dictionary_data encoding:NSUTF8StringEncoding]; [C2SModulePromotion Show:@{@"type":@"notice",@"additionalInfo":addInfo} error:&error completionHandler:^(NSDictionary* resultArg, NSError* resultError) { if (resultError == nil) { //succeed } }]; [오퍼월 노출] 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]; [C2SModulePromotion Show:@{@"event":@"notice",@"additionalInfo":addInfo} error:&error completionHandler:^(NSDictionary* resultArg, NSError* resultError) { if (resultError == nil) { //succeed } }]; [공지만 출력] 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]; [C2SModulePromotion Show:@{@"type":@"noticeOnly"} error:&error completionHandler:^(NSDictionary* resultArg, NSError* resultError) { if (resultError == nil) { //succeed } }]; [커스텀 웹뷰 노출] 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]; [C2SModulePromotion Show:@{@"type":@"customWebview",@"viewId":@300001} error:&error completionHandler:^(NSDictionary* resultArg, NSError* resultError) { if (resultError == nil) { //succeed } }]; [리뷰 팝업 띄우기] 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]; [C2SModulePromotion Show:@{@"type":@"review"} error:&error completionHandler:^(NSDictionary* resultArg, NSError* resultError) { if (resultError == nil) { //succeed } }]; [Android 또는 iOS의 별점 팝업 호출] 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]; [C2SModulePromotion Show:@{@"type":@"reviewEx"} error:&error completionHandler:^(NSDictionary* resultArg, NSError* resultError) { if (resultError == nil) { //succeed } }]; |
IOS:C2SModulePromotion Info
1 2 3 |
<span style="font-weight: 400;">+(BOOL)Info:(id)arg error:(NSError**)error; </span><span style="font-weight: 400;">+(BOOL)Info:(id)arg error:(NSError**)error completionHandler:(void(^)(NSDictionary *, NSError*)) completionHandler;</span> |
1 2 3 |
Overview - 뱃지 정보 또는 웹뷰의 정보를 얻어 온다. (1.5.0 추가) 뱃지 정보를 통해 버튼에 new를 표시 할 수 있으며 필요에 따라 웹뷰 정보를 이용하여 개발사 자체 웹뷰를 구성 시 데이터를 사용할 수 있다. |
1 2 3 4 5 6 |
NSError* error; [C2SModulePromotion Info:@{@"type":@"badge",@"viewId":@"notice"} error:&error completionHandler:^(NSDictionary* resultArg, NSError* resultError) { if (resultError == nil) { //succeed //resultArg["type"]; |
Cocos2d:C2SModulePromotion_Show
1 2 |
bool C2SModulePromotion_Show(const char* pstrJson, C2SModule_Cocos2dx::C2SModuleError* pkError, C2SModule_Cocos2dx::C2SModuleCompletionHandler* completionHandler = NULL); |
1 2 3 |
Overview - 콜백으로 오퍼월 버튼 노출 여부 정보가 옴 또한 대배너가 모두 닫히면 콜백이 내려온다 |
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 105 106 107 108 109 110 111 112 113 114 115 116 117 |
[대배너 노출] Json::Value arg; arg["type"] = "fullBanner"; Json::FastWriter writer; Json::Value argAddInfo; argAddInfo["server"] = "0"; // 입력(필수) - default "0" argAddInfo["character"] = "0"; //입력(필수) - default "0" arg["additionalInfo"] = writer.write(argAddInfo); std::string strJSON = writer.write(arg); C2SModule_Cocos2dx::C2SModuleError error; if( ::C2SModulePromotion_Show( strJSON.c_str(), &error ) == false ) { CCLog( "====>>>> Mercury error (%s)", error.get()->GetMessage() ); } [머큐리 메인페이지 노출] Json::Value arg; arg["type"] = "notice"; Json::FastWriter writer; Json::Value argAddInfo; argAddInfo["server"] = "0"; // 입력(필수) - default "0" argAddInfo["character"] = "0"; // 입력(필수) - default "0" arg["additionalInfo"] = writer.write(argAddInfo); std::string strJSON = writer.write(arg); C2SModule_Cocos2dx::C2SModuleError error; if( ::C2SModulePromotion_Show( strJSON.c_str(), &error ) == false ) { CCLog( "====>>>> Mercury error (%s)", error.get()->GetMessage() ); } [머큐리 이벤트 페이지 노출] Json::Value arg; arg["type"] = "notice"; Json::FastWriter writer; Json::Value argAddInfo; argAddInfo["server"] = "0"; // 입력(필수) - default "0" argAddInfo["character"] = "0"; // 입력(필수) - default "0" argAddInfo["mq_redirect"] = "1912"; //백오피스 머큐리 일반 배너에 등록된 이벤트 번호 argAddInfo["header"] = "off"; // 이벤트 페이지 노출 시 헤더 미노출 arg["additionalInfo"] = writer.write(argAddInfo); std::string strJSON = writer.write(arg); C2SModule_Cocos2dx::C2SModuleError error; if( ::C2SModulePromotion_Show( strJSON.c_str(), &error ) == false ) { CCLog( "====>>>> Mercury error (%s)", error.get()->GetMessage() ); } [오퍼월 노출] Json::Value arg; arg["type"] = "offerwall"; Json::FastWriter writer; Json::Value argAddInfo; argAddInfo["server"] = "0"; // 입력(필수) - default "0" argAddInfo["character"] = "0"; // 입력(필수) - default "0" arg["additionalInfo"] = writer.write(argAddInfo); std::string strJSON = writer.write(arg); C2SModule_Cocos2dx::C2SModuleError error; if( ::C2SModulePromotion_Show( strJSON.c_str(), &error ) == false ) { CCLog( "====>>>> Mercury error (%s)", error.get()->GetMessage() ); } [공지사항만 노출] Json::Value arg; arg["type"] = "noticeOnly"; Json::FastWriter writer; Json::Value argAddInfo; argAddInfo["server"] = "0"; //입력(필수) - default "0" argAddInfo["character"] = "0"; // 입력(필수) - default "0" arg["additionalInfo"] = writer.write(argAddInfo); std::string strJSON = writer.write(arg); C2SModule_Cocos2dx::C2SModuleError error; if( ::C2SModulePromotion_Show( strJSON.c_str(), &error ) == false ) { CCLog( "====>>>> Mercury error (%s)", error.get()->GetMessage() ); } [커스텀 웹뷰 노출] Json::Value arg; arg["type"] = "customWebview"; arg["viewId"] = 300001; // 300000~500000 사이의 해당 웹뷰 id Json::FastWriter writer; Json::Value argAddInfo; argAddInfo["server"] = "0"; // 입력(필수) - default "0" argAddInfo["character"] = "0"; // 입력(필수) - default "0" arg["additionalInfo"] = writer.write(argAddInfo); std::string strJSON = writer.write(arg); C2SModule_Cocos2dx::C2SModuleError error; if( ::C2SModulePromotion_Show( strJSON.c_str(), &error ) == false ) { CCLog( "====>>>> Mercury error (%s)", error.get()->GetMessage() ); } [리뷰 노출] Json::Value arg; arg["type"] = "review"; Json::FastWriter writer; Json::Value argAddInfo; argAddInfo["server"] = "0"; // 입력(필수) - default "0" argAddInfo["character"] = "0"; //입력(필수) - default "0" arg["additionalInfo"] = writer.write(argAddInfo); std::string strJSON = writer.write(arg); C2SModule_Cocos2dx::C2SModuleError error; if( ::C2SModulePromotion_Show( strJSON.c_str(), &error ) == false ) { CCLog( "====>>>> Mercury error (%s)", error.get()->GetMessage() ); } [Android 또는 iOS의 별점 팝업 호출] Json::Value arg; arg["type"] = "reviewEx"; Json::FastWriter writer; Json::Value argAddInfo; argAddInfo["server"] = "0"; // 입력(필수) - default "0" argAddInfo["character"] = "0"; //입력(필수) - default "0" arg["additionalInfo"] = writer.write(argAddInfo); std::string strJSON = writer.write(arg); C2SModule_Cocos2dx::C2SModuleError error; if( ::C2SModulePromotion_Show( strJSON.c_str(), &error ) == false ) { CCLog( "====>>>> Mercury error (%s)", error.get()->GetMessage() ); } |
Cocos2d:C2SModulePromotion_Info
1 2 |
<span style="font-weight: 400;">bool C2SModulePromotion_Info(const char* pstrJson, C2SModule_Cocos2dx::C2SModuleError* pkError, C2SModule_Cocos2dx::C2SModuleCompletionHandler* completionHandler = NULL);</span> |
1 2 3 |
Overview - 뱃지 정보 또는 웹뷰의 정보를 얻어 옵니다. (1.5.0 추가) 뱃지 정보를 통해 버튼에 new를 표시 할 수 있으며 필요에 따라 웹뷰 정보를 이용하여 개발사 자체 웹뷰를 구성 시 데이터를 사용할 수 있다. |
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 |
[공지사항/이벤트 뱃지 정보] Json::Value arg; arg["type"] = "badge"; arg["viewId"] = "notice"; // "notice" or "event" Json::StyledWriter writer; std::string strJSON = writer.write(arg); C2SModule_Cocos2dx::C2SModuleError error; if( ::C2SModulePromotion_Info( strJSON.c_str(), &error ) == false ) { CCLog( "====>>>> Mercury error (%s)", error.get()->GetMessage() ); } [공지사항 Only 뱃지 정보] Json::Value arg; arg["type"] = "badge"; arg["viewId"] = "noticeOnly"; Json::StyledWriter writer; std::string strJSON = writer.write(arg); C2SModule_Cocos2dx::C2SModuleError error; if( ::C2SModulePromotion_Info( strJSON.c_str(), &error ) == false ) { CCLog( "====>>>> Mercury error (%s)", error.get()->GetMessage() ); } [커스텀웨뷰 뱃지 정보] Json::Value arg; arg["type"] = "badge"; arg["viewId"] = 300001; // 300000~500000 사이의 해당 웹뷰 id Json::StyledWriter writer; std::string strJSON = writer.write(arg); C2SModule_Cocos2dx::C2SModuleError error; if( ::C2SModulePromotion_Info( strJSON.c_str(), &error ) == false ) { CCLog( "====>>>> Mercury error (%s)", error.get()->GetMessage() ); } [대배너,공지사항,이벤트,공지사항 Only 웹뷰 정보] Json::Value arg; arg["type"] = "view"; arg["viewId"] = "notice"; // "event", "noticeOnly", "fullBanner" Json::StyledWriter writer; std::string strJSON = writer.write(arg); C2SModule_Cocos2dx::C2SModuleError error; if( ::C2SModulePromotion_Info( strJSON.c_str(), &error ) == false ) { CCLog( "====>>>> Mercury error (%s)", error.get()->GetMessage() ); } [커스텀 웹뷰 정보] Json::Value arg; arg["type"] = "view"; arg["viewId"] = 300001; // 300000~500000 사이의 해당 웹뷰 id Json::StyledWriter writer; std::string strJSON = writer.write(arg); C2SModule_Cocos2dx::C2SModuleError error; if( ::C2SModulePromotion_Info( strJSON.c_str(), &error ) == false ) { CCLog( "====>>>> Mercury error (%s)", error.get()->GetMessage() ); } [result delegate] void SampleProject::ResultDelegate(C2SModuleApi api, const char* json, C2SModuleErrorCode code, const char* message) { switch(api) { case C2SModuleApi_PromotionInfo: { // ... } } } |
Cocos2d:GetOfferwallState
1 |
int GetOfferwallState(); |
1 2 3 4 |
Overview - 콜백으로 오퍼월 버튼 노출 여부 정보가 옴 또한 대배너가 모두 닫히면 콜백이 내려온다 (백오피스 오퍼월 세팅 페이지의 오퍼월 노출 여부 항목과 연동 합니다.) |
1 2 3 4 |
if( ::GetOfferwallState() == -14 ) { // 게임 UI의 Offerwall 호출 버튼 노출 } |
타겟팅 프로모션
타겟팅 프로모션은 Hive 애널리틱스를 통해서만 가능하다.
Hive 애널리틱스에서 생성된 세그먼트 또는 스냅샷으로 타겟팅 할 수 있으며, 타겟팅 대상자는 캠페인 시작 30분 전에 추출된다.
Hive 프로모션 가운데, 일반배너, 대배너, 스팟배너, 크로스 일반배너, 크로스 대배너만 타켓팅 캠페인이 가능하다.
1) Hive 애널리틱스에서 타겟팅 유저 선정하기
세그먼트 메뉴에서 원하는 조건을 설정하여 타겟팅 대상자를 추출할 수 있다. 세그먼트를 새로 등록하거나 기존에 등록된 세그먼트의 타겟팅 탭으로 이동한다. 타겟팅 캠페인 등록 버튼을 클릭하면 아래 이미지와 같은 설정화면을 볼 수 있다.
내용을 작성하고 바로가기를 클릭하면 선택한 프로모션의 캠페인 타입의 등록페이지로 이동된다.
– 스냅샷 선택시 : 해당 유저들에게 고정으로 캠페인을 진행
– 스냅샷 미선택시 : 세그먼트 조건에 해당하는 유저를 캠페인 기간동안 매일 추출 가능
– 타겟팅 설명 : 타겟팅에 대한 제목으로 프로모션 캠페인의 등록페이지로 이동시 타겟팅명으로 등록됨
– 제품 선택 : Hive 프로모션의 캠페인 중 원하는 유형을 선택
– 타겟팅 유저 선정 방법 : 고정, 차감. 누적, 갱신 4가지 중 택일. 자세한 내용은 옵션 옆의 ? 를 클릭하여 확인
2) Hive 프로모션의 캠페인 등록 페이지
캠페인 등록페이지로 이동하면 노출 조건 설정의 [타게팅 설정] 항목에서 애널리틱스에서 입력한 타겟팅 설명을 확인할 수 있다.
3) 타겟팅 설정 유무 확인
캠페인 리스트에서 타겟팅 코드로 유무로 확인할 수 있다. 해당 코드는 애널리틱스 타겟팅 페이지에도 동일하게 노출된다.
4) 주의사항
– 타겟팅 캠페인이 진행 중에, 세그먼트를 삭제해도 해당 캠페인은 취소되지 않고, 종료일까지 진행된다.
– 타겟팅 캠페인을 취소하거나 종료하려면 Hive 프로모션의 캠페인 설정에서 해당 캠페인을 비활성화 또는 삭제해야 한다.
프로모션에 동영상 광고 도입하기
Hive SDK v1.14.0부터 YouTubeAndroidPlayerApi.jar 라이브러리를 이용해 동영상 광고 추가가 가능하다. 프로모션 도중 유저가 동영상 재생 링크를 선택하면 영상이 전체 화면으로 노출된다. 이를 위해 게임에서는 영상 시작 전 게임 음량을 최소화하거나 음소거하는 코드를 추가하고, 영상이 종료된 이후에는 원래 음량으로 되돌리는 작업을 진행해야 한다.
Hive SDK v1.17.0에서는 확장된 YouTube 기능을 사용할 수 있도록 개선되었다. YouTubeAndroidWebPlayerApi.aar 라이브러리를 이용하면 개선된 기능을 여러분의 게임에 적용시킬 수 있다.
- 영상 시작 전후 상태는 C2SModuleApi_PromotionPlayback 전역 콜백으로 전달된다.
- 영상 시작 시 – “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.Promotion_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_PromotionPlayback: { 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_PromotionPlayback:{ 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_PromotionPlayback:{ if([arg[@"state"] isEqualToString: @"start"]){ // 게임 사운드 멈춤 } if([arg[@"state"] isEqualToString: @"finish"]){ // 게임 사운드 재생 } }break; } } } |