Web
개요
NAM 광고를 HTML Element에 연결하여 즉시 송출합니다.
기기에서 광고 ID 수집이 허용되어 있어야 광고 송출이 가능합니다.
설치
Android Native SDK
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    val webView = findViewById<WebView>(R.id.wvWebView)
    // Web SDK 연동하는 WebView 설정
    webView.settings.apply {
        javaScriptEnabled = true // 자바스크립트 활성화
        domStorageEnabled = true // DOM 스토리지 활성화
    }
    
    // JavaScript Interface 추가
    webView.addJavascriptInterface(
        SPCWebView.SPCWebBridge(context = context, webView = webView),
        SPCWebView.WEB_VIEW_BRIDGE
    )
}WebVieiw 내 Javascript 및 Local storage 활성화
Javascript Interface 설정
addJavascriptInterface 함수를 이용해 AvatyeWebBridge를 설정합니다.
이후에는 Web SDK를 확인해 웹 페이지 내에 배너를 지정하여 광고를 송출할 준비를 진행합니다.
iOS Native SDK
class webSDKTestViewController: ViewController {
    var webView: WKWebView = WKWebView()
    var pageUrl = "test.html"
    
    override func viewDidLoad(){
        super.viewDidLoad()
        
        // 웹뷰에 Javascript Bridge 설정
        let scriptMessageHandler = AvatyeWebSDKController(rootWebView: webView)
        webView.configuration.userContentController.add(scriptMessageHandler, name: "AvatyeBridge_SPC")
        
        // 웹뷰 Delegate 설정
        webView.navigationDelegate = self
        
        // 웹뷰를 뷰에 추가
        view.addSubview(webView)
        // 웹 페이지 로드
        if let url = URL(string: pageUrl) {
            let request = URLRequest(url: url)
            webView.load(request)
        }
    }
}
// WKWebview Delegate 구현
extension webSDKTestViewController: WKNavigationDelegate{
  func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        guard let url = navigationAction.request.url, url.absoluteString != "about:blank" else {
            decisionHandler(.cancel)
            return
        }
      
        if url.absoluteString != pageUrl {
            // 웹뷰에서 사용중인 url과 다를 경우, 기본 브라우저로 오픈 처리
            UIApplication.shared.open(url, options: [:]) { isSuccess in
                // after open
            }
            decisionHandler(.cancel)
        } else {
            // 웹뷰 내에서 랜딩
            decisionHandler(.allow)
        }
  }
}AvatyeWebSDKController에 rootWebView 객체를 설정 후 생성해줍니다.
AvatyeWebSDKController를 생성 후, “AvatyeBridge_SPC” 이름으로 scriptMessageHandler를 등록해줍니다.
기본브라우저에서 랜딩을 처리할 수 있도록 Delegate를 구현합니다.
이후에는 Web SDK를 확인해 웹 페이지 내에 배너를 지정하여 광고를 송출할 준비를 진행합니다.
Web SDK
<Html>
    <Head>
    </Head>
    <body>
        // 상용
        <script src={'https://avatye-resources.s3.ap-northeast-2.amazonaws.com/pointhome/webSdk/spc/pointhome-{version}.min.js'} />
        // 테스트
        <script src={'https://avatye-resources.s3.ap-northeast-2.amazonaws.com/pointhome/webSdk/spc/pointhome-{version}-test.min.js'} />
    </body>
