跳至主要内容

SDK8 AdMob Mediation Native

簡介​

將說明如何將 TAmedia SDK 原生廣告與 Google AdMob 原生廣告(Native advanced)做 mediation 整合,關於 AdMob mediation 請參考:https://developers.google.com/admob/ios/mediate

串接準備​

首先先完成 mediation 基本 setup AdMob Mediation Setup, TADCustomEvent 將會透過此客製化 class 取得 TADNativeAd。

實作方式​

TADCustomEventNative.swift

import Foundation
import GoogleMobileAds
import TAMediaAdsFramework


class TADCustomEventNative: NSObject {
var tadNativeAd: TADNativeAd?
var tadNativeAdView: TADNativeAdView?
var mappedImages = [GADNativeAdImage]()
var mapIcon: GADNativeAdImage?

var delegate: GADMediationNativeAdEventDelegate?
/// Completion handler called after ad load
var completionHandler: GADMediationNativeLoadCompletionHandler?

deinit {
print("TADCustomEventNative - TADMediatedUnifiedNativeAd deinit")
}

func loadNativeAd(for adConfiguration: GADMediationNativeAdConfiguration,
completionHandler: @escaping GADMediationNativeLoadCompletionHandler) {
self.completionHandler = completionHandler
let request = TADRequest()
request.showLog = true
let option = TADNativeAdOptions()
/// 參見 http://wiki.tamedia.com.tw/iosDoc/Classes/TADNativeAdOptions.html
// option.disableImageLoading = true //SDK 將不自動下載圖片
// option.mediaPreferImage = true //只會呈現圖片廣告
// option.startUnmuted = true //影片廣告會以非靜音方式呈現
// option.customControlsRequested = true //自行定義影音廣告的靜音/取消靜音、倒計時標籤和了解更多按鈕
// option.allowAudioSessionControl = false //設為false則需自行設定影音廣告出現時 AVAudioSession 狀態
tadNativeAd = TADNativeAd(adUnitId: adConfiguration.credentials.settings["parameter"] as? String)
tadNativeAd?.delegate = self
tadNativeAd?.load(request, withOption: option)
}

private func setup(nativeAd: TADNativeAd, nativeAdView: TADNativeAdView) {
tadNativeAd = nativeAd
tadNativeAdView = nativeAdView

tadNativeAd?.delegate = self
tadNativeAdView?.mediaView?.statusDelegate = self
guard let mediaContent = tadNativeAd?.adContent.mediaContent else {
return
}
if let tadImage = mediaContent.image1200x627?.image {
let adImage = GADNativeAdImage(image: tadImage)
tadNativeAdView?.mediaView?.setMainImage(image: tadImage)
mappedImages.append(adImage)
}
if let iconImage = tadNativeAd?.adContent.iconSquare?.image {
mapIcon = GADNativeAdImage(image: iconImage)
}
}
}

extension TADCustomEventNative: TADNativeAdDelegate {
func nativeAdDidReceive(_ ad: TADNativeAd!) {
let nativeAdView = TADNativeAdView()
let mediaView = TADNativeMediaView(frame: .zero)
mediaView.mediaContent = ad.adContent.mediaContent
/// 參見 http://wiki.tamedia.com.tw/iosDoc/Classes/TADNativeMediaView.html
// mediaView.setCallToActionVisible(false) //是否顯示 CTA 按鈕
// mediaView.setCallToActionTextSize(12) //設定 CTA 文字大小
// mediaView.setVolumeImageSize(24) //設定影音廣告靜音圖片大小
// mediaView.setVideoCountdownTextSize(17) //設定影音倒數文字大小
nativeAdView.addSubview(mediaView)
nativeAdView.mediaView = mediaView

setup(nativeAd: ad, nativeAdView: nativeAdView)

if let handler = completionHandler {
delegate = handler(self, nil)
}
}

func nativeAd(_ ad: TADNativeAd!, didFailToReceiveAdWithError error: TADRequestError!) {
if let handler = completionHandler {
delegate = handler(nil, error)
}
}

func nativeAdDidImpression(_ ad: TADNativeAd!) {
print("TADCustomEventNative - nativeAdDidImpression")
delegate?.reportImpression()
}

func nativeAdDidClick(_ ad: TADNativeAd!) {
print("TADCustomEventNative - nativeAdDidClick")
delegate?.reportClick()
}

}

