Sự kiện tùy chỉnh gốc

Hướng dẫn này dành cho những nhà xuất bản muốn sử dụng nền tảng Dàn xếp AdMob để tải và hiển thị quảng cáo gốc từ một mạng không phải là một trong các mạng quảng cáo được hỗ trợ của AdMob. Hãy xem bài viết về Sự kiện tùy chỉnh để biết thông tin về cách sử dụng nền tảng Dàn xếp AdMob cho mục đích tải và hiển thị quảng cáo biểu ngữ, quảng cáo xen kẽ hoặc quảng cáo hiển thị hình ảnh có tặng thưởng.

Sự kiện tùy chỉnh là các lớp chuyển đổi dàn xếp có khả năng yêu cầu quảng cáo từ một mạng khác. Khi bạn thêm tên của một trong các lớp này vào tùy chọn cài đặt dàn xếp cho một đơn vị quảng cáo, SDK có thể thực thể hóa và sử dụng tên đó để truy xuất quảng cáo. Các lớp sự kiện tùy chỉnh gốc cần phải có khả năng làm những việc sau:

  • Yêu cầu quảng cáo gốc từ một mạng đã dàn xếp.
  • Chuyển tiếp các sự kiện từ SDK của mạng đã dàn xếp đến SDK quảng cáo trên thiết bị di động của Google.
  • Sử dụng GADMediatedUnifiedNativeAd để liên kết các đối tượng quảng cáo gốc đã dàn xếp với giao diện quảng cáo gốc của AdMob.

Những thao tác này sẽ được mô tả cụ thể ở bên dưới. Bạn cũng có thể tìm thấy toàn bộ nguồn cho một dự án sự kiện tùy chỉnh mẫu trong Kho lưu trữ GitHub.

Điều kiện tiên quyết

Để triển khai sự kiện tùy chỉnh AdMob, trước tiên bạn phải tích hợp SDK quảng cáo trên thiết bị di động vào dự án của mình. Ngoài ra, bạn cũng nên đọc về cách tạo yêu cầu quảng cáo và cách hoạt động của nền tảng dàn xếp.

SDK mẫu

Mã dùng trong hướng dẫn này được lấy từ dự án sự kiện tùy chỉnh mẫu, bao gồm cả "SDK mẫu". Để minh họa cách tạo một sự kiện tùy chỉnh sẽ dàn xếp SDK của một mạng quảng cáo khác, dự án cần một SDK để dàn xếp, vì vậy, chúng tôi đã tạo một mô hình có tên là SDK mẫu.

SDK mẫu có các lớp tương tự như các lớp bạn tìm thấy trong SDK sản xuất của mạng quảng cáo. Có các đối tượng yêu cầu như SampleNativeAdRequest, trình tải quảng cáo như SampleNativeAdLoader cũng như các lớp, hằng số và giao thức khác được dùng để mô phỏng SDK của mạng thực. Tuy nhiên, quảng cáo mà SDK này tạo ra chỉ là mô hình và không tạo ra thêm lưu lượng truy cập mạng nào.

Yêu cầu quảng cáo gốc

Phương thức requestNativeAdWithParameter:

Các lớp sự kiện tùy chỉnh phải triển khai giao thức GADCustomEventNativeAd, bao gồm một phương thức được SDK quảng cáo trên thiết bị di động của Google sử dụng để yêu cầu quảng cáo gốc từ sự kiện tùy chỉnh:

Swift

func request(withParameter serverParameter: String,
                                   request: GADCustomEventRequest,
                                   adTypes: [Any],
                                   options: [Any],
                        rootViewController: UIViewController)

Objective-C

- (void)requestNativeAdWithParameter:(NSString *)serverParameter
                             request:(GADCustomEventRequest *)request
                             adTypes:(NSArray *)adTypes
                             options:(NSArray *)options
                  rootViewController:(UIViewController *)rootViewController;

Khi phương thức này được gọi, sự kiện tùy chỉnh phải yêu cầu một quảng cáo gốc một cách không đồng bộ. Bốn thông số cho requestNativeAdWithParameter: mang theo thông tin mà sự kiện tùy chỉnh có thể sử dụng trong khi tạo yêu cầu:

  • serverParameter - Khi thêm một sự kiện tùy chỉnh vào cấu hình dàn xếp của một đơn vị quảng cáo, nhà xuất bản có thể nhập một giá trị chuỗi sẽ được chuyển cùng với mỗi yêu cầu. Thông số này giữ giá trị đó (thường là một ID đơn vị quảng cáo khác, do một mạng đã dàn xếp cấp phát).
  • request - Đối tượng GADCustomEventRequest, chứa các thuộc tính dành riêng cho một yêu cầu đơn lẻ, chẳng hạn như các định dạng quảng cáo gốc được yêu cầu. GADCustomEventRequest cũng bao gồm các thuộc tính cho thông tin nhắm mục tiêu do nhà xuất bản cung cấp tại thời điểm yêu cầu.
  • adTypes - Một NSArray chứa hằng số cho biết các định dạng gốc nào được yêu cầu. Đối với các đối tượng GADUnifiedNativeAd, mục này phải chứa kGADAdLoaderAdTypeUnifiedNative.
  • options - Một NSArray chứa các đối tượng GADAdLoaderOptions cho biết các tùy chọn tải quảng cáo của nhà xuất bản.