</Html>script 태그를 <body> 태그 내부의 하단에 추가합니다.
대역별로 파일명이 구분됩니다.
상용: pointhome-1.0.4.min.js
테스트: pointhome-1.0.4-test.min.js
스크립트의 URL이 v1.0.4부터 변경되었습니다.
https://avatye-resources.s3.ap-northeast-2.amazonaws.com/pointhome/webSdk/spc/pointhome-1.0.4.min.js
(이전 레거시 파일(v1.0.4 미만)들은 기존 경로에서도 import 가능합니다.)
사용법
// 최초 initialize하여 지면 세팅에 필요한 데이터를 초기화합니다.
Pointhome.NAM.init({
    pubID: '868410196', // 앱 키
    eventListener: { // NAM EventListener 등록 (Optional)
      onLoaded: (elementID) => {
          // elementID: 광고가 등록된 elementID
          console.log("onLoaded", elementID)
      },
      onClicked: (elementID) => {
          // elementID: 광고가 등록된 elementID
          console.log("onClicked", elementID)
      },
      onError: (elementID, stat) => {
          // elementID: 광고가 등록된 elementID
          // stat: 에러 코드 (0: error (invalid ad unit id, ...), 2: no ad, 3: timeout)
          console.log("onError", elementID, stat)
      },
    },
});
// 지면 1개 세팅
Pointhome.NAM.setPlacements({
    elementID: 'ph-NAM', // 광고 노출 영역 (HTML Element)의 ID
    placementID: 'njsSWrFDZs3HRZK', // 지면 ID
    adUnitID: 'WEB_nw_banner-N345765840', // NAM 광고 유닛 ID
    onClick: (elementID, curl) => { // 지면 클릭 이벤트 (curl을 통한 랜딩 처리)
      console.log("onClick", elementID, curl);
    }
});
// 지면 n개 세팅 (배열 param으로 전달)
Pointhome.NAM.setPlacements([
    {
        elementID: 'ph-NAM',
        placementID: 'njsSWrFDZs3HRZK',
        adUnitID: 'WEB_nw_banner-N345765840',
        onClick: (elementID, curl) => {
          console.log("onClick", elementID, curl);
        },
    },
    {
        elementID: 'ph-NAM-2',
        placementID: 'njsSWrFDZs3HRZK',
        adUnitID: 'WEB_nw_banner-N345765840',
        onClick: (elementID, curl) => {
          console.log("onClick", elementID, curl);
        },
    },
]);
// initialize와 동시에 지면 세팅
Pointhome.NAM.init({
  pubID: '868410196',
}).then(() => {
    Pointhome.NAM.setPlacements({
        elementID: 'ph-NAM',
        placementID: 'njsSWrFDZs3HRZK',
        adUnitID: 'WEB_nw_banner-N345765840',
        onClick: (elementID, curl) => {
          console.log("onClick", elementID, curl);
        },
    });
})최초에 init()을 해야 합니다.
이후 원하는 만큼 지면을 세팅할 수 있습니다.
init()은 Promise로 동작하기에 동시에 지면 세팅을 진행하고자 할 경우, then()을 이용합니다.
Function
Parameter
Require
Description
init() : 세팅 초기화
pubID(String)
O
앱 키
eventListener (Object)
onLoaded: (elementID) => {
    console.log("onLoaded", elementID)
},
onClicked: (elementID) => {
    console.log("onClicked", elementID)
},
onError: (elementID, stat) => {
    console.log("onError", elementID, stat)
}X
이벤트 리스너 - onLoaded: NAM 로드 완료 시 밟생 - onClicked: NAM 지면 클릭 시 발생 - onError: NAM 로드 실패 시 발생
setPlacements() : 지면 세팅
elementID(String)
O
ex) ‘nam-1’
placementID(String)
O
지면 ID
adUnitID(String)
O
NAM 광고 유닛 ID
onClick (Function)
onClick: (elementID, curl) => {
  console.log("onClick", elementID, curl);
}O
지면 클릭 이벤트
elementID: 앨리먼트 id curl: 랜딩 URL
지면 샘플 스크린샷
Error
code
status
message
Description
init_required
-
필수 값이 세팅되지 않았습니다.
init()을 호출하지 않은 경우 발생
required_adid_agree
-
광고 ID 수집 동의가 필요합니다.
기기 설정에 광고ID를 받아오지 않게끔 설정되어 있는 경우
request_adid_failed
-
광고 ID를 가져오는데 실패했습니다.
브릿지 통신에 실패한 경우
invalid_parameter
400
${parameter} is not defined.
필요한 파라미터를 받아오지 못한 경우(SDK 에러)
Exception
-
-
네트워크 연결 불가능 또는 분류되지 않은 에러 발생 시
Last updated