システム定義のネイティブ広告フォーマットを表示する
ネイティブ広告が読み込まれると、アプリは
GADAdLoaderDelegate
プロトコル メッセージ。次に、アプリによってその広告が表示されます(ただし、必ずしもすぐに表示される必要はありません)。システム定義の広告フォーマットを簡単に表示できるようにするため、SDK には便利なリソースが用意されています。
GADNativeAdView
GADNativeAd
には、対応する「広告ビュー」があります。
class:
GADNativeAdView
。
この広告ビュークラスは、広告を表示するためにパブリッシャーが使用する必要がある UIView
です。
たとえば、1 つの GADNativeAdView
で GADNativeAd
の 1 つのインスタンスを表示できます。その広告のアセットの表示に使われる UIView
オブジェクトはいずれも、GADNativeAdView
オブジェクトのサブビューになります。
たとえば、UITableView
で広告を表示している場合、
いずれかのセルのビュー階層は次のようになります。
GADNativeAdView
クラスには、個々のアセットで使うビューの登録に使用する IBOutlets
と、GADNativeAd
オブジェクト自体を登録するためのメソッドがあります。この方法でビューを登録すると、SDK が自動的に
次のようなタスクを処理します。
- クリックの記録。
- インプレッションを記録する(画面に最初のピクセルが表示されたとき)。
- AdChoices オーバーレイを表示する。
AdChoices オーバーレイ
間接販売のネイティブ広告(アド マネージャーのバックフィル、Ad Exchange、AdSense 経由で配信される広告)については、SDK で AdChoices オーバーレイが追加されます。希望するスペースにスペースを残す 角 自動的に挿入される AdChoices ロゴのネイティブ広告ビューの視認性の高さです。また、AdChoices オーバーレイは、そのアイコンをコンテンツ上で簡単に識別できる場所に配置してください。オーバーレイのデザインや機能について詳しくは、プログラマティック ネイティブ広告の実装に関するガイドラインをご確認ください。
プログラマティック ネイティブ広告の帰属表示
プログラマティック ネイティブ広告を表示する際は、広告の帰属表示を行って、そのビューが広告であることを示す必要があります。詳しくは、ポリシー ガイドラインをご覧ください。サンプルコード
次に、xib ファイルから動的に読み込まれるビューを使ってネイティブ広告を表示する方法を見ていきましょう。この方法は、複数のフォーマットをリクエストする設定の GADAdLoaders
を使う場合に極めて便利です。
UIView をレイアウトする
まず、ネイティブ広告アセットを表示する UIViews
のレイアウトを行います。
これは、インターフェース ビルダーで行うこともできます。
xib ファイルを作成します。ネイティブ広告をレイアウトする方法は次のようになります。
画像の右上にあるカスタムクラス値に注目してください。設定:
GADNativeAdView
。
これは、GADNativeAd
の表示に使用される広告ビュークラスです。
また、GADMediaView
にもカスタムクラスを設定する必要があります。
広告の動画や画像を表示します。
アウトレットをビューにリンクする
ビューの設定が完了し、レイアウトに適切な広告ビュークラスを割り当てたら、作成済みの UIViews
に広告ビューのアセット アウトレットをリンクします。広告用に作成した UIViews
に、広告ビューのアセット アウトレットをリンクする方法を次に示します。
[Outlets(アウトレット)] パネルにおいて、Interface Builder でレイアウトした UIViews
に、GADNativeAdView
のアウトレットがリンクされています。これにより、
SDK はどの UIView
がどのアセットを表示するかを判断します。
また、これらのアウトレットは
広告クリック可能なものを指定します
広告を表示する
レイアウトが完成してアウトレットをリンクしたら、読み込まれた広告を表示するコードをアプリに追加します。
Swift
// Mark: - GADNativeAdLoaderDelegate
func adLoader(_ adLoader: GADAdLoader, didReceive nativeAd: GADNativeAd) {
print("Received native ad: \(nativeAd)")
refreshAdButton.isEnabled = true
// Create and place ad in view hierarchy.
let nibView = Bundle.main.loadNibNamed("NativeAdView", owner: nil, options: nil)?.first
guard let nativeAdView = nibView as? GADNativeAdView else {
return
}
setAdView(nativeAdView)
// Set ourselves as the native ad delegate to be notified of native ad events.
nativeAd.delegate = self
// Populate the native ad view with the native ad assets.
// The headline and mediaContent are guaranteed to be present in every native ad.
(nativeAdView.headlineView as? UILabel)?.text = nativeAd.headline
nativeAdView.mediaView?.mediaContent = nativeAd.mediaContent
// This app uses a fixed width for the GADMediaView and changes its height to match the aspect
// ratio of the media it displays.
if let mediaView = nativeAdView.mediaView, nativeAd.mediaContent.aspectRatio > 0 {
let heightConstraint = NSLayoutConstraint(
item: mediaView,
attribute: .height,
relatedBy: .equal,
toItem: mediaView,
attribute: .width,
multiplier: CGFloat(1 / nativeAd.mediaContent.aspectRatio),
constant: 0)
heightConstraint.isActive = true
}
// These assets are not guaranteed to be present. Check that they are before
// showing or hiding them.
(nativeAdView.bodyView as? UILabel)?.text = nativeAd.body
nativeAdView.bodyView?.isHidden = nativeAd.body == nil
(nativeAdView.callToActionView as? UIButton)?.setTitle(nativeAd.callToAction, for: .normal)
nativeAdView.callToActionView?.isHidden = nativeAd.callToAction == nil
(nativeAdView.iconView as? UIImageView)?.image = nativeAd.icon?.image
nativeAdView.iconView?.isHidden = nativeAd.icon == nil
(nativeAdView.starRatingView as? UIImageView)?.image = imageOfStars(
fromStarRating: nativeAd.starRating)
nativeAdView.starRatingView?.isHidden = nativeAd.starRating == nil
(nativeAdView.storeView as? UILabel)?.text = nativeAd.store
nativeAdView.storeView?.isHidden = nativeAd.store == nil
(nativeAdView.priceView as? UILabel)?.text = nativeAd.price
nativeAdView.priceView?.isHidden = nativeAd.price == nil
(nativeAdView.advertiserView as? UILabel)?.text = nativeAd.advertiser
nativeAdView.advertiserView?.isHidden = nativeAd.advertiser == nil
// For the SDK to process touch events properly, user interaction should be disabled.
nativeAdView.callToActionView?.isUserInteractionEnabled = false
// Associate the native ad view with the native ad object. This is
// required to make the ad clickable.
// Note: this should always be done after populating the ad views.
nativeAdView.nativeAd = nativeAd
}
SwiftUI
ビューモデルを作成する
ネイティブ広告を読み込み、ネイティブ広告データの変更を公開するビューモデルを作成します。
import GoogleMobileAds
class NativeAdViewModel: NSObject, ObservableObject, GADNativeAdLoaderDelegate {
@Published var nativeAd: GADNativeAd?
private var adLoader: GADAdLoader!
func refreshAd() {
adLoader = GADAdLoader(
adUnitID: "ca-app-pub-3940256099942544/3986624511",
// The UIViewController parameter is optional.
rootViewController: nil,
adTypes: [.native], options: nil)
adLoader.delegate = self
adLoader.load(GADRequest())
}
func adLoader(_ adLoader: GADAdLoader, didReceive nativeAd: GADNativeAd) {
// Native ad data changes are published to its subscribers.
self.nativeAd = nativeAd
nativeAd.delegate = self
}
func adLoader(_ adLoader: GADAdLoader, didFailToReceiveAdWithError error: Error) {
print("\(adLoader) failed with error: \(error.localizedDescription)")
}
}
UIViewRepresentable を作成する
GADNativeView
の UIViewRepresentable
を作成し、ViewModel
クラスのデータ変更をサブスクライブします。
private struct NativeAdView: UIViewRepresentable {
typealias UIViewType = GADNativeAdView
// Observer to update the UIView when the native ad value changes.
@ObservedObject var nativeViewModel: NativeAdViewModel
func makeUIView(context: Context) -> GADNativeAdView {
return
Bundle.main.loadNibNamed(
"NativeAdView",
owner: nil,
options: nil)?.first as! GADNativeAdView
}
func updateUIView(_ nativeAdView: GADNativeAdView, context: Context) {
guard let nativeAd = nativeViewModel.nativeAd else { return }
// Each UI property is configurable using your native ad.
(nativeAdView.headlineView as? UILabel)?.text = nativeAd.headline
nativeAdView.mediaView?.mediaContent = nativeAd.mediaContent
(nativeAdView.bodyView as? UILabel)?.text = nativeAd.body
(nativeAdView.iconView as? UIImageView)?.image = nativeAd.icon?.image
(nativeAdView.starRatingView as? UIImageView)?.image = imageOfStars(from: nativeAd.starRating)
(nativeAdView.storeView as? UILabel)?.text = nativeAd.store
(nativeAdView.priceView as? UILabel)?.text = nativeAd.price
(nativeAdView.advertiserView as? UILabel)?.text = nativeAd.advertiser
(nativeAdView.callToActionView as? UIButton)?.setTitle(nativeAd.callToAction, for: .normal)
// For the SDK to process touch events properly, user interaction should be disabled.
nativeAdView.callToActionView?.isUserInteractionEnabled = false
// Associate the native ad view with the native ad object. This is required to make the ad
// clickable.
// Note: this should always be done after populating the ad views.
nativeAdView.nativeAd = nativeAd
}
ビューをビュー階層に追加する
次のコードは、UIViewRepresentable
をビューに追加する方法を示しています。
階層:
struct NativeContentView: View {
// Single source of truth for the native ad data.
@StateObject private var nativeViewModel = NativeAdViewModel()
var body: some View {
ScrollView {
VStack(spacing: 20) {
NativeAdView(nativeViewModel: nativeViewModel) // Updates when the native ad data changes.
.frame(minHeight: 300) // minHeight determined from xib.
Objective-C
#pragma mark GADNativeAdLoaderDelegate implementation
- (void)adLoader:(GADAdLoader *)adLoader didReceiveNativeAd:(GADNativeAd *)nativeAd {
NSLog(@"Received native ad: %@", nativeAd);
self.refreshButton.enabled = YES;
// Create and place ad in view hierarchy.
GADNativeAdView *nativeAdView =
[[NSBundle mainBundle] loadNibNamed:@"NativeAdView" owner:nil options:nil].firstObject;
[self setAdView:nativeAdView];
// Set the mediaContent on the GADMediaView to populate it with available
// video/image asset.
nativeAdView.mediaView.mediaContent = nativeAd.mediaContent;
// Populate the native ad view with the native ad assets.
// The headline is present in every native ad.
((UILabel *)nativeAdView.headlineView).text = nativeAd.headline;
// These assets are not guaranteed to be present. Check that they are before
// showing or hiding them.
((UILabel *)nativeAdView.bodyView).text = nativeAd.body;
nativeAdView.bodyView.hidden = nativeAd.body ? NO : YES;
[((UIButton *)nativeAdView.callToActionView)setTitle:nativeAd.callToAction
forState:UIControlStateNormal];
nativeAdView.callToActionView.hidden = nativeAd.callToAction ? NO : YES;
((UIImageView *)nativeAdView.iconView).image = nativeAd.icon.image;
nativeAdView.iconView.hidden = nativeAd.icon ? NO : YES;
((UIImageView *)nativeAdView.starRatingView).image = [self imageForStars:nativeAd.starRating];
nativeAdView.starRatingView.hidden = nativeAd.starRating ? NO : YES;
((UILabel *)nativeAdView.storeView).text = nativeAd.store;
nativeAdView.storeView.hidden = nativeAd.store ? NO : YES;
((UILabel *)nativeAdView.priceView).text = nativeAd.price;
nativeAdView.priceView.hidden = nativeAd.price ? NO : YES;
((UILabel *)nativeAdView.advertiserView).text = nativeAd.advertiser;
nativeAdView.advertiserView.hidden = nativeAd.advertiser ? NO : YES;
// In order for the SDK to process touch events properly, user interaction
// should be disabled.
nativeAdView.callToActionView.userInteractionEnabled = NO;
// Associate the native ad view with the native ad object. This is
// required to make the ad clickable.
nativeAdView.nativeAd = nativeAd;
}
GitHub のサンプルコードの全文
Swift、SwiftUI、Objective-C でネイティブ広告を統合する完全な例については、それぞれの GitHub リンクをご覧ください。
Swift カスタム レンダリングの例 SwiftUI のネイティブ広告の例 Objective-C カスタム レンダリングの例
GADMediaView
画像アセットと動画アセットは、GADMediaView
を介してユーザーに表示されます。これは、xib ファイルで定義することも、動的に構築することもできる UIView
です。
これは、GADNativeAdView
のビュー階層内に配置する必要があります。
その他のアセットビューにも影響します。
他のすべてのアセットビューと同様に、メディアビューのコンテンツも設定する必要があります。これは、GADMediaView
の mediaContent
プロパティを使って設定します。GADNativeAd
の mediaContent
プロパティには、GADMediaView
に渡すことができるメディア コンテンツが含まれています。
次に示すスニペットはカスタム レンダリングのサンプル(Swift | Objective-C)で、GADNativeAd
の GADMediaContent
を使用して GADMediaView
にネイティブ広告アセットを設定する方法を示しています。
Swift
nativeAdView.mediaView?.mediaContent = nativeAd.mediaContent
Objective-C
nativeAdView.mediaView.mediaContent = nativeAd.mediaContent;
必ずネイティブ広告ビューの Interface Builder ファイルで、そのビューのカスタムクラスに GADMediaView
を設定し、それを mediaView
アウトレットにリンクします。
画像コンテンツ モードを変更する
GADMediaView
クラスは、画像を表示する際に UIView
contentMode
プロパティに従います。画像のスケーリング方法を変更する場合
GADMediaView
の場合は、対応する値を
UIViewContentMode
GADMediaView
の contentMode
プロパティで設定します。
たとえば、画像が表示されるときに GADMediaView
を埋める場合(広告に
動画):
Swift
nativeAdView.mediaView?.contentMode = .aspectFill
Objective-C
nativeAdView.mediaView.contentMode = UIViewContentModeAspectFill;
GADMediaContent
GADMediaContent
クラスには、ネイティブ広告のメディア コンテンツに関連するデータが格納されます。
GADMediaView
クラスを使用して表示されます。GADMediaView
で設定した場合
mediaContent
プロパティ:
動画アセットがある場合は、その動画アセットがバッファリングされ、
GADMediaView
内で再生されます。動画アセットがあるかどうかは、hasVideoContent
。広告に動画アセットがない場合は、代わりに
mainImage
アセットがダウンロードされ、GADMediaView
内に配置されます。
次のステップ
ユーザーのプライバシーの詳細