모든 문서(일반 문서, 분류 문서, 파일(이미지, 사운드 등) 문서) 분류가 달려 있어야 합니다.

--Administrator (토론)

Mercury 모듈 적용 가이드 (iOS)

컴투스위키
이동: 둘러보기, 찾기
Com2uS 공통모듈 >> Mercury >> Mercury 모듈 적용 가이드 (iOS)

Mercury 모듈 적용 가이드 (Android)

Mercury 모듈 적용 가이드 (Unity3d)

>> Mercury 모듈 레퍼런스 가이드 >> Mercury FAQ


목차

역사

<작성법 참고>
Version Date SVN Revision 담당자 변경 사항
2.13.5 2020-09-25 - 최보경
  • 전면배너 디자인 변경
  • iOS 11.x 기기에서 웹뷰를 길게 터치 후 창을 닫았을 시 앱 멈춤 현상이 발생하지 않도록 수정
2.13.4 2020-06-16 - 정다운
  • 프로모션 배너 정보를 얻을 수 있는 API 추가 CS_MercuryGetBannerInfo
  • HIVE UI에서 사용하는 버튼의 유저 인터랙션 개선
  • UI에서 상하 회전되지 않는 오류 수정
2.13.3 2020-05-22 - 정다운
  • 프로모션 페이지 내 스키마를 통한 창 닫는 기능이 추가되었습니다.
2.13.2 2020-03-12 - 정다운
  • UA 초대 링크 전송 시 소셜 미디어 타입 식별 정보를 수집
2.13.1 2020-01-23 - 정다운
  • Common Module v1.6.0 이상 필수 적용
  • MercuryResource.bundle 버전 3.3으로 업데이트
    • 기존 리소스 번들 제거 후 교체 필요
  • 네트워크 통신 로직 개선
2.13.0 2019-12-12 - 최보경
  • Common Module v1.6.0 이상 필수 적용
  • MercuryResource.bundle 버전 3.2으로 업데이트
    • 기존 리소스 번들 제거 후 교체 필요
  • 더 이상 UIWebView를 사용하지 않고 WKWebview를 사용하도록 변경 (iOS13 대응)
  • Unity 엔진에서 Xcode11로 빌드할 경우 iOS13 단말에서 하이브 UI가 게임 씬 아래로 뜨는 부분을 수정
  • CPI를 통한 원활한 UA 보상 지급을 위해 advertising id를 전송하도록 수정
2.12.8 2019-10-23 - 최보경

개별전달된 버전입니다.

  • Mercury UserAcquisition 기능 추가
    • 딥링크 발생을 통한 친구 초대 및 보상 프로세스 [적용 가이드]
2.12.7 2019-10-16 - 최보경
  • Common Module v1.5.0 이상 필수 적용
    • 주의 : 모든 개별모듈 동시 업데이트 필요
  • 모든 웹뷰에서 쿠키 제거
    • MercuryCustomViewInfo 호출로 받은 데이터로 배너 페이지를 자체 구현 시 이제 cookies라는 키 값을 꼭 파싱한 뒤 Mercury 서버(프로모션 서버) 요청 시 post 데이터로 넣어주어야 합니다!
  • 프로모션 서버로 CPI 다운로드 로그를 추가로 전송
  • iOS 13을 대상으로 한 앱에서의 정상적인 동작을 보장
    • 클라이언트에 저장되는 모든 프로퍼티를 iCloud 백업 대상에서 제외
  • 프로모션 배너의 background가 검게 나타나는 증상 수정
  • 프로모션 배너에서 fullscreen으로 전환된 이후 webview delegate 누락된 현상 수정
2.12.5 2019-07-24 - 최보경
  • iOS 13에서 프로모션 페이지 노출 시 간헐적으로 크래시 발생하는 현상을 수정
2.12.4 2019-06-25 - 최보경
  • MercuryResource.bundle 버전 3.1으로 업데이트
    • 기존 리소스 번들 제거 후 교체 필요
  • 전면배너, 커스텀 웹뷰 다해상도 UI 대응
  • YouTube Video 프로모션 기능 확장 [가이드 확인하기]
  • 개별모듈 인게이지먼트 기능 추가
    • Mercury 모듈로 들어온 인터워크 기능만 수행 가능하며, 인터워크 형태 중 Peppermint 모듈로의 고객센터(1:1문의하기 및 챗봇) 페이지 호출만 가능 [가이드 확인하기]
2.12.3 2019-03-14 2859 최보경
  • ViewController 노출 window 기준을 delegate의 window로 변경
    • 전면배너, 커스텀 웹뷰, 리뷰 팝업