Ngoài các thông số chứa thông tin về yêu cầu, thông số rootViewController cũng cung cấp một tham chiếu tới UIViewController tại vị trí mà quảng cáo sẽ hiển thị.

Dưới đây là đoạn mã từ dự án sự kiện tùy chỉnh mẫu minh họa một phương thức requestNativeAdWithParameter: đã triển khai:

SampleCustomEventNativeAd (phần trích dẫn)

Swift

func request(withParameter serverParameter: String, request: GADCustomEventRequest, adTypes: [Any], options: [Any], rootViewController: UIViewController) {

  let adLoader = SampleNativeAdLoader()
  let sampleRequest = SampleNativeAdRequest()

  if let options = options as? [GADAdLoaderOptions] {
    for loaderOptions: GADAdLoaderOptions in options {
      if let imageOptions = loaderOptions as? GADNativeAdImageAdLoaderOptions {

        sampleRequest.shouldRequestPortraitImages =
        imageOptions.preferredImageOrientation = .portrait;
        sampleRequest.shouldRequestMultipleImages = imageOptions.shouldRequestMultipleImages
        // If the GADNativeAdImageAdLoaderOptions' disableImageLoading
        // property is YES, the adapter should send just the URLs for the images.
        sampleRequest.shouldDownloadImages = !imageOptions.disableImageLoading
      }
      else if let options = loaderOptions as? GADNativeAdViewAdOptions {
        nativeAdViewAdOptions = options
      }
    }
  }
  // This custom event uses the server parameter to carry an ad unit ID,
  // which is the most common use case.
  adLoader.adUnitID = serverParameter
  adLoader.delegate = self
  adLoader.fetchAd(sampleRequest)
}

Objective-C

- (void)requestNativeAdWithParameter:(NSString *)serverParameter
                             request:(GADCustomEventRequest *)request
                             adTypes:(NSArray *)adTypes
                             options:(NSArray *)options
                  rootViewController:(UIViewController *)rootViewController {
  SampleNativeAdLoader *adLoader = [[SampleNativeAdLoader alloc] init];
  SampleNativeAdRequest *sampleRequest = [[SampleNativeAdRequest alloc] init];

  for (GADNativeAdImageAdLoaderOptions *imageOptions in options) {
    if (![imageOptions isKindOfClass:[GADNativeAdImageAdLoaderOptions class]]) {
      continue;
    }

    sampleRequest.shouldRequestPortraitImages =
        imageOptions.preferredImageOrientation ==
        GADNativeAdImageAdLoaderOptionsOrientationPortrait;
    sampleRequest.shouldDownloadImages = !imageOptions.disableImageLoading;
    sampleRequest.shouldRequestMultipleImages = imageOptions.shouldRequestMultipleImages;
  }

  // This custom event uses the server parameter to carry an ad unit ID,
  // which is the most common use case.
  adLoader.adUnitID = serverParameter;
  adLoader.delegate = self;

  [adLoader fetchAd:sampleRequest];
}

Đây là một sự kiện tùy chỉnh mẫu dàn xếp vào mạng quảng cáo ảo thông qua một mẫu "SDK mẫu" mô phỏng. Sự kiện tùy chỉnh này sử dụng thông tin được cung cấp trong thông số requestNativeAdWithParameter: để yêu cầu một quảng cáo từ SampleNativeAdLoader của SDK mẫu. Sự kiện tùy chỉnh này cũng tự chỉ định mình làm đại biểu cho SampleNativeAdLoader, do đó, nó có thể chuyển tiếp các sự kiện từ SDK mẫu về lại SDK quảng cáo trên thiết bị di động của Google. Quy trình đó sẽ được đề cập ở phần tiếp theo.

GADAdLoaderOptions

Khi đưa ra yêu cầu cho quảng cáo gốc, nhà xuất bản sẽ cung cấp một mảng gồm các đối tượng GADAdLoaderOptions để chỉ định tùy chọn của họ cho yêu cầu đó, chẳng hạn như cách trả về nội dung hình ảnh. Lần lượt các nội dung này được cung cấp cho sự kiện tùy chỉnh dưới dạng một trong các thông số của phương thức requestNativeAdWithParameter:. Sự kiện tùy chỉnh nên lặp lại mảng options và hành động theo các tùy chọn trong mảng đó.

Ví dụ: nếu mảng options chứa đối tượng GADNativeAdImageAdLoaderOptions với giá trị shouldDownloadImages đặt thành true, thì sự kiện tùy chỉnh phải trả về nội dung hình ảnh thực tế thay vì chỉ URL. Trong trường hợp này, nếu SDK đang được điều chỉnh chỉ cung cấp URL cho hình ảnh thì sự kiện tùy chỉnh phải sử dụng các URL đó để tải tệp hình ảnh xuống và cung cấp dữ liệu cho nhà xuất bản.