extension TADCustomEventNative: TADVideoStatusDelegate {
func didStartVideo() {
delegate?.didPlayVideo()
}

func didPlayVideo() {
delegate?.didPlayVideo()
}

func didPauseVideo() {
delegate?.didPauseVideo()
}

func didEndVideoPlayback() {
delegate?.didEndVideo()
}

func didMuteVideo() {
delegate?.didMuteVideo()
}

func didUnmuteVideo() {
delegate?.didUnmuteVideo()
}
}

extension TADCustomEventNative: GADMediationNativeAd {
var headline: String? {
return tadNativeAd?.adContent.longSubject
}

var images: [GADNativeAdImage]? {
return mappedImages
}

var body: String? {
return tadNativeAd?.adContent.body
}

var icon: GADNativeAdImage? {
return mapIcon
}

var callToAction: String? {
return tadNativeAd?.adContent.callToAction
}

var starRating: NSDecimalNumber? {
return nil
}

var store: String? {
return nil
}

var price: String? {
return nil
}

var advertiser: String? {
return nil
}

var extraAssets: [String: Any]? {
return nil
}

var mediaView: UIView? {
return tadNativeAdView?.mediaView
}

var hasVideoContent: Bool {
guard let mediaContent = tadNativeAd?.adContent.mediaContent else {
return false
}
return mediaContent.isVideoContent
}

func handlesUserClicks() -> Bool {
return true
}

func handlesUserImpressions() -> Bool {
return true
}

func didRender(in view: UIView, clickableAssetViews: [GADNativeAssetIdentifier : UIView], nonclickableAssetViews: [GADNativeAssetIdentifier : UIView], viewController: UIViewController) {
guard let tadNativeAdView = tadNativeAdView else { return }

view.subviews.first { $0 is TADNativeAdView }?.removeFromSuperview()
view.insertSubview(tadNativeAdView, at: 0)
fillSuperView(view: tadNativeAdView)

if let titleLabel = clickableAssetViews[GADNativeAssetIdentifier.headlineAsset] as? UILabel {
titleLabel.isUserInteractionEnabled = true
tadNativeAdView.longSubjectLabel = titleLabel
}

if let bodyLabel = clickableAssetViews[GADNativeAssetIdentifier.bodyAsset] as? UILabel {
bodyLabel.isUserInteractionEnabled = true
tadNativeAdView.bodyLabel = bodyLabel
}

if let ctaLabel = clickableAssetViews[GADNativeAssetIdentifier.callToActionAsset] {
ctaLabel.isUserInteractionEnabled = true
tadNativeAdView.callToActionView = ctaLabel
}

if let icon = clickableAssetViews[GADNativeAssetIdentifier.iconAsset] as? UIImageView {
icon.isUserInteractionEnabled = true
tadNativeAdView.squareImgeView = icon
}

if let mediaView = clickableAssetViews[GADNativeAssetIdentifier.mediaViewAsset], let tadMediaView = tadNativeAdView.mediaView {
mediaView.subviews.first { $0 is TADNativeMediaView }?.removeFromSuperview()
mediaView.addSubview(tadMediaView)
fillSuperView(view: tadMediaView)
}

tadNativeAdView.nativeAd = tadNativeAd
}

func didUntrackView(_ view: UIView?) {
print("TADMediatedUnifiedNativeAd - didUntrackView")
tadNativeAdView?.removeFromSuperview()
tadNativeAdView?.mediaView?.removeFromSuperview()
}
}

extension TADCustomEventNative {
func fillSuperView(view: UIView) {
view.frame = view.superview?.bounds ?? .zero
}
}

回 AdMob Mediation