ネイティブ広告APIを使用すると、アプリに表示する広告のエクスペリエンスをカスタマイズできます。ネイティブ広告APIを使うと、そのまま表示できる広告を受信するのではなく、広告プロパティ(タイトル、画像、コールトゥアクションなど)のグループを受信することになります。それを使って、広告が表示されるカスタムUIViewを構築する必要があります。
アプリのネイティブ広告をデザインする際は、ネイティブ広告に関するガイドに従ってください。
次のネイティブ広告配置を実装してみましょう。ネイティブ広告に次のビューを作成します。
ビュー1: 広告主のアイコンビュー2: 広告のタイトルビュー3: 広告ラベルビュー4: 広告主のチョイス | ビュー5: 広告メディアビュービュー6: ソーシャルコンテキストビュー7: 広告の本文ビュー8: 広告のコールトゥアクションボタン |
ネイティブ広告とバナー広告をデザインする際には、ユーザーが快適に利用できるよう「iOSレイアウトのガイドライン」に従ってください。
Main.storyboard
を開きます。UIView要素をメインのView要素に追加し、名前をadUIView
にします。adIconImageView
(FBMediaView)、adTitleLabel
(UILabel)、adCoverMediaView
(FBMediaView)、adSocialContext
(UILabel)、adCallToActionButton
(UIButton)、adOptionsView
(FBAdOptionsView)、adBodyLabel
(UILabel)、sponsoredLabel
(UILabel)を、下図に示されているようにadUIView
の下に追加します。ViewController.m
(Swiftを使っている場合はViewController.swift
)を開いてから、adUIView
をViewControllerオブジェクト内にドラッグします。名前をadUIView
にすることができます。その後、同じ操作をadIconImageView
、adTitleLabel
、adCoverMediaView
、adSocialContext
、adCallToActionButton
、adOptionsView
、adBodyLabel
、sponsoredLabel
についてもする必要があります。これでネイティブ広告を表示するためのすべてのUI要素が作成されました。次のステップではネイティブ広告を読み込んで、コンテンツをUI要素にバインドします。
ViewController
がFBNativeAdDelegate
プロトコルに従うものであることを宣言し、FBNativeAd
インスタンス変数を追加します
import UIKit
import FBAudienceNetwork
class ViewController: UIViewController, FBNativeAdDelegate {
private var nativeAd: FBNativeAd?
}
viewDidLoad
メソッドの中で、ネイティブ広告コンテンツを読み込むためのコードとして、以下の行を追加します
override func viewDidLoad() {
super.viewDidLoad()
let nativeAd = FBNativeAd(placementID: "YOUR_PLACEMENT_ID")
nativeAd.delegate = self
nativeAd.loadAd()
}
YOUR_PLACEMENT_ID
で表示されるIDは、テスト専用の一時的なIDです。
この一時的なIDを実際のコードで使用しても、ユーザーは広告を受け取りません(No Fillエラーを受け取ります)。テスト後にここに戻って、一時的なIDを実際の配置IDに置き換えてください。
実際の配置IDの生成方法については、Audience Network設定をご覧ください
nativeAdDidLoad
デリゲートメソッドを実装するには、ViewController
が必要になります
func nativeAdDidLoad(_ nativeAd: FBNativeAd) {
// 1. If there is an existing valid native ad, unregister the view
if let previousNativeAd = self.nativeAd, previousNativeAd.isAdValid {
previousNativeAd.unregisterView()
}
// 2. Retain a reference to the native ad object
self.nativeAd = nativeAd
// 3. Register what views will be tappable and what the delegate is to notify when a registered view is tapped
// Here only the call-to-action button and the media view are tappable, and the delegate is the view controller
nativeAd.registerView(
forInteraction: adUIView,
mediaView: adCoverMediaView,
iconView: adIconImageView,
viewController: self,
clickableViews: [adCallToActionButton, adCoverMediaView]
)
// 4. Render the ad content onto the view
adTitleLabel.text = nativeAd.advertiserName
adBodyLabel.text = nativeAd.bodyText
adSocialContextLabel.text = nativeAd.socialContext
sponsoredLabel.text = nativeAd.sponsoredTranslation
adCallToActionButton.setTitle(nativeAd.callToAction, for: .normal)
adOptionsView.nativeAd = nativeAd
}
快適な操作性とより良い結果を得るには、利用者が意図せずクリックしてしまわないよう広告のクリック可能な領域をコントロールすることをおすすめします。クリックできない余白の運用について詳しくは、Audience Network SDKポリシーをご覧ください。
シミュレーターで広告を実行するときには、設定をテストモードに変更しないとテスト広告が表示されません。詳しくは、テストモードの使用方法に関するページをご覧ください。
上記の例では、広告のメディアコンテンツがadCoverMediaView
に表示されており、オブジェクトタイプはFBMediaView
になっています。ここまでの手順では、FBMediaViewを使ってメディアコンテンツをFBNativeAd
オブジェクトから読み込む方法を示してきました。このビューは、手動によるカバー画像の読み込みに取って代わるものです。FBMediaView
の作成時に、その幅と高さはストーリーボードで設定された自動レイアウトの制約によって決まるか、ハードコーディングすることができます。しかし、ビューのこの幅と高さは、後にダウンロードされる広告の実際のカバー画像に適合しないかもしれません。これを修正するには、コンテンツのアスペクト比を取得し、自然な幅と高さを適用します。この方法を示す例を以下に示します。
FBMediaViewDelegate
プロトコルを実装することを宣言します
class ViewController: UIViewController, FBNativeAdDelegate, FBMediaViewDelegate {
...
}
FBMediaView
オブジェクトのデリゲートをビューコントローラーとして設定します
func nativeAdDidLoad(_ nativeAd: FBNativeAd) {
adCoverMediaView.delegate = self
}
mediaViewDidLoad
メソッドを実装します
func mediaViewDidLoad(_ mediaView: FBMediaView) {
let currentAspect = mediaView.frame.size.width / mediaView.frame.size.height
print(currentAspect)
let actualAspect = mediaView.aspectRatio
print(actualAspect)
}
mediaView.aspectRatio
からは、正のCGFloatが返されます。広告が読み込まれていない場合は、0が返されます。この値は、メディアビューの読み込み後に有効になります。FBMediaViewオブジェクトを、読み込まれたメディアコンテンツのアスペクト比と同じ幅と高さに設定できる便利な方法があります。applyNaturalWidth
またはapplyNaturalHeight
を呼び出すことによって、FBMediaView
オブジェクトの幅または高さを、メディアコンテンツのアスペクト比と同じ値にアップデートします。
任意で、以下の関数を追加し、ネイティブ広告が閉じられたケースやユーザーがクリックしたケースを処理できます
func nativeAdDidClick(_ nativeAd: FBNativeAd) {
print("Native ad was clicked.")
}
func nativeAdDidFinishHandlingClick(_ nativeAd: FBNativeAd) {
print("Native ad did finish click handling.")
}
func nativeAdWillLogImpression(_ nativeAd: FBNativeAd) {
print("Native ad impression is being captured.")
}
広告の読み込みの失敗を処理するために、以下の関数を追加してビューコントローラーに実装します
func nativeAd(_ nativeAd: FBNativeAd, didFailWithError error: Error) {
print("Native ad failed to load with error: \(error.localizedDescription)")
}
let nativeAd = FBNativeAd(placementID: "YOUR_PLACEMENT_ID")
nativeAd.delegate = self
nativeAd.loadAd(withMediaCachePolicy: .none)
func nativeAdDidLoad(_ nativeAd: FBNativeAd) {
...
self.adCoverMediaView.delegate = self
nativeAd.downloadMedia()
self.nativeAd = nativeAd
...
}
mediaViewDidLoad
コールバックの後でregisterViewForInteraction
のみを呼び出して広告を表示してください。インプレッションの対象となるには、すべてのメディアが読み込まれ表示される必要があります
func mediaViewDidLoad(_ mediaView: FBMediaView) {
guard let nativeAd = nativeAd else {
return
}
// 1. Register what views will be tappable and what the delegate is to notify when a registered view is tapped
// Here only the call-to-action button and the media view are tappable, and the delegate is the view controller
nativeAd.registerView(
forInteraction: adUIView,
mediaView: mediaView,
iconView: adIconImageView,
viewController: self,
clickableViews: [adCallToActionButton, mediaView]
)
// 2. Render the ad content onto the view
adTitleLabel.text = nativeAd.advertiserName
adBodyLabel.text = nativeAd.bodyText
adSocialContextLabel.text = nativeAd.socialContext
sponsoredLabel.text = nativeAd.sponsoredTranslation
adCallToActionButton.setTitle(nativeAd.callToAction, for: .normal)
adOptionsView.nativeAd = nativeAd
}
NativeAdSample
は、FBAudienceNetwork/samples
フォルダにあります。プロジェクトをXcodeで開き、デバイス上またはシミュレータ上で実行してください。その他の情報 |
スタートガイドAudience Networkの利用を開始するためのテクニカルガイド コードサンプルAudience Network広告の統合のサンプル | よくある質問Audience Networkのよくある質問 ネイティブ広告テンプレートネイティブ広告の統合に使用できる、よりシンプルなアプローチ |