Chuyển tiếp sự kiện đến SDK quảng cáo trên thiết bị di động

Quá trình sự kiện tùy chỉnh cố tải quảng cáo gốc từ mạng đã dàn xếp có thể xảy ra một số lỗi. SDK có thể trả về thành công một quảng cáo gốc, SDK có thể quay lại kèm theo lỗi hoặc có thể chỉ báo cáo rằng hiện không có sẵn quảng cáo nào. Điều quan trọng đối với SDK quảng cáo trên thiết bị di động của Google là nhận thức được các sự kiện này, vì vậy, giao thức GADCustomEventNativeAd sẽ bao gồm một đại biểu (thuộc loại GADCustomEventNativeAdDelegate), mà sự kiện tùy chỉnh có thể sử dụng để chuyển tiếp các sự kiện đó.

Đó là một phần công việc của sự kiện tùy chỉnh với vai trò như "người trung gian", xử lý các sự kiện từ SDK đã dàn xếp, sau đó, gửi thông báo về giao thức GADCustomEventNativeAdDelegate tương ứng tới đại biểu phù hợp. Sự kiện tùy chỉnh của bạn cần nhận biết những thông báo sau:

  • customEventNativeAd:didReceiveMediatedUnifiedNativeAd: - Thông báo này sẽ được gửi khi sự kiện tùy chỉnh tải thành công một quảng cáo gốc. Bạn phải có một thông số thuộc loại GADMediatedUnifiedNativeAd, mà sự kiện tùy chỉnh sẽ sử dụng để chuyển phiên bản "đã chuyển đổi" của quảng cáo gốc vừa tải (các lớp GADMediatedUnifiedNativeAd sẽ được đề cập trong phần tiếp theo).
  • customEventNativeAd:didFailToLoadWithError: - Khi sự kiện tùy chỉnh cố gắng tải và không thể tải quảng cáo gốc, sự kiện tùy chỉnh sẽ sử dụng phương thức này để báo cáo lỗi. Sự kiện này sẽ lấy một thông số NSError, chứa thông tin dành riêng cho lỗi.

Dưới đây là một ví dụ về cách thức hoạt động của việc này trong dự án sự kiện tùy chỉnh mẫu của chúng tôi:

SampleCustomEventNativeAd (phần trích dẫn)

Swift

extension SampleCustomEventNativeAdSwift: SampleNativeAdLoaderDelegate {

  func adLoader(_ adLoader: SampleNativeAdLoader, didReceive nativeAd: SampleNativeAd) {
    let mediatedAd = SampleMediatedNativeAdSwift(
    sampleNativeAd:nativeAd,nativeAdViewAdOptions: nativeAdViewAdOptions)
    delegate?.customEventNativeAd(self, didReceive: mediatedAd)
  }

  func adLoader(_ adLoader: SampleNativeAdLoader, didFailToLoadAdWith errorCode: SampleErrorCode) {
    let error = NSError(domain: customEventErrorDomain, code: errorCode.rawValue, userInfo: nil)
    delegate?.customEventNativeAd(self, didFailToLoadWithError: error)
  }

}

Objective-C

@interface SampleCustomEventNativeAd () <SampleNativeAdLoaderDelegate>
@end

@implementation SampleCustomEventNativeAd

@synthesize delegate;

...

#pragma mark SampleNativeAdLoaderDelegate implementation

- (void)adLoader:(SampleNativeAdLoader *)adLoader didReceiveNativeAd:(SampleNativeAd *)nativeAd {
  SampleMediatedNativeAd *mediatedAd =
      [[SampleMediatedNativeAd alloc] initWithSampleNativeAd:nativeAd
                                       nativeAdViewAdOptions:_nativeAdViewAdOptions];
  [self.delegate customEventNativeAd:self didReceiveMediatedUnifiedNativeAd:mediatedAd];
}

- (void)adLoader:(SampleNativeAdLoader *)adLoader
    didFailToLoadAdWithErrorCode:(SampleErrorCode)errorCode {
  NSError *error = [NSError errorWithDomain:customEventErrorDomain code:errorCode userInfo:nil];
  [self.delegate customEventNativeAd:self didFailToLoadWithError:error];
}

...

@end

Lớp này triển khai giao thức SampleNativeAdLoaderDelegate của SDK mẫu. Trong SampleCustomEventNativeAd.m (phần trích dẫn), lớp sự kiện tùy chỉnh này được gán cho SampleNativeAdLoader dưới dạng đại biểu của lớp sự kiện đó:

Swift

adLoader.delegate = self

Objective-C

adLoader.delegate = self;

Điều này đảm bảo rằng SDK mẫu sẽ gửi thông báo trở lại sự kiện tùy chỉnh khi đã báo cáo thành công hoặc không thể báo cáo. Sau đó, sự kiện tùy chỉnh sẽ gửi thông báo thích hợp đến đại biểu, giúp chuyển tiếp sự kiện đến SDK quảng cáo trên thiết bị di động của Google. Tóm lại, SDK quảng cáo trên thiết bị di động của Google sẽ lắng nghe sự kiện tùy chỉnh đang lắng nghe SDK đã dàn xếp.