2.12.2 2018-11-15 2850 최보경
  • 프로모션에 사용되는 UI에 대하여 다해상도 대응
    • 리뷰 팝업 다해상도 대응
    • 새소식, 공지사항 등 프로모션 전체화면 페이지 우상단 닫기 이미지 다해상도 대응
    • 기존 리소스 번들 삭제 후 교체 필요
  • 리뷰 팝업의 버튼 위치 변경
  • 리뷰 팝업 내부 텍스트를 임의 설정할 수 있는 기능 추가 (HIVE 콘솔에서 설정)

(2019.01.02 공통 모듈 패키징에 유니티 시뮬레이터 플러그인 관련 파일 2개 추가 : libC2SMercuryUnityPlugin_iphonesimulator.a, libC2SMercuryUnityPlugin_iphonesimulatord.a)

2.12.1 2018-10-01 2846 최보경
  • 모듈 내부 통신에 사용되는 통합식별자 관련 수정
    • 통합식별자 데이터 처리 방식 개선
    • 네트워크 데이터 통신시 analytics_id를 추가하여 전송
2.12.0 2018-08-31 2844 최보경
  • iOS 전용 리뷰 팝업 노출 기능 추가(CS_MercuryShowNativeReviewPopup 레퍼런스)
    • StoreKit.framework 추가 (Optional)
  • 프로모션 로딩 방식 개선
    • 공지사항, 새소식, 오퍼월 페이지에서 로딩 진행상태를 알 수 있는 ProgressBar를 적용
    • 웹뷰에서 설정된 타임아웃 기능을 제거하여 시스템 타임아웃(60초)를 사용
2.11.0 2018-05-02 2838 최보경
  • YouTube 동영상 프로모션 기능 추가
    • WebKit.framework 추가
  • 커스텀 뷰 UI(frame, fullscreen 타입) 개선
    • Mercury Bundle v2.2 버전 필수 적용
2.10.16 2018-03-14 2835 최보경
  • Fullbanner 호출시 view마다 safe area 설정하도록 수정
    • Fullbanner 내부 웹뷰 클릭하여 fullscreen으로 전환 이후 닫기 버튼 위치 재설정
2.10.15 2018-02-07 2833 최보경
  • 프로모션과 관련된 서버 통신 시 광고 아이디와 광고 아이디 수집 여부 값을 전달하도록 추가
  • 커스텀 웹뷰 사용 시 외부 링크를 통하여 다른 웹브라우저로 이동한 후 게임으로 돌아왔을 때 기존 커스텀 웹뷰가 흰색 화면으로 유지되던 부분을 웹뷰가 닫히도록 수정
2.10.12 2017-12-08 2828 최보경
  • 전면배너 노출 시 2개 이상의 배너가 있는 경우, 현재 배너에서 로딩이 완료되거나 닫히게 되면 다음 배너 로딩을 요청하도록 변경하여 로딩 속도를 개선
  • Mercury/Hive Promotion에서 spinning view의 텍스트가 아랍어일 때 오른쪽으로 여백 없이 붙는 오류 수정
2.10.11 2017-10-30 2824 최보경
2.10.10 2017-09-20 2819 최보경
  • MercuryGetCustomViewInfo API 가 독립적으로 사용될 수 있도록 로직 개선
2.10.9 2017-08-11 2814 최보경
  • 모듈 내부 서버통신 데이터에 통합 식별자 추가
  • 언어 분기시 게임 언어를 우선시하며 게임 언어를 설정하지 않을 경우 단말 언어로 설정하도록 수정
    • ActiveUser SetGameLanguage API 를 통해 게임 언어 설정 가능 (ActiveUser v2.7.3 이상)
  • UI 관련 텍스트 국가별 추가 번역 및 오탈자 수정
2.10.8 2017-07-11 2809 최보경
  • 모듈 내부 아랍어 텍스트 추가
2.10.7 2017-01-26 2802 정다운
  • 데이터 요청에 대한 네트워크 타임아웃 로직 추가
  • 웹뷰 요청에 대한 네트워크 타임아웃 로직 추가(타임아웃 발생 시 자체 에러페이지 노출)
2.10.6 2016-11-21 2794 정다운
  • ATS(App Transport Security) 관련 대응 (모듈 내부에서 호출하는 http 도메인을 https로 변경)
2.10.5 2016-07-27 2782 정다운
  • getCustomViewInfo에서 100000~500000 사이 값이 아닌 값 입력 이후 Mercury 작동이 안되던 버그 수정
  • 리뷰 팝업 UI 수정
  • 오늘 하루다시보지 않기로 호출하는 경우 오늘하루 다시보지 않기 체크박스가 노출되지 않도록 변경
  • Mercury Bundle v2.1 버전 필수 적용
