BuzzBenefit Web 개발 연동 가이드

웹뷰 연동 개발

BuzzBenefit Web 연동 개발을 위해 필요한 JS 인터페이스, 디자인 선택사항(가이드) 등을 버즈빌 담당자에게 전달해 주시면 버즈빌에서 지면을 개발해서 웹 뷰 URL을 전달드리는 방식으로 연동이 진행됩니다.

도메인 연동

URL

  • url : {domain}?p=JTdCJTIyaWZhJTIyJTNBJTIyRVRFR0RHUkVHLTExQUFBLUJCQjIyMzQ1JTIyJTJDJTIyYWdlJTIyJTNBMzAlMkMlMjJzZXglMjIlM0ElMjJNJTIyJTJDJTIycGxhdGZvcm0lMjIlM0ElMjJBJTIyJTJDJTIyY2FycmllciUyMiUzQSUyMmt0JTIyJTJDJTIyZGV2aWNlX25hbWUlMjIlM0ElMjJTSFYtRTI1MFMlMjIlMkMlMjJyZWdpb24lMjIlM0ElMjIlRUMlODQlOUMlRUMlOUElQjglRUQlOEElQjklRUIlQjMlODQlRUMlOEIlOUMlMjAlRUElQjAlOTUlRUIlODIlQTglRUElQjUlQUMlMjIlN0Q=

  • p쿼리 값 생성하는법(예시는 자바스크립트)

    • 포함되어야하는 정보

      • [ puid - 매체사 암호화 유저ID, ifa - 광고 ID, birthday: 생년월일 또는(year_of_birth - 출생년도), gender - 성별, platform - OS정보, carrier - 통신사, device_name - 단말기기, region - 지역 ]

        • birthday의 우선순위가 year_of_birth보다 높습니다.(만나이 계산을 위함)

    • JSON string 생성

      • '{“puid”: “매체사 암호화 유저ID”,"ifa":”a31752d2-5d7e-4f41-a45c-af4d39d2fb2d",”birthday”:“yyyy-mm-dd“,"year_of_birth":”1989”,"sex":"M | F","platform":"A | I","carrier":"kt | skt | lgt | null","device_name":"SHV-E250S","region":"서울특별시 강남구"}'

    • uri인코딩 encodeURIComponent → base64encdoe : btoa(encodeURIComponent( json스트링값 ))

p쿼리에 포함해야하는 정보가 누락되면 광고가 정상적으로 할당되지 않을 수 있습니다.

JSON String에는 공백이 포함되면 안됩니다.

예시

  • { key: value } X

  • {key:value} O

    • {"key":"value 내부에는 공백이 허용되는 경우도 있습니다."} O

웹뷰 JS 인터페이스 버즈빌로 전달

광고 참여와 CS 처리를 위해 웹뷰를 동작시키는 JS 인터페이스 제공이 필요합니다.

  • 새탭 열기

  • 새탭 닫기

  • 외부 브라우저 열기

  • 공유하기(선택)

하기 인터페이스별 예시는 웹뷰에서 window.buzzvil.postMessage로 앱에 메시지를 보내면 앱에서 처리하는 구조의 예시입니다. 만약 자체적으로 사용하시는 인터페이스가 있다면 해당 인터페이스를 버즈빌 매니저에게 전달 부탁드립니다.

예시

import { NativeInterop } from "buzzbenefit-kit/native-interface"; export default class YourApp implements NativeInterop { openNewTab(data: string): void { this.#postMessage(JSON.stringify({ name: "openNewTab", data })); } closeTab(): void { this.#postMessage(JSON.stringify({ name: "closeTab" })); } openExternalBrowser(data: string): void { this.#postMessage(JSON.stringify({ name: "openExternalBrowser", data })); } share(data: string): void { this.#postMessage(JSON.stringify({ name: "share", data })); } #postMessage(message: string): void { try { (window as any).buzzvil.postMessage(message); } catch (e) { console.error(e); } } }

 

추가로, 어뷰징 방지를 위해 앱에서 연 브라우저인지 체크하는 기능 제공이 필요합니다.

  • 만약 제공되지 않는다면, 앱에서 연 브라우저인지 구분할 수 없어 웹뷰 진입이 막힙니다.

  • 앱에서 띄운 웹뷰가 맞는지 체크하는 js 인터페이스 제공 필요.

    • 만약 해당 인터페이스 제공이 어렵다면, 웹브라우저 user-agent에서 매체사 웹뷰를 구분할 수 있도록 사용하는 방식이 있는지 확인 필요

예시

const isBuzzvilWebview = () => /BUZZVIL\//.test(window?.navigator.userAgent);

 

포인트 적립을 위한 적립 포스트백 API 연동

  • 적립 포스트백 API 연동가이드

포인트 적립 포스트백 API 연동 문서를 참고해서 API를 연동해 주세요. (필독 : 가이드 링크)

 

  • ip 화이트리스팅 - 보안을 위한 인바운드 IP 화이트리스팅을 하고 계시다면, 아래 버즈빌 IP의 요청을 받아보실 수 있도록 예외 처리를 해주세요.

    • 18.179.158.39

    • 52.68.114.43

FAQ

  1. 웹뷰 JS 인터페이스 중 ‘웹뷰 열기’ 기능은 왜 필요한가요?

광고 상세 페이지 등 다른 페이지로 이동할때, 다른 도메인을 거쳐서 redirect되는 경우가 많습니다. 이럴 경우 페이지 이동후 백버튼이 정상동작하지 못하거나, 웹뷰사이드의 클라리언트 데이터들이 없어지기때문에 웹뷰 안에서 새로운 ‘웹뷰 열기’가 필요합니다.

 

  1. 웹뷰를 띄울 때 반드시 새탭으로 띄워야 한다고 나와있는데, 새창으로 띄우는 것과 차이가 있을까요?

pc로 보자면 크롬내에 새로운 탭 or 크롬으로 새창 띄우기와 같은 개념입니다. (단,둘다 인앱 웹뷰여야합니다.)

외부브라우저로 새 창을 띄우는 개념은 아닙니다.

* 만약 브라우저 히스토리가 없는 경우, 히스토리 백 하면 웹뷰가 닫히도록 구현되있어야하는 점 유의 부탁드립니다.

 

  1. 함수를 정의해서 사용 중인데 window 객체 등에 따로 정의를 해서 넘겨야하는지?

window 객체에 따로 정의해서 넘겨주시는 것을 가장 권장드립니다.