Phương thức adLoader:didFailToLoadAdWithErrorCode ở trên là một ví dụ hay về cách quy trình này hoạt động. Khi SDK mẫu không thể tải quảng cáo, SDK sẽ gửi một thông báo adLoader:didFailToLoadAdWithErrorCode: đến sự kiện tùy chỉnh. Sự kiện tùy chỉnh sẽ tạo một đối tượng NSError mới kèm theo SampleErrorCode do SDK mẫu cung cấp và sau đó gửi đối tượng đó tới đại biểu thông qua thông báo customEventNativeAd:didFailToLoadWithError: . Bằng cách này, sự kiện SDK mẫu sẽ được chuyển thành sự kiện SDK quảng cáo trên thiết bị di động của Google.

Liên kết quảng cáo gốc

Các SDK khác nhau có các định dạng khác nhau cho quảng cáo gốc. Ví dụ: một SDK có thể trả về các đối tượng chứa trường "tiêu đề" trong khi một SDK khác có thể có "dòng tiêu đề". Ngoài ra, phương thức dùng để theo dõi số lần hiển thị và xử lý các lần nhấp có thể khác nhau giữa các SDK. Để làm giảm thiểu các khác biệt này, sự kiện tùy chỉnh sẽ xác định và sử dụng các lớp phụ của GADMediatedNativeAd để "liên kết" đối tượng quảng cáo gốc của SDK đã dàn xếp để chúng khớp với giao diện mà SDK quảng cáo trên thiết bị di động của Google dự kiến.

Định dạng quảng cáo gốc hợp nhất do hệ thống xác định của AdMob có một lớp GADMediatedUnifiedNativeAd tương ứng. Sự kiện tùy chỉnh sẽ tạo một lớp phụ của lớp này để liên kết các đối tượng quảng cáo gốc do SDK dàn xếp cung cấp.

Dưới đây là một lớp trình liên kết mẫu từ dự án sự kiện tùy chỉnh mẫu của chúng tôi:

Swift

class SampleMediatedUnifiedNativeAdSwift : NSObject {

    var sampleAd : SampleNativeAd
    var mappedImages = [GADNativeAdImage]()
    var mappedIcon: GADNativeAdImage?
    var extras = [String:Any]()
    var nativeAdViewAdOptions: GADNativeAdViewAdOptions?
    let adInfoView = SampleAdInfoView()
    var sampleMediaView : SampleMediaView?

    init(sampleNativeAd : SampleNativeAd, nativeAdViewAdOptions : GADNativeAdViewAdOptions?) {
      sampleAd = sampleNativeAd
      super.init()
      extras = [SampleCustomEventConstantsSwift.awesomenessKey: sampleAd.degreeOfAwesomeness ?? ""]
      if let image = sampleAd.image {
         mappedImages = [GADNativeAdImage(image : image)]
      }
      else {
         let imageUrl = URL(fileURLWithPath : sampleAd.imageURL)
         mappedImages = [GADNativeAdImage(url : imageUrl, scale : sampleAd.imageScale)]
      }
      if let icon = sampleAd.icon {
        mappedIcon = GADNativeAdImage(image : icon)
      }
      else {
       let iconURL = URL(fileURLWithPath : sampleNativeAd.iconURL)
       mappedIcon = GADNativeAdImage(url : iconURL, scale : sampleAd.iconScale)
      }
      self.nativeAdViewAdOptions = nativeAdViewAdOptions
      self.sampleMediaView = self.sampleAd.mediaView
    }
}

extension SampleMediatedUnifiedNativeAdSwift : GADMediatedUnifiedNativeAd {
    var advertiser : String? {
        return sampleAd.advertiser
    }

    var headline : String? {
      return sampleAd.headline
    }

    var images : [GADNativeAdImage]? {
      return mappedImages
    }

    var body : String? {
      return sampleAd.body
    }

    var icon : GADNativeAdImage? {
      return mappedIcon
    }

    var callToAction : String? {
      return sampleAd.callToAction
    }

    var starRating : NSDecimalNumber? {
      return sampleAd.starRating
    }

    var store : String? {
      return sampleAd.store
    }

    var price : String? {
      return sampleAd.price
    }

    var adChoicesView : UIView? {
      return adInfoView
    }

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

    var mediaView : UIView?{
      return self.sampleMediaView!
    }

    var hasVideoContent : Bool {
      return self.sampleAd.mediaView != nil
    }

    func didRecordImpression() {
      sampleAd.recordImpression()
    }

    func didRender(in view: UIView, clickableAssetViews: [GADUnifiedNativeAssetIdentifier : UIView],
                       nonclickableAssetViews: [GADUnifiedNativeAssetIdentifier : UIView],
                               viewController: UIViewController) {
        // This method is called when the native ad view is rendered.
        // Here you would pass the UIView back to the mediated network's SDK.
        self.sampleAd.mediaView.playMedia()
    }

    func didRecordClickOnAsset(withName assetName: GADUnifiedNativeAssetIdentifier, view: UIView, viewController: UIViewController) {
       sampleAd.handleClick(on: view)
    }

    func didUntrackView(_ view: UIView?) {
        // This method is called when the mediatedNativeAd is no longer
        // rendered in the provided view. Here you would remove any
        // tracking from the view that has mediated native ad.
    }

}

Objective-C

    @interface SampleMediatedNativeAd ()
    @property(nonatomic, strong) SampleNativeAd *sampleAd;
    @property(nonatomic, copy) NSArray *mappedImages;
    @property(nonatomic, strong) GADNativeAdImage *mappedIcon;
    @property(nonatomic, copy) NSDictionary *extras;
    @property(nonatomic, strong) GADNativeAdViewAdOptions *nativeAdViewAdOptions;
    @property(nonatomic, strong) SampleAdInfoView *adInfoView;
    @property(nonatomic, strong) SampleMediaView *mediaView;

    @end

    @implementation SampleMediatedNativeAd

    - (instancetype)initWithSampleNativeAd:(SampleNativeAd *)sampleNativeAd
                     nativeAdViewAdOptions:(nullable GADNativeAdViewAdOptions *)nativeAdViewAdOptions {
      if (!sampleNativeAd) {
        return nil;
      }

      self = [super init];
      if (self) {
        _sampleAd = sampleNativeAd;
        _extras = @{SampleCustomEventExtraKeyAwesomeness : _sampleAd.degreeOfAwesomeness};

        if (_sampleAd.image) {
          _mappedImages = @[ [[GADNativeAdImage alloc] initWithImage:_sampleAd.image] ];
        } else {
          NSURL *imageURL = [[NSURL alloc] initFileURLWithPath:_sampleAd.imageURL];
          _mappedImages =
              @[ [[GADNativeAdImage alloc] initWithURL:imageURL scale:_sampleAd.imageScale] ];
        }

        if (_sampleAd.icon) {
          _mappedIcon = [[GADNativeAdImage alloc] initWithImage:_sampleAd.icon];
        } else {
          NSURL *iconURL = [[NSURL alloc] initFileURLWithPath:_sampleAd.iconURL];
          _mappedIcon = [[GADNativeAdImage alloc] initWithURL:iconURL scale:_sampleAd.iconScale];
        }
        _mediaView = _sampleAd.mediaView;
        _nativeAdViewAdOptions = nativeAdViewAdOptions;

        // The sample SDK provides an AdChoices view (SampleAdInfoView).
        // If your SDK provides image and clickthrough URLs for its
        // AdChoices icon instead of an actual UIView, the adapter is
        // responsible for downloading the icon image and creating the
        // AdChoices icon view.
        _adInfoView = [[SampleAdInfoView alloc] init];
      }
      return self;
    }

    - (BOOL)hasVideoContent {
      return self.sampleAd.mediaView != nil;
    }

    - (UIView *)mediaView {
      return _mediaView;
    }

    - (NSString *)advertiser {
      return self.sampleAd.advertiser;
    }

    - (NSString *)headline {
      return self.sampleAd.headline;
    }

    - (NSArray *)images {
      return self.mappedImages;
    }

    - (NSString *)body {
      return self.sampleAd.body;
    }

    - (GADNativeAdImage *)icon {
      return self.mappedIcon;
    }

    - (NSString *)callToAction {
      return self.sampleAd.callToAction;
    }

    - (NSDecimalNumber *)starRating {
      return self.sampleAd.starRating;
    }

    - (NSString *)store {
      return self.sampleAd.store;
    }

    - (NSString *)price {
      return self.sampleAd.price;
    }

    - (NSDictionary *)extraAssets {
      return self.extras;
    }

    - (UIView *)adChoicesView {
      return self.adInfoView;
    }

    // Because the Sample SDK has click and impression tracking via
    // methods on its native ad object which the developer is required
    // to call, there's no need to pass it a reference to the UIView
    // being used to display the native ad. So there's no need to
    // implement mediatedNativeAd:didRenderInView:viewController:clickableAssetViews:nonClickableAssetViews
    // here. If your mediated network does need a reference to the view,
    // this method can be used to provide one. You can also access the
    // clickable and non-clickable views by asset key if the mediation
    // network needs this information.
    - (void)didRenderInView:(UIView *)view
           clickableAssetViews:
               (NSDictionary<GADUnifiedNativeAssetIdentifier, UIView *> *)clickableAssetViews
        nonclickableAssetViews:
            (NSDictionary<GADUnifiedNativeAssetIdentifier, UIView *> *)nonclickableAssetViews
                viewController:(UIViewController *)viewController {
      // This method is called when the native ad view is rendered.
      // Here you would pass the UIView back to the mediated
      // network's SDK.
      // Playing video using SampleNativeAd's playVideo method
      [_sampleAd playVideo];
    }

    - (void)didUntrackView:(UIView *)view {
      // This method is called when the mediatedNativeAd is no longer
      // rendered in the provided view. Here you would remove any
      // tracking from the view that has mediated native ad.
    }

    - (void)didRecordImpression {
      if (self.sampleAd) {
        [self.sampleAd recordImpression];
      }
    }

    - (void)didRecordClickOnAssetWithName:(GADUnifiedNativeAssetIdentifier)assetName
                                     view:(UIView *)view
                           viewController:(UIViewController *)viewController {
      if (self.sampleAd) {
        [self.sampleAd handleClickOnView:view];
      }
    }

    @end