2.10.4 2016-06-17 2775 정다운
  • 간헐적으로 발생하던 Crash 이슈 수정.
2.10.3 2016-04-12 2766 김규진
  • Mercury 요청시 서버에 UID 값을 보내도록 수정.
  • Resource 해상도 개선.
2.10.2 2016-02-01 2751 김규진
  • 개별 서버 설정값이 반영되도록 수정
2.10.1 2016-01-04 2737 김규진
  • 샌드박스 환경 지원
  • Custom View & Board 지원
  • Hive Interwork 지원
  • Enum 값 변경
2.8.3 2015-09-09 2724 김규진
  • iOS 8 이상에서 사용되는 UIAlertController 때문에, 머큐리가 비정상적으로 노출되는 오류 수정.
  • HTTP Response code 500 시 발생하는 이슈 수정.
2.8.2 2015-09-01 2719 김규진
  • iOS 9 에서 포르투갈어 및 중국어 문구가 정상적으로 노출되지 않는 문제 수정.
  • 중국어 언어 코드 변경 (zh-Hant -> zh-hant, zh-Hans -> zh-hans)
2.8.1 2015-08-11 2709 김규진
  • Image만 동작하도록 되어 있던 Local cache가 전혀 동작하지 않던 버그 수정.
2.8.0 2015-08-11 2708 김규진
  • Review Popup API 추가
  • Header ENUM Value 추가 및 변경
2.7.5 2015-06-29 2695 김규진
  • Heade define 타입 및 Value 변경
  • CustomViewInfo API 매개변수 자료형 변경
  • 상용, 테스트 서버 Cookie 도메인 오류 Fixed
2.7.3 2015-06-17 2678 김규진
2.7.1 2015-06-17 2678 김규진
  • Mercury server domain 변경.
    • 변경 전 : m.mercury.com2us.com
    • 변경 후 : m-mercury.qpyou.cn
2.7.0 2015-06-04 2675 김규진
  • 뱃지 정보를 가져오기 위한 API 추가
  • Enum 타입 추가 및 변경 (레퍼런스 가이드 참고)
2.6.0 2015-04-02 2662 김규진
  • Mercury API 간소화 (Enum Type 참조)
2.5.5 2015-04-06 2656 김규진
  • Link 이동 속도 개선
2.5.4 2015-03-20 2652 김규진
2.5.2 2015-03-05 2647 김규진
  • UI 언어지원 확대 (총 16개 언어)
기존 8개 언어 - English, Korean, French, German, Chinese(간체), Chinese(번체), Russian
추가 8개 언어 - Spanish, Portuguese, Indonesian, Malay, Vietnamese, Thai, Italian, Turkish
2.5.1 2015-02-06 2639 김규진
  • 간/번체 번역 오류 수정
  • LoadingView 모서리 살짝 뛰어나온 것 수정
  • CommonModule에서 MCC, MNC 가져옴
  • Mercury 이미지만 캐싱하도록 수정.
  • 최소 빌드 버젼 iOS 6.0 으로 변경
2.5.0 2015-01-07 2630 조태형
  • arm64 지원
  • TouchJson lib 제거 (TouchJson lib 삭제하세요)
2.4.0 2014/11/26 2613 조태형
  • 대배너 UI 변경
  • UI resource 변경 ( bundle로 변경되었습니다. 기존 Image는 삭제하여 주세요.)
  • [변경사항 참고]
2.3.13 2014/10/27 2592 이진우
  • 최신 Xcode에서 Mercury Init 할때 죽는 문제.
2.3.12 2014/10/07 2586 이진우
  • Mercury 창이 여러 개일 경우, '하루안보기' 안되는 문제 수정
2.3.11 2014/09/30 2577 이진우
  • iOS8 및 Xcode5, Xcode6 빌드 환경 대응
  • Mercury view 이외의 음영 영역에서 Touch 되던 문제 수정
2.3.7 2014/07/10 2564 이진우
  • MercuryShowEx API 추가. (여러 가지 추가 정보를 머큐리 서버에 보낼 수 있음.)
  • callback에서 MERCURY_NETWORK_DISCONNECT을 제공하지 않습니다.
2.3.5 2014/04/30 2553 이진우
  • 전면배너 하루 안 보기 문제 수정. (BackOffice에서 매번 노출 상태일 경우)
2.3.4 2014/03/24 2544 조태형
  • DID 값 가져오는 로직 변경
  • 서버쪽으로 data 구성하는 부분에서 data 누락으로 mercury 안보이는 문제 수정.
