MoPubのネイティブ広告をいれてみたけど、swiftで使うには割と大変だったのでメモ。
まずはpodで下記を記載してpod installする
pod 'mopub-ios-sdk'
これだけでは使えず、bridging-headerを用意してbridging-headerに下記を記載する
#import "MoPub-Bridging-Header.h"
しかし、これではエラーが出るので、project設定のなかのHeader Search Pathsに「”${PODS_ROOT}/mopub-ios-sdk/MoPubSDK”」を「recursive」で追加してあげる
これで、ようやく使える準備ができたので、サンプルをもとに同じように実装してみる。
今回はMPNativeAdPlacerTableViewController.mのサンプルをもとに、テーブルビューへのネイティブ広告表示を実装してみる。
最初に動画広告用のMPNativeVideoTableViewAdPlacerViewを用意しておく。
class MPNativeVideoTableViewAdPlacerView: UIView, MPNativeAdRendering {
var titleLabel: UILabel
var mainTextLabel: UILabel
var iconImageView: UIImageView
var mainImageView: UIImageView
var videoView: UIView
var DAAIconImageView: UIImageView
var ctaLabel: UILabel
override init(frame: CGRect) {
titleLabel = UILabel(frame: CGRect(x: 75, y: 10, width: 212, height: 60))
titleLabel.font = UIFont.boldSystemFont(ofSize: 17.0)
titleLabel.text = "Title"
mainTextLabel = UILabel(frame: CGRect(x: 10, y: 68, width: 300, height: 50))
mainTextLabel.font = UIFont.systemFont(ofSize: 14.0)
mainTextLabel.text = "Text"
mainTextLabel.numberOfLines = 2
iconImageView = UIImageView(frame: CGRect(x: 10, y: 10, width: 60, height: 60))
mainImageView = UIImageView(frame: CGRect(x: 10, y: 119, width: 300, height: 156))
mainImageView.clipsToBounds = true
mainImageView.contentMode = .scaleAspectFill
videoView = UIView(frame: CGRect(x: 10, y: 119, width: 300, height: 156))
videoView.clipsToBounds = true
videoView.contentMode = .scaleAspectFill
ctaLabel = UILabel(frame: CGRect(x: 10, y: 270, width: 300, height: 48))
ctaLabel.font = UIFont.systemFont(ofSize: 14.0)
ctaLabel.text = "CTA Text"
ctaLabel.textColor = UIColor.green
ctaLabel.textAlignment = .right
DAAIconImageView = UIImageView(frame: CGRect(x: 290, y: 10, width: 20, height: 20))
titleLabel.textColor = UIColor(white: 0.86, alpha: 1.0)
mainTextLabel.textColor = UIColor(white: 0.86, alpha: 1.0)
super.init(frame: frame)
addSubview(titleLabel)
addSubview(mainTextLabel)
addSubview(mainImageView)
addSubview(videoView)
addSubview(iconImageView)
addSubview(ctaLabel)
addSubview(DAAIconImageView)
backgroundColor = UIColor(white: 0.21, alpha: 1.0)
clipsToBounds = true
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func layoutSubviews() {
if UIInterfaceOrientationIsLandscape(MPInterfaceOrientation()) {
titleLabel.frame = CGRect(x: 200, y: 10, width: 212, height: 60)
videoView.frame = CGRect(x: 0, y: 119, width: 320, height: 156)
} else {
titleLabel.frame = CGRect(x: 75, y: 10, width: 212, height: 60)
videoView.frame = CGRect(x: 10, y: 119, width: 300, height: 156)
}
}
func nativeMainTextLabel() -> UILabel {
return self.mainTextLabel
}
func nativeTitleTextLabel() -> UILabel {
return self.titleLabel
}
func nativeCallToActionTextLabel() -> UILabel {
return self.ctaLabel
}
func nativeIconImageView() -> UIImageView {
return self.iconImageView
}
func nativeMainImageView() -> UIImageView {
return self.mainImageView
}
func nativeVideoView() -> UIView {
return self.videoView
}
func nativePrivacyInformationIconImageView() -> UIImageView {
return self.DAAIconImageView
}
}
次に、tableViewがある、ViewControllerには下記を記載。
override func viewDidLoad() {
super.viewDidLoad()
configurationMopub()
}
func configurationMopub() {
let nativeAdHeight: CGFloat = 312.0
let nativeAdSettings = MPStaticNativeAdRendererSettings()
nativeAdSettings.renderingViewClass = MPTableViewAdPlacer.self
nativeAdSettings.viewSizeHandler = { (maximumWidth: CGFloat) in
return CGSize(width: maximumWidth, height: nativeAdHeight)
}
let nativeAdConfig = MPStaticNativeAdRenderer.rendererConfiguration(with: nativeAdSettings)
nativeAdConfig?.supportedCustomEvents = ["MPMoPubNativeCustomEvent", "FlurryNativeCustomEvent"]
let nativeVideoAdSettings = MOPUBNativeVideoAdRendererSettings()
nativeAdSettings.renderingViewClass = MPNativeVideoTableViewAdPlacerView.self
nativeAdSettings.viewSizeHandler = { (maximumWidth: CGFloat) in
return CGSize(width: maximumWidth, height: nativeAdHeight)
}
let nativeVideoConfig: MPNativeAdRendererConfiguration? = MOPUBNativeVideoAdRenderer.rendererConfiguration(with: nativeVideoAdSettings)
let positioning = MPServerAdPositioning.init
placer = MPTableViewAdPlacer(tableView: tableView, viewController: self, adPositioning: positioning(), rendererConfigurations: [nativeAdConfig!, nativeVideoConfig!])
super.init()
placer?.loadAds(forAdUnitID: "76a3fefaced247959582d2d2df6f4757") // test用のad unit id
}
/// dequeueReusableCellをmp_dequeueReusableCellに書き換える
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.mp_dequeueReusableCell(withIdentifier: "cellIdentifier", for: indexPath) else {
return UITableViewCell()
}
return cell
}
/// deselectもmp_deselectRowに書き換えておく
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.mp_deselectRow(at: indexPath, animated: true)
}
こんな感じで実装できました。
結局本番のunit idではうまく表示できず、さらにtaxの登録にtax idが必要といわれ、tax idがない日本は置いてけぼり感がある感じなので実装はやめてしまいました。。。
こんにちは。virapture…
View Comments
Reading your article helped me a lot and I agree with you. But I still have some doubts, can you clarify for me? I'll keep an eye out for your answers.
Your article helped me a lot, is there any more related content? Thanks!
Thanks for sharing. I read many of your blog posts, cool, your blog is very good. https://www.binance.com/uk-UA/register?ref=W0BCQMF1
Thanks for sharing. I read many of your blog posts, cool, your blog is very good.
Can you be more specific about the content of your article? After reading it, I still have some doubts. Hope you can help me.
Can you be more specific about the content of your article? After reading it, I still have some doubts. Hope you can help me.