Trước tiên, hãy xem trình khởi tạo và một số công việc mà trình khởi tạo đang thực hiện.

Giữ nội dung tham chiếu đến đối tượng quảng cáo gốc đã dàn xếp

Trình khởi tạo chấp nhận bản sao SampleNativeAd làm thông số đầu tiên. Đây là lớp quảng cáo gốc được SDK mẫu sử dụng cho quảng cáo gốc. Trình liên kết cần tham chiếu đến đối tượng quảng cáo đã dàn xếp để có thể chuyển sang sự kiện lần nhấp và lần hiển thị. Do đó, trình liên kết lưu trữ quảng cáo dưới dạng sampleAd. Trình khởi tạo cũng lấy một bản sao của GADNativeAdViewAdOptions.

Tạo một NSDictionary để giữ nội dung bổ sung

Một số mạng đã dàn xếp có thể cung cấp thêm nội dung ngoài những nội dung trong định dạng quảng cáo gốc AdMob. Giao thức GADMediatedUnifiedNativeAd bao gồm phương thức đã gọi extraAssets mà SDK quảng cáo trên thiết bị di động của Google sẽ sử dụng để truy xuất bất kỳ nội dung "bổ sung" nào trong số này từ trình liên kết.

Trình khởi tạo ở trên sẽ tạo NSDictionary và điền vào bằng nội dung bổ sung do SDK mẫu cung cấp (trong trường hợp này, giá trị NSString duy nhất có tên degreeOfAwesomeness). Sau đó, NSDictionary được phương thức extraAssets sử dụng như một giá trị trả về:

Swift

extras = [SampleCustomEventExtraKeyAwesomeness : sampleAd.degreeOfAwesomeness]

Objective-C

_extras = @{SampleCustomEventExtraKeyAwesomeness : _sampleAd.degreeOfAwesomeness};

Liên kết nội dung hình ảnh

Việc liên kết nội dung hình ảnh phức tạp hơn một chút so với việc liên kết các kiểu dữ liệu đơn giản hơn như NSString hoặc double. Hình ảnh có thể được tải xuống tự động hoặc đơn giản là được trả về dưới dạng giá trị URL. Mật độ pixel cũng có thể thay đổi. Để giúp các nhà phát triển sự kiện tùy chỉnh quản lý các thông tin chi tiết này, SDK quảng cáo trên thiết bị di động của Google sẽ cung cấp lớp GADNativeAdImage. Thông tin nội dung hình ảnh (cho dù là đối tượng UIImage thực tế hay chỉ là giá trị NSURL) phải được trả về SDK quảng cáo trên thiết bị di động của Google bằng cách sử dụng lớp này.

Dưới đây là cách lớp trình liên kết xử lý việc tạo GADNativeAdImage để giữ hình ảnh biểu tượng:

Swift

if let icon = sampleAd.icon {
    mappedIcon = GADNativeAdImage(image : icon)
}
else {
    let iconURL = URL(fileURLWithPath : sampleNativeAd.iconURL)
    mappedIcon = GADNativeAdImage(url : iconURL, scale : sampleAd.iconScale)
}

Objective-C

if (_sampleAd.icon) {
   _mappedIcon = [[GADNativeAdImage alloc] initWithImage:_sampleAd.icon];
} else {
   NSURL *iconURL = [[NSURL alloc] initFileURLWithPath:_sampleAd.iconURL];
   _mappedIcon = [[GADNativeAdImage alloc] initWithURL:iconURL scale:_sampleAd.iconScale];
}

Nếu bạn gọi lại từ phần đưa ra yêu cầu, nhà xuất bản có thể sử dụng đối tượng GADNativeAdImageAdLoaderOptions để chỉ định không tự động tải hình ảnh quảng cáo gốc xuống. Tại đây, trình liên kết sẽ kiểm tra để xem liệu hình ảnh đã được tải xuống hay chưa và tạo một GADNativeAdImage kèm theo thông tin thích hợp—một UIImage hoặc cặp NSURL và giá trị tỷ lệ phù hợp.

Sau khi đã bao gồm trình khởi chạy, hãy chuyển sang công việc mà bạn có thể thực hiện ở bất kỳ nơi nào trong lớp.

Trả về nội dung được liên kết

Lớp trình kết nối này kế thừa các phương thức từ GADMediatedUnifiedNativeAd tương ứng với nội dung dự kiến cho quảng cáo gốc. SDK quảng cáo trên thiết bị di động của Google sẽ gọi các phương thức này để truy xuất nội dung, vì vậy, lớp trình liên kết của bạn phải trả về giá trị thích hợp. Đối với hầu hết các nội dung, việc này khá đơn giản:

Swift

var headline : String? {
  return sampleAd.headline
}

Objective-C

- (NSString *)headline {
  return self.sampleAd.headline;
}

Tuy nhiên, đối với một số nội dung, các loại dữ liệu có thể không khớp hoặc bắt buộc phải có một số loại chuyển đổi khác. Công việc của trình liên kết là xử lý các chi tiết này và phương thức nội dung là vị trí thích hợp để xử lý.

Lựa chọn quảng cáo

Bộ chuyển đổi của bạn chịu trách nhiệm về việc cung cấp biểu tượng Lựa chọn quảng cáo. Phương thức adChoicesView là phương thức tùy chọn của giao thức GADMediatedUnifiedNativeAd. Khi được triển khai, SDK sẽ sử dụng Chế độ xem Lựa chọn quảng cáo được cung cấp và hiển thị chế độ xem đó trong quảng cáo gốc.

Dưới đây là hoạt động triển khai mẫu về cách cung cấp biểu tượng Lựa chọn quảng cáo:

Swift

class SampleMediatedUnifiedNativeAd: NSObject, GADMediatedUnifiedNativeAd {
  /// Ad networks should provide their own AdChoices view.
  private var adChoicesView: SampleAdChoicesView?

  var adChoicesView : UIView? {
      return adChoicesView
  }

Objective-C

@interface SampleMediatedNativeAd ()<GADMediatedUnifiedNativeAd> {

  /// Ad networks should provide their own AdChoices view.
  SampleAdChoicesView *_adChoicesView;

}

@implementation SampleMediatedNativeAd

- (UIView *)adChoicesView {
  return _adInfoView;
}

Sự kiện lần nhấp và lần hiển thị

Điều quan trọng là SDK của mạng đã dàn xếp phải được thông báo bất kỳ lúc nào khi một lần hiển thị hoặc lần nhấp xảy ra, nhờ đó, lớp Trình liên kết chịu trách nhiệm cung cấp SDK mạng đã dàn xếp cùng với thông tin mà lớp này cần để tự xử lý việc theo dõi lần hiển thị và lần nhấp hoặc để thông báo rõ ràng cho SDK mạng đã dàn xếp biết khi có một lần hiển thị hoặc lần nhấp xảy ra.

Nếu đối tượng quảng cáo gốc đã dàn xếp cung cấp các phương thức để ghi lại lần nhấp và lần hiển thị thì lớp trình liên kết của sự kiện tùy chỉnh có thể sử dụng các phương pháp đó. Đây là phương pháp phổ biến nhất. GADMediatedUnifiedNativeAd bao gồm hai phương thức: didRecordImpression:didRecordClickOnAssetWithName:view:viewController:, trình lập bản đồ sẽ ghi đè và sử dụng để gọi phương thức tương ứng trên đối tượng quảng cáo gốc đã dàn xếp.

Dưới đây là cách SampleMediatedNativeAd xử lý vấn đề này:

Swift

func didRecordImpression() {
  sampleAd.recordImpression()
}

func didRecordClickOnAsset(withName assetName: GADUnifiedNativeAssetIdentifier,
                                    view: UIView,
                                    viewController: UIViewController) {
  sampleAd.handleClick(on: view)
}

Objective-C

- (void)didRecordImpression {
  if (self.sampleAd) {
    [self.sampleAd recordImpression];
  }
}

- (void)didRecordClickOnAssetWithName:(GADUnifiedNativeAssetIdentifier)assetName
                                 view:(UIView *)view
                       viewController:(UIViewController *)viewController {
  if (self.sampleAd) {
    [self.sampleAd handleClickOnView:view];
  }
}

Bởi vì SampleMediatedNativeAd sẽ giữ tham chiếu đến đối tượng quảng cáo gốc của SDK mẫu, nó có thể chỉ cần gọi phương thức thích hợp trên đối tượng đó để báo cáo một lần nhấp hoặc lần hiển thị.

Cho phép SDK đã dàn xếp theo dõi lần nhấp và lần hiển thị

Đối với các mạng quảng cáo cần theo dõi lần nhấp và lần hiển thị riêng, giao thức GADCustomEventNativeAd sẽ cung cấp hai thông báo tùy chọn: handlesUserClickshandlesUserImpressions. Việc trả về YES có từ một trong hai thông báo này cho biết rằng sự kiện tùy chỉnh tự theo dõi loại sự kiện đó. Việc trả về NO hoặc không phản hồi cho biết rằng SDK quảng cáo trên thiết bị di động của Google sẽ thay mặt cho sự kiện tùy chỉnh xử lý việc theo dõi lượt nhấp và lượt hiển thị, đồng thời sử dụng didRecordImpression:didRecordClickOnAssetWithName: trên GADMediatedUnifiedNativeAd để báo cáo về lượt nhấp và lượt hiển thị.

Các sự kiện tùy chỉnh tự theo dõi lượt nhấp hoặc lượt hiển thị có thể sử dụng thông báo didRenderInView: trong giao thức GADMediatedUnifiedNativeAd để chuyển chế độ xem của quảng cáo gốc sang đối tượng quảng cáo gốc của SDK đã dàn xếp, vì vậy, SDK đã dàn xếp có thể sử dụng thông báo này để theo dõi trên thực tế. SDK mẫu hiển thị tính tới thời điểm hiện tại trong ví dụ về mã của hướng dẫn này không sử dụng phương pháp trên để xử lý lượt nhấp và lượt hiển thị, nhưng nếu có, phương thức didRenderInView: thích hợp sẽ có dạng như sau:

Swift

func didRender(in view: UIView,
                  clickableAssetViews: [GADUnifiedNativeAssetIdentifier : UIView],
                  nonclickableAssetViews: [GADUnifiedNativeAssetIdentifier : UIView],
                  viewController: UIViewController) {
  sampleAd?.setNativeAdView(view)
}

Objective-C

- (void)didRenderInView:(UIView *)view
       clickableAssetViews:
           (NSDictionary<GADUnifiedNativeAssetIdentifier, UIView *> *)clickableAssetViews
    nonclickableAssetViews:
        (NSDictionary<GADUnifiedNativeAssetIdentifier, UIView *> *)nonclickableAssetViews
            viewController:(UIViewController *)viewController {
  [self.sampleAd setNativeAdView:view];
}

GADMediatedUnifiedNativeAd cũng bao gồm didUntrackView:, được dùng cho mục đích ngược lại. Sự kiện tùy chỉnh nên triển khai phương thức này để phát hành mọi tham chiếu đến chế độ xem đó và nếu có thể, hãy tách nó khỏi đối tượng quảng cáo gốc.

GADMediatedNativeAdNotificationSource

Để quảng cáo gốc đã dàn xếp báo cáo các sự kiện như bản trình bày màn hình hoặc bản ghi lượt nhấp, SDK sẽ cung cấp lớp GADMediatedNativeAdNotificationSource. SDK có 6 phương thức lớp tương ứng với các sự kiện khác nhau trong đời của quảng cáo gốc đã dàn xếp, mỗi phương thức tham chiếu đến một đối tượng quảng cáo tương ứng:

  • mediatedNativeAdDidRecordImpression: - Phương thức này sẽ được quảng cáo gốc đã dàn xếp gọi từ sự kiện tùy chỉnh theo dõi số lần nhấp cho chính các quảng cáo đó để báo cáo số lần hiển thị trở lại SDK quảng cáo trên thiết bị di động của Google. Đây là điều bắt buộc cho mục đích báo cáo.
  • mediatedNativeAdDidRecordClick: - Tương tự, các sự kiện tùy chỉnh theo dõi số lần nhấp của riêng chúng nên quảng cáo gốc đã dàn xếp của các sự kiện đó gọi phương thức này để báo cáo rằng có một lần nhấp đã xảy ra.
  • mediatedNativeAdWillPresentScreen: - Phải được gọi ngay trước khi quảng cáo gốc đã dàn xếp mở màn hình phương thức trong ứng dụng.
  • mediatedNativeAdWillDismissScreen: - Phải được gọi ngay trước khi màn hình phương thức trong ứng dụng do quảng cáo gốc đã dàn xếp mở bị loại bỏ.
  • mediatedNativeAdDidDismissScreen: - Phải được gọi sau khi màn hình phương thức trong ứng dụng do quảng cáo gốc đã dàn xếp mở bị loại bỏ.
  • mediatedNativeAdWillLeaveApplication: - Phải được gọi ngay trước khi quảng cáo gốc đã dàn xếp khiến tiêu điểm rời khỏi ứng dụng, chẳng hạn như khi mở URL đích trong Safari.

Sử dụng sự kiện tùy chỉnh

Để sử dụng một sự kiện tùy chỉnh, bạn cần phải thêm sự kiện đó vào cấu hình dàn xếp cho một đơn vị quảng cáo. Việc này được thực hiện trong giao diện AdMob. (Tạo một sự kiện tùy chỉnh cung cấp hướng dẫn chi tiết về cách chỉnh sửa cấu hình dàn xếp của một đơn vị quảng cáo).

Khi thêm sự kiện tùy chỉnh vào cấu hình dàn xếp của một đơn vị quảng cáo, bạn sẽ được yêu cầu cung cấp 3 thông tin sau:

  • Class Name - Đây là tên lớp của sự kiện tùy chỉnh.
  • Label - Đây là nhãn mà bạn muốn giao diện của AdMob sử dụng để giới thiệu sự kiện tùy chỉnh khi sự kiện hiển thị nguồn dàn xếp của đơn vị quảng cáo. Chỉ bạn mới thấy thông tin này, vì thông tin chỉ hiển thị trên AdMob.com
  • Parameter - Đây là một giá trị chuỗi được chuyển tới sự kiện tùy chỉnh bất cứ khi nào các yêu cầu cho đơn vị quảng cáo này được tạo. Thông thường, giá trị này được đặt thành nột ID đơn vị quảng cáo từ mạng dàn xếp.

Dưới đây là ảnh chụp màn hình về một mục nhập của sự kiện tùy chỉnh mẫu:

Vậy là xong! Bây giờ, bạn đã có mọi thông tin cần thiết để viết các sự kiện tùy chỉnh iOS cho AdMob.