2.3.3 2014/03/12 2542 조태형
  • Loading 문구 추가.
  • 전면배너 배경색 검정, 공지 배경색 흰색으로 변경
  • AU를 통한 DID값 가져오는 부분 로직 변경.
2.3.2 2014/02/13 2531 김혜란
  • Reachability.h 충돌 방지
2.3.1 2014/02/12 2530 김혜란
  • 전면배너 기능 추가.
  • 다중 웹뷰 기능 추가.
  • 각 show api에 uid 파라미터 받도록 수정.
2.1.0 2013/12/16 2519 김혜란
  • 닫기 버튼 터치 영역 확장.
2.0.2 2013/08/22 2462 김혜란
  • 모듈 버전 수집 기능 추가
  • 서버 프로토콜 DID 정보 추가
2.0.1 2013/07/31 2427 김혜란
  • 머큐리 웹뷰의 사이즈가 단말 사이즈로 변경되었습니다.
    • 사이즈 때문에 추가적인 처리(터치 및 배경 알파처리)가 있으셨다면 제거해주셔도 좋습니다.
  • 머큐리의 웹뷰가 공지와 이벤트 두 가지를 제공합니다.
    • 공지
      • 일반 노출 함수 : CS_MercuryShowForNotice()
      • 강제 노출 함수 : CS_MercuryForcedShowForNotice()
      • 콜백 : MERCURY_NOTICE_OPEN, MERCURY_NOTICE_CLOSE
    • 이벤트
      • 일반 노출 함수 : CS_MercuryShowForEvent()
      • 강제 노출 함수 : CS_MercuryForcedShowForEvent()
      • 콜백 : MERCURY_EVENT_OPEN, MERCURY_EVENT_CLOSE
  • 뉴스배너 CPI 및 이벤트 개인화 페이지의 사용을 위한 함수 void CS_MercurySetUid(const char* uid)가 추가되었습니다.
    • 로그인 완료 콜백을 받고 난 후, 적용하시는 것을 권고드립니다.
  • 하루 안 보기 기능이 추가되었습니다.
    • 웹 페이지 상에서 하루 안 보기를 체크하면 그에 해당하는 페이지 타입(공지/이벤트)만 하루 안 보기가 적용이 됩니다.
    • CS_MercuryForcedShowForNotice(), CS_MercuryForcedShowForEvent()를 호출했을 때에는 상관없이 보이게 됩니다.
    • 해당 기능은 24시간이 아닌, 체크한 날짜에 따라 호출 여부가 결정 됩니다.
1.0.3 2013/07/26 2422 김혜란
  • 쿠키가 App ID를 굽지 못하는 문제 수정
1.0.2 2013/07/16 2411 김혜란
  • Load First 기능을 추가하여, 웹 내용을 먼저 로딩할 수 있도록 수정.
    • CS_MercuryLoadFirst()를 CS_MercuryShow()이전에 호출하여, 웹페이지를 Initialize시점에 로딩할 수 있도록 합니다.
      로딩을 먼저하여 실제 머큐리가 로딩되는 시점에서는 미리 로딩된 웹페이지를 보여주기 때문에 좀더 로딩이 빨라진 것처럼 보이게 합니다.
      항상 CS_MercuryLoadFirst()는 CS_MercurySetCallback()이후, CS_MercuryShow()와 CS_MercuryForcedShow()이전 시점에 호출되어야 합니다.
1.0.1 2013/05/02 2279 김혜란
  • Mercury OPEN 콜백 추가
1.0.0 2013/03/01 김혜란
  • Mercury 배포


모든 버전의 역사 보기

공통 유의 사항

<작성법 참고>

Mercury적용 시 유의 사항

  • Active User -> Hive Login -> Mercury 초기화 및 SetUID 설정 순서로 모듈이 실행되도록 적용한다
    위 순서로 하지 않으면 Mercury관련 서버에 UID Log가 남지 않는다
<작성법 참고>

App ID 등록

  • 앱 아이디, 노출 여부, 노출시킬 배너를 백오피스에 등록해야 합니다.
    • 앱 정보를 등록하지 않을 경우 배너가 노출되지 않습니다.
<작성법 참고>

UI제작 필요

  • Mercury 공지사항 노출 함수(ShowNotice)를 사용하기 위한 버튼 UI제작이 필요합니다.
<작성법 참고>

함수호출 위치

  • CS_MercuryShowForNotice와 CS_MercuryForcedShowForNotice 함수가 호출되는 위치는 같은 Scene에서 이루어지도록 해야 합니다.
CS_MercuryShowForEvent와 CS_MercuryForcedShowForEvent 함수도 동일합니다.
<작성법 참고>

서버 에러 로그

  • 서버에서 미노출 상태에 대한 에러로그를 클라이언트 로그로 출력하고 있습니다. 해당 로그들을 확인하고 문의하면 좀 더 빠른 답변을 얻으실 수 있습니다.
    • error number : 0, msg : success => 성공
    • error number : 1, msg : post data is null => 클라이언트로부터 받은 post 데이터가 없음
    • error number : 2, msg : some data are missing => App ID, language, action 의 중요한 정보가 없음
    • error number : 3, msg : cannot find mercury main info => 머큐리 메인 정보를 찾을 수 없음 : App ID 미등록일 확률이 높음.
    • error number : 5, msg : cannot find cpi/event info => 전면배너에 등록될 이벤트나 CPI정보가 없음: 웹뷰개수가 1개이고 전면배너만 노출하도록 설정했을 경우.
<작성법 참고>

YouTube 동영상 프로모션 (Android & iOS Mercury v2.11.0+)

  • YouTube 동영상 링크가 담긴 스키마를 프로모션 페이지의 링크로 설정하여 Mercury에서 재생 가능
    • 스키마 형태
c2smercury://videoplay?{pid}|{time_to_show_close_btn}|{time_to_remain_close_btn}|{URL}

// ex ) c2smercury://videoplay?200001|4|2|https://www.youtube.com/watch?v=0gIOjN_kmKc
// - pid : 프로모션
// - time_to_show_close_btn : 동영상 종료 버튼 최초 노출 시간(sec)
// - time_to_remain_close_btn : 종료 버튼 노출 시 화면에 유지 시간(sec)
// - URL : YouTube 동영상 경로
  • 스키마 호출을 통해 동영상이 재생될 때 MERCURY_RESULT에서 콜백(MercuryCB)로 'MERCURY_VIDEO_PROMOTION_START = 17' 값이 전달됩니다. 해당 콜백을 받았다면 게임 사운드를 낮추거나 음소거하여 동영상 사운드와 겹치지 않게 조정합니다.
  • 동영상이 종료되면 (닫기 버튼을 누르거나 재생 완료) 'MERCURY_VIDEO_PROMOTION_FINISH = 18' 값이 전달됩니다. 해당 콜백을 받았다면 게임 사운드를 올리거나 복구하여 소리 재생이 가능하도록 합니다. [콜백 타입값 확인하기]
  • 커스텀 보드를 통해 아래 예시처럼 스키마 링크를 설정할 수 있습니다.

mercury 2 11 0 videopromotionsetting.png

  • 동영상 프로모션 사용을 위한 Android 및 iOS 프로젝트 설정
    • Android
      • .jar 파일 추가 : YouTubeAndroidPlayerApi.jar
      • 리소스 추가 : [리소스 확인하기]
      • AndroidManifest.xml에 추가
        <activity
           android:name="com.com2us.module.mercury.MercuryVideoActivity"
           android:hardwareAccelerated="true"
           android:screenOrientation="sensorLandscape"
           android:launchMode="standard"/>
        <!-- 동영샹 재생 시 노출되는 화면 방향은 screenOrientation 설정 값으로 변경 가능 -->
    • iOS
      • WebKit.framework을 추가
  • 동영상 프로모션 설정 시 '플랫폼 서버팀 박충렬 책임, 배하석 선임' 으로 문의바랍니다.
<작성법 참고>

YouTube 동영상 프로모션 기능 강화 (Android & iOS Mercury v2.12.4+)

  • YouTube에서 제공하는 다양한 옵션을 사용할 수 있도록 기능이 업데이트 되었습니다
    • (1-1) Android 설정하기
      • YouTubeAndroidWebPlayerApi.aar 라이브러리를 추가하고 참고해야합니다.
      • AndroidManifest.xml에 아래 내용을 추가합니다.
<application>
...
    <activity
           android:name="com.com2us.module.mercury.MercuryWebVideoActivity"
           android:hardwareAccelerated="true"
           android:screenOrientation="sensorLandscape"
           android:theme="@style/Theme.AppCompat.NoActionBar"/>
<!-- 동영샹 재생 시 노출되는 화면 방향은 screenOrientation 설정 값으로 변경 가능 -->
...
<application/>


<작성법 참고>

UserAcquisition 친구 초대 링크 전송 기능 (Android Mercury v2.13.0+, iOS Mercury v2.13.1+)

  • UserAcquisition 친구 초대 링크 전송 기능을 사용할 수 있도록 업데이트 되었습니다.
    • 딥링크 스키마를 받을 수 있도록 설정하기 (Android / iOS)
      • Android Mercury v2.13.0, iOS Mercury v2.13.1 이상 라이브러리를 추가하고 참조해야합니다.
        (Android Mercury v2.12.7, iOS Mercury v2.12.8 버전에 해당 기능이 포함되었으나 해당 버전은 정식 배포된 버전이 아닙니다.)
      • Android ModuleManager v2.5.12 이상 라이브러리를 추가하고 참조해야합니다.
      • [Android] AndroidManifest.xml 및 build.gradle 에 아래 내용을 추가합니다.
        <!-- AndroidManifest.xml -->
        <application>
        <!--...(생략)...-->
            <!-- 메인이 되는 런쳐 액티비티에 설정합니다 -->
            <activity ... (생략)...
                   <intent-filter >
                        <action android:name="android.intent.action.VIEW" />
                        <category android:name="android.intent.category.DEFAULT" />
                        <category android:name="android.intent.category.BROWSABLE" />
                        <data android:scheme="com.com2us.hivesdk.normal.freefull.google.global.android.common" /> <!-- 앱 아이디를 본 프로젝트 것으로 수정해주세요 -->
                        <!-- 해당 설정을 추가해야 '초대를 받는 유저'가 딥링크를 터치하였을때 앱이 딥링크 스키마를 수신할 수 있습니다. -->
                    </intent-filter>
                </activity>
        <!--...(생략)...-->
        <application/>
        <!-- AndroidManifest.xml -->
        <application>
        <!--...(생략)...-->
            <!-- 페이스북 공유 시 필요한 설정입니다. -->
               <provider
                   android:name="com.facebook.FacebookContentProvider"
                   android:authorities="com.facebook.app.FacebookContentProvider${facebook_app_id}"
                   android:exported="true" />
            <!-- facebook 앱아이디를 facebook_app_id라는 변수와 같이 사용할 경우 위와 같이 추가 -->
            <!-- facebook 개발자 사이트에서 제공하는 아래 가이드 스크린샷을 참고 바랍니다. -->
        <!--...(생략)...-->
        <application/>
        facebook contentProvider 설정.png
        // build.gradle에서 facebook의 share 라이브러리를 추가합니다.
        'com.facebook.android:facebook-share:5.4.+'
      • [iOS] 스키마가 전달될 수 있도록 'URL Scheme 추가'을 참고하여 등록합니다. 스키마의 형태는 아래 내용을 참고 바랍니다.
        // 딥링크 터치로 진입 시 액티비티로 들어오는 스키마 형태
        com.com2us.hivesdk.normal.freefull.google.global.android.common://hivePromotionDeepLinkInvite?uatoken=eyJ0eXAiOiJKV1QiLCJhbGciOiJ
  • 초대 링크를 전달하는 입장
    • (1) UserAcquisition 초대 링크 및 메시지 정보를 프로모션 서버에 요청
      • UserAcquisition 초대 링크 및 메시지 정보를 반환 받는 API를 호출하여 초대 링크("invite_link")와 초대 메시지("invite_message")를 얻을 수 있습니다.
      • 정보를 반환 받는 API 호출 시 초대 링크를 전달하는 유저의 uid와 프로모션 서버와 사전에 논의된 uatoken 정보를 API의 additionalInfo 파라미터에 넣어 전달합니다. (uatoken 값은 json 포멧으로 전달하며 uatoken 키는 모두 소문자입니다.) (uatoken 값은 초대를 받는 경우 검증에 사용될 수 있으니 게임 서버 등에서 관리 바랍니다.)
        // 반환 데이터 형태
        {"uainfo":{"result_code":"0","result_message":"success","invite_message":"HIVE SDK에 초대합니다. 함께 플레이 하면 즐거움이 두 배 ★☆ 초대문구","invite_link":"http:\/\/test-ua.withhive.com\/ko\/ua684c?t=1571725383"}}
        // result_code 목록
        /**
        0     RESULT_SUCCESS                   성공      
        100     RESULT_ERROR_SERVER              서버 오류          
        200     RESULT_ERROR_PARAMETER           파라메타 전송 오류      
        201     RESULT_ERROR_INVALID_PARAMETER   파라메타 유효성 오류      
        300     RESULT_ERROR_DATABASE            데이터베이스 오류        
        301     RESULT_ERROR_QUERY_FAILED        쿼리 실패        
        302     RESULT_ERROR_DATA_NOT_FOUND      조회 실패
        */
    • (2) 초대 링크와 초대 메시지를 활용하여 초대 기능 호출
      • 앞서 얻은 초대 링크와 초대 메시지를 활용하여 초대 기능 API를 호출합니다.
      • 초대 기능 API를 호출할 경우 초대 링크와 초대 메시지를 전달할 애플리케이션을 선택하는 UI가 노출됩니다. 애플리케이션을 선택하거나 클립보드에 내용을 복사하는 기능을 사용할 수 있습니다.
        UA 초대링크전달.png
  • 초대 링크를 받는 입장
    • (1) 초대로 온 링크를 터치합니다.
      • 링크를 터치할 경우 사전에 구성된 웹 페이지가 오픈됩니다. (웹 페이지가 정상 노출되지 않을 경우 GCP 서버팀 프로모션 담당자분께 문의 바랍니다.)
      • 웹 페이지는 '앱 실행', '앱 설치' 버튼을 지원합니다. 앱이 설치되어있지 않을 경우 '앱 설치' 버튼을 눌러 앱이 설치되도록 가이드 부탁드립니다. 앱이 설치되어있을 경우 '앱 실행' 버튼을 눌러 초대 링크에 대한 보상을 받을 수 있습니다.
        UA 초대링크페이지.png
    • (2) '앱 실행'을 통해 앱에 진입한 경우
      • Android/iOS에서 스키마를 받을 수 있는 설정이 정상적으로 되어있다면 아래와 같은 형태의 스키마가 넘어옵니다. 해당 스키마의 'hivePromotionDeepLinkInvite?' 이후 값을 파싱하여 uatoken 값을 받을 수 있습니다.
        // 딥링크 터치로 진입 시 액티비티로 들어오는 스키마 형태
        com.com2us.hivesdk.normal.freefull.google.global.android.common://hivePromotionDeepLinkInvite?uatoken=eyJ0eXAiOiJKV1QiLCJhbGciOiJ
      • Android에서 스키마를 파싱하는 경우 activity에서 intent 데이터를 획득하여 onResume과 onNewIntent 메서드와 아래와 같이 구현할 수 있습니다.
        // Android 예시 코드입니다. 참고 바라며 앱에서 보다 편리한 방법으로 구현하셔도 됩니다.
        @Override
        protected void onResume() {
                super.onResume();
                Intent intent = getIntent();
                Uri data = intent.getData();

                if(data != null) {
                        Log.d("UATest", "onResume data : " + data.toString());

                        String[] schemeArr = data.toString().split("'hivePromotionDeepLinkInvite\\?");
                        if(schemeArr.length > 1) {
                                String[] dataSetArr = schemeArr[1].split("&");
                                for(int i = 0; i < dataSetArr.length; i++) {
                                        String[] keyValueArr = dataSetArr[i].split("=");
                                        if(keyValueArr.length > 1 && keyValueArr[0].equals("uatoken")) {
                                                uaToken = keyValueArr[1];
                                                Log.d("UATest", "onResume receivedUaToken : " + uaToken);

                                                showDialogMsg("[초대받은 유저 UA Token 획득 성공]");
                                                break;
                                        }
                                }
                        }
                }

                Log.d("UATest", "onResume intent : " + intent.toString());
        }

        @Override
        protected void onNewIntent(Intent intent) {
                super.onNewIntent(intent);

                Bundle intentBundle = intent.getExtras();
                Uri data = intent.getData();

                if(data != null) {
                        Log.d("UATest", "onNewIntent data : " + data.toString());

                        String[] schemeArr = data.toString().split("hivePromotionDeepLinkInvite\\?");
                        if(schemeArr.length > 1) {
                                String[] dataSetArr = schemeArr[1].split("&");
                                for(int i = 0; i < dataSetArr.length; i++) {
                                        String[] keyValueArr = dataSetArr[i].split("=");
                                        if(keyValueArr.length > 1 && keyValueArr[0].equals("uatoken")) {
                                                uaToken = keyValueArr[1];
                                                Log.d("UATest", "onNewIntent receivedUaToken : " + uaToken);

                                                showDialogMsg("[초대받은 유저 UA Token 획득 성공]");
                                                break;
                                        }
                                }
                        }
                }

                Log.d("UATest", "onNewIntent intent : " + intent.toString());
        }
      • iOS에서 스키마를 파싱하는 경우 아래와 예시와 같이 구현할 수 있습니다.
        // iOS 예시 코드입니다. 참고 바라며 앱에서 보다 편리한 방법으로 구현하셔도 됩니다.

        - (BOOL)application:(UIApplication*)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
           
            NSLog(@"TTTESTTT URL : %@",url);
           
            NSDictionary* dict = [self queryDictionaryFromURL:url];
           
            if(dict!=nil && dict[@"uatoken"]!=nil){
                [[NSUserDefaults standardUserDefaults] setObject:dict[@"uatoken"] forKey:@"mercury_sample_uatoken"];
                [[NSUserDefaults standardUserDefaults] synchronize];
            }
           
            return YES;
        }

        - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options
        {
            return [self application:app openURL:url sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey] annotation:options[UIApplicationOpenURLOptionsAnnotationKey]];
        }


        - (NSDictionary *)queryDictionaryFromURL:(NSURL *)url
        {
            NSString* query = url.query;
            if (query == nil || query.length == 0)
                return nil;
           
            NSArray* components = [query componentsSeparatedByString:@"&"];
            NSMutableDictionary* dict = [@{} mutableCopy];
           
            for (NSString* component in components) {
                if ([component isEqualToString:@""]) continue;
               
                NSRange range    = [component rangeOfString:@"="];
                if (range.location == NSNotFound) {
                    [dict setObject:@"" forKey:component];
                }
                else {
                    NSString* key    = [component substringToIndex:range.location];
                    NSString* value    = [component substringFromIndex:range.location + range.length];
                    [dict setObject:value forKey:key];
                }
            }
           
            return dict;
        }
      • uatoken 값을 게임 서버 등에 관리하고 있는 값인지 확인하여 이상이 없는 경우 초대 링크로 들어온 인원에 보상을 할 수 있습니다.


프로젝트 설정

Resource 설정


프로젝트 빌드 설정

라이브러리 추가


헤더 추가


Other Linker Flags

  • 프로젝트의 타겟을 클릭한 후 우측 상단의 검색창에 Other Linker Flags를 입력합니다.
    • 검색 결과가 나오지 않을 경우에는 메뉴 탭을 Basic에서 All로 변경해주세요.
  • Debug와 Release를 더블 클릭 한 후 다음 내용을 입력합니다.


Mercury OtherLinkerFlags01.png


  • debug: -lC2SActiveUser_$(PLATFORM_NAME)d -lC2SMercury_$(PLATFORM_NAME)d -lC2SCommonModule_$(PLATFORM_NAME)d -ObjC
  • release: -lC2SActiveUser_$(PLATFORM_NAME) -lC2SMercury_$(PLATFORM_NAME) -lC2SCommonModule_$(PLATFORM_NAME) -ObjC

Search Paths

  • 프로젝트 타겟 선택 후 우측 상단 검색창에서 Search Paths를 입력합니다.
    • 검색 결과가 나오지 않을 경우에는 메뉴 탭을 Basic에서 All로 변경해주세요.
  • Header Search Paths와 Library Search Paths를 더블 클릭 한 후 모듈의 경로를 수정 합니다.
  • 사용자마다 모듈의 경로가 다를 수 있습니다. 자신의 경로에 맞게 적절히 입력해주세요.


Framework

  • SystemConfiguration.framework 를 추가합니다.
  • CoreTelephony.framework 를 추가합니다.
  • MessageUI.framework 를 추가합니다.
  • WebKit.framework 를 추가합니다. (2.11.0+, YouTube 동영상 프로모션)

튜토리얼

Callback 함수 추가

사용하려는 위치에 아래 예시처럼 콜백 함수를 추가.

Mercury 상태 콜백

void mercuryCB(MERCURY_RESULT result){
    switch(result){
        case MERCURY_OPEN:
            NSLog(@"MERCURY_OPEN");
            break;
        case MERCURY_CLOSE:
            NSLog(@"MERCURY_CLOSE");
            break;
        case MERCURY_FORCED_OPEN:
            NSLog(@"MERCURY_FORCED_OPEN");
            break;
        case MERCURY_FORCED_CLOSE:
            NSLog(@"MERCURY_FORCED_CLOSE");
            break;
        case MERCURY_NETWORK_DISCONNECT:
            NSLog(@"MERCURY_NETWORK_DISCONNECT");
            break;
        default:
            break;
    }
}

iOS 사용 예시

Full banner 이벤트 노출

    CS_MercurySetCallBack(mercuryCB);
    CS_MercurySetUid(UID);
    CS_MercuryShowEx(UID, MERCURY_SHOW_EVENT, "");

Mercury Sample

전체적인 흐름은 program/wrapper/sample/iOS/MercuryTestApp을 참고


Com2uS 공통모듈 >> Mercury >> Mercury 모듈 적용 가이드 (iOS)

Mercury 모듈 적용 가이드 (Android)

Mercury 모듈 적용 가이드 (Unity3d)

>> Mercury 모듈 레퍼런스 가이드 >> Mercury FAQ
개인 도구
이름공간

변수
행위
둘러보기
도구모음
인쇄/내보내기