Phát triển bộ chuyển đổi dàn xếp mạng quảng cáo

Hướng dẫn này dành cho các mạng quảng cáo đang tìm cách tạo bộ chuyển đổi dàn xếp. Nếu bạn là nhà xuất bản, hãy xem hướng dẫn dàn xếp dành cho nhà xuất bản.

Bộ chuyển đổi dàn xếp là lớp giao tiếp giữa mạng quảng cáo của bạn và tính năng Dàn xếp quảng cáo trên thiết bị di động của Google. Bộ điều hợp phân phát quảng cáo từ mạng quảng cáo của bạn trong khi chuyển tiếp các sự kiện quảng cáo có liên quan đến AdMob. Bộ chuyển đổi chịu trách nhiệm triển khai giao thức GADMAdNetworkAdapter để đảm bảo giao thức đó cung cấp các tính năng cần thiết.

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

  • Xcode 15.3 trở lên
  • Mục tiêu triển khai từ 8.0 trở lên
  • Các tiêu đề bổ sung từ thư mục Bộ điều hợp dàn xếp của mục tải xuống SDK quảng cáo trên thiết bị di động của Google dành cho iOS

Mạng quảng cáo của bạn phải có mối quan hệ làm việc đã thiết lập với Google để tạo bộ chuyển đổi dàn xếp.

Mạng quảng cáo mẫu

Hướng dẫn này trình bày cách tạo bộ chuyển đổi cho Mạng quảng cáo mẫu. SDK mạng quảng cáo mẫu chứa các lớp đại diện cho các lớp được hầu hết các mạng quảng cáo cung cấp:

@interface SampleBanner : UILabel

@property(nonatomic, copy) NSString *adUnit;
@property(nonatomic, weak) id<SampleBannerAdDelegate> delegate;
- (void)fetchAd:(SampleAdRequest *)request;

@end

typedef NS_ENUM(NSInteger, SampleErrorCode) {
  SampleErrorCodeBadRequest = 0,
  SampleErrorCodeUnknown = 1,
  SampleErrorCodeNetworkError = 2,
  SampleErrorCodeNoInventory = 3,
};

@interface SampleAdRequest : NSObject

@property(nonatomic, assign) BOOL testMode;
@property(nonatomic, copy) NSArray *keywords;

@end

@interface SampleInterstitial : NSObject

@property(nonatomic, copy) NSString *adUnit;
@property(nonatomic, weak) id<SampleInterstitialAdDelegate> delegate;
@property(nonatomic, assign, getter=isInterstitialLoaded) BOOL interstitialLoaded;
- (void)fetchAd:(SampleAdRequest *)request;
- (void)show;

@end

@protocol SampleBannerAdDelegate
- (void)bannerDidLoad:(SampleBanner *)banner;
- (void)banner:(SampleBanner *)banner didFailToLoadAdWithError:(SampleErrorCode)error;
- (void)bannerWillLeaveApplication:(SampleBanner *)banner;

@end

@protocol SampleInterstitialAdDelegate<NSObject>
- (void)interstitialDidLoad:(SampleInterstitial *)interstitial;
- (void)interstitial:(SampleInterstitial *)interstitial
    didFailToLoadAdWithError:(SampleErrorCode)error;
- (void)interstitialWillPresentScreen:(SampleInterstitial *)interstitial;
- (void)interstitialWillDismissScreen:(SampleInterstitial *)interstitial;
- (void)interstitialDidDismissScreen:(SampleInterstitial *)interstitial;
- (void)interstitialWillLeaveApplication:(SampleInterstitial *)interstitial;

@end

Xem quy trình triển khai SDK mẫu hoàn chỉnh để biết thêm thông tin về các lớp này.

Trình kết nối

Bộ chuyển đổi dàn xếp tương tác với SDK quảng cáo trên thiết bị di động của Google bằng cách sử dụng một đối tượng sẽ triển khai giao thức GADMAdNetworkConnector. Từ đây trở đi, chúng tôi sẽ gọi đối tượng này là trình kết nối. Trình kết nối hiển thị thông tin cần thiết cho các yêu cầu quảng cáo, đồng thời cung cấp một phương thức để gọi lại tính năng dàn xếp cho các sự kiện quảng cáo và hoạt động tương tác của người dùng. Trình kết nối được cung cấp cho bộ chuyển đổi dàn xếp tại thời điểm khởi chạy. Thiết lập bộ chuyển đổi để lưu trữ trình kết nối trong một biến mẫu:

- (id)initWithGADMAdNetworkConnector:(id<GADMAdNetworkConnector>)c {
  if ((self = [super init])) {
    _connector = c;
  }
  return self;
}

Tham số máy chủ

Mạng quảng cáo của bạn có thể cần(các) giá trị nhận dạng để xác định một nhà xuất bản. Ví dụ: Mạng quảng cáo mẫu yêu cầu một đơn vị quảng cáo. Các thông số máy chủ bắt buộc này được cung cấp cho bộ chuyển đổi thông qua phương thức credentials. Phương thức này sẽ trả về NSDictionary gồm(các) giá trị nhận dạng và các giá trị tương ứng. Dòng mã sau đây truy xuất thông số máy chủ có tên là ad_unit cho Mạng quảng cáo mẫu từ trình kết nối:

self.interstitialAd.adUnit = [[self.connector credentials] objectForKey:@"ad_unit"];

Thiết lập mạng dàn xếp

Mạng quảng cáo phải thông báo cho AdMob về các thông số máy chủ bắt buộc cho mạng của chúng. Điều này cho phép AdMob định cấu hình mạng của bạn trong giao diện người dùng.

Khi bật mạng cho tính năng dàn xếp trong giao diện người dùng, AdMob yêu cầu bạn nhập các giá trị cần thiết để tạo thực thể cho bộ chuyển đổi. Ảnh chụp màn hình dưới đây cho thấy rằng bắt buộc phải có Giá trị nhận dạng vị trí ứng dụng (APID) cho Millennial Media và bắt buộc phải có ID ứng dụng cho NavHost.

Hãy xem bài viết này để biết thêm thông tin về cách định cấu hình mạng quảng cáo dàn xếp.

Tạo yêu cầu quảng cáo trong quy trình dàn xếp

Đối với các yêu cầu biểu ngữ dàn xếp, phương thức getBannerWithSize được gọi ngay sau khi bộ chuyển đổi được tạo thực thể. Phương thức này không trả về bất kỳ giá trị nào. Phương thức này sẽ báo hiệu cho bộ chuyển đổi để bắt đầu tìm nạp quảng cáo không đồng bộ trên mạng. Yêu cầu bộ chuyển đổi theo dõi các lệnh gọi lại cho SDK của bạn. Nếu SDK của bạn không hỗ trợ kích thước quảng cáo nhất định hoặc không hỗ trợ quảng cáo biểu ngữ, hãy gọi phương thức adapter:didFailAd: trên trình kết nối.

Hoạt động triển khai getBannerWithSize cho Mạng quảng cáo mẫu sẽ có dạng như sau:

- (void)getBannerWithSize:(GADAdSize)adSize {
  //The adapter should fail immediately if the adSize is not supported
  if (!GADAdSizeEqualToSize(adSize, GADAdSizeBanner) &&
      !GADAdSizeEqualToSize(adSize, GADAdSizeMediumRectangle) &&
      !GADAdSizeEqualToSize(adSize, GADAdSizeFullBanner) &&
      !GADAdSizeEqualToSize(adSize, GADAdSizeLeaderboard)) {
    NSString *errorDesc =
        [NSString stringWithFormat:@"Invalid ad type %@, not going to get ad.",
                                   NSStringFromGADAdSize(adSize)];
    NSDictionary *errorInfo = [NSDictionary
        dictionaryWithObjectsAndKeys:errorDesc, NSLocalizedDescriptionKey, nil];
    NSError *error = [NSError errorWithDomain:GADErrorDomain
                                         code:GADErrorMediationInvalidAdSize
                                     userInfo:errorInfo];
    [self.connector adapter:self didFailAd:error];
    return;
  }
  self.bannerAd = [[SampleBanner alloc]
      initWithFrame:CGRectMake(0, 0, adSize.size.width, adSize.size.height)];

  self.bannerAd.delegate = self;
  self.bannerAd.adUnit = [[self.connector credentials] objectForKey:@"ad_unit"];

  // Setup request parameters.
  SampleAdRequest *request = [[SampleAdRequest alloc] init];
  request.testMode = self.connector.testMode;
  request.keywords = self.connector.userKeywords;
  [self.bannerAd fetchAd:request];
  NSLog(@"Requesting banner from Sample Ad Network");
}

Thông số nhắm mục tiêu bổ sung

Trình kết nối chứa một số thông tin nhắm mục tiêu phổ biến mà bạn có thể tham khảo để nhắm mục tiêu quảng cáo:

  • userKeywords
  • testMode
  • childDirectedTreatment

Phần phụ dàn xếp

Phần phụ dàn xếp cho phép mạng quảng cáo của bạn hỗ trợ các mục nhập hoặc thông số nhắm mục tiêu phụ không được bao gồm bởi các thông số yêu cầu bổ sung do trình kết nối cung cấp. Chức năng này có thể được cung cấp thông qua một lớp triển khai giao thức GADAdNetworkExtras. Dưới đây là ví dụ về lớp SampleAdNetworkExtras:

@interface SampleAdNetworkExtras : NSObject <GADAdNetworkExtras>
/// Should ad volume audio be muted.
@property(nonatomic, assign) BOOL muteAudio;

@end

Nhà xuất bản phải chuyển một bản sao của lớp con GADAdNetworkExtras khi đưa ra yêu cầu quảng cáo. Bạn có thể truy cập vào thực thể lớp con này của GADAdNetworkExtras thông qua trình kết nối. Dưới đây là cách bạn có thể sử dụng phần phụ dàn xếp khi tạo yêu cầu quảng cáo cho mạng của mình:

SampleAdRequest *request = [[SampleAdRequest alloc] init];
SampleAdNetworkExtras *myAdNetworkExtras = [self.connector networkExtras];
request.muteAudio = myAdNetworkExtras.muteAudio;
[self.bannerAd fetchAd:request];

Để đảm bảo có thể truy cập lớp con GADAdNetworkExtras thông qua trình kết nối, hãy triển khai networkExtrasClass và trả về lớp con GADAdNetworkExtras:

+ (Class<GADAdNetworkExtras>)networkExtrasClass {
  return [SampleAdNetworkExtras class];
}

Nếu bộ chuyển đổi của bạn không sử dụng phần phụ dàn xếp, phương thức networkExtrasClass sẽ trả về Nil.

Thông báo cho tính năng dàn xếp

Yêu cầu bộ chuyển đổi triển khai trình nghe quảng cáo cho mạng của bạn và chuyển tiếp các lệnh gọi lại sự kiện quảng cáo có liên quan thông qua trình kết nối. Bảng dưới đây giải thích thời điểm nên gọi từng phương thức đại biểu:

Phương thức Thời gian gọi
adapter:didReceiveAdView: Đã yêu cầu quảng cáo biểu ngữ thành công.
adapter:didFailAd: Yêu cầu quảng cáo biểu ngữ không thành công.
adapterDidGetAdClick: Đã nhấp vào biểu ngữ.
adapterWillPresentFullScreenModal: Quảng cáo biểu ngữ sẽ hiển thị một lớp phủ trong ứng dụng.
adapterWillDismissFullScreenModal: Lớp phủ trong ứng dụng sẽ đóng.
adapterDidDismissFullScreenModal: Đã đóng lớp phủ trong ứng dụng.
adapterWillLeaveApplication: Ứng dụng sẽ được đặt ở chế độ nền hoặc chấm dứt vì người dùng đã nhấp vào một quảng cáo sẽ khởi chạy một ứng dụng khác.

Ví dụ sau sẽ triển khai giao diện SampleBannerAdDelegate từ Mạng quảng cáo mẫu để chuyển tiếp các thông báo lỗi và trạng thái:

- (void)bannerDidLoad:(SampleBanner *)banner {
  [self.connector adapter:self didReceiveAdView:banner];
}

- (void)banner:(SampleBanner *)banner didFailWithError:(SampleErrorCode)error {
  [self.connector adapter:self
                didFailAd:[NSError errorWithDomain:@"Ad request failed"
                                              code:error
                                          userInfo:nil]];
}

- (void)bannerWillLeaveApplication:(SampleBanner *)banner {
  [self.connector adapterDidGetAdClick:self];
  [self.connector adapterWillLeaveApplication:self];
}

Khởi chạy lớp phủ trong ứng dụng so với ứng dụng bên ngoài

Khi người dùng nhấp vào một biểu ngữ, quảng cáo có thể mở lớp phủ toàn màn hình hoặc một ứng dụng bên ngoài (chẳng hạn như Safari hoặc cửa hàng ứng dụng). Các lệnh gọi lại của trình kết nối để gọi trong 2 trường hợp này là khác nhau.

Nếu lượt nhấp vào biểu ngữ mở ra lớp phủ toàn màn hình, hãy gọi adapterWillPresentFullScreenModal: khi trình bày lớp phủ đó. Khi lớp phủ đóng, hãy gọi cả adapterWillDismissFullScreenModal:adapterDidDismissFullScreenModal:.

Nếu lượt nhấp vào quảng cáo biểu ngữ (hoặc lượt nhấp vào lớp phủ toàn màn hình) khiến người dùng rời khỏi ứng dụng, hãy thực hiện lệnh gọi lại adapterWillLeaveApplication:.

Bây giờ, bạn đã có một bộ chuyển đổi dàn xếp đang hoạt động cho quảng cáo biểu ngữ. Để tham khảo, bạn có thể xem hoạt động triển khai đầy đủ của SampleAdapter trên GitHub.

Triển khai bộ chuyển đổi quảng cáo xen kẽ

Việc triển khai bộ chuyển đổi cho quảng cáo xen kẽ tương tự như quảng cáo biểu ngữ. Phương thức getInterstitial được gọi ngay sau khi bộ chuyển đổi được tạo. Phương thức này không trả về bất cứ giá trị nào. Bộ chuyển đổi dự kiến sẽ bắt đầu tìm nạp quảng cáo không đồng bộ trên mạng. Hãy làm cho bộ chuyển đổi hoạt động như một uỷ quyền cho SDK để theo dõi các lệnh gọi lại. Nếu SDK của bạn không hỗ trợ quảng cáo xen kẽ, hãy gọi phương thức adapter:didFailAd: của trình kết nối như sau:

- (void)getInterstitial {
  self.interstitialAd = [[SampleInterstitial alloc] init];
  self.interstitialAd.delegate = self;
  self.interstitialAd.adUnit =
      [[self.connector credentials] objectForKey:@"ad_unit"];

  SampleAdRequest *request = [[SampleAdRequest alloc] init];
  // Setup request parameters.
  request.testMode = self.connector.testMode;
  request.keywords = self.connector.userKeywords;

  [self.interstitialAd fetchAd:request];
  NSLog(@"Requesting interstitial from Sample Ad Network");
}

Giống như với MediationBannerAdapter, bạn có thể nhận mã nhận dạng nhà xuất bản và thông tin nhắm mục tiêu quảng cáo từ trình kết nối.

Thông báo cho tính năng dàn xếp

Yêu cầu bộ chuyển đổi triển khai đại biểu quảng cáo cho mạng của bạn và chuyển tiếp các lệnh gọi lại sự kiện quảng cáo có liên quan thông qua trình kết nối. Bảng dưới đây giải thích thời điểm nên gọi từng phương thức uỷ quyền:

Phương thức Thời gian gọi
adapterDidReceiveInterstitial: Yêu cầu quảng cáo xen kẽ thành công.
adapter:didFailInterstitial: Yêu cầu quảng cáo xen kẽ không thành công.
adapterDidGetAdClick: Đã nhấp vào quảng cáo xen kẽ.
adapterWillPresentInterstitial: Quảng cáo xen kẽ sẽ được hiển thị.
adapterWillDismissInterstitial: Quảng cáo xen kẽ sẽ bị loại bỏ.
adapterDidDismissInterstitial: Quảng cáo xen kẽ đã bị loại bỏ.
adapterWillLeaveApplication: Ứng dụng sẽ chạy ở chế độ nền hoặc chấm dứt vì người dùng đã nhấp vào một quảng cáo sẽ khởi chạy một ứng dụng khác.

Ví dụ sau sẽ triển khai giao diện SampleInterstitialAdDelegate của Mạng quảng cáo mẫu để chuyển tiếp các thông báo lỗi và trạng thái:

- (void)interstitialDidLoad:(SampleInterstitial *)interstitial {
  [self.connector adapterDidReceiveInterstitial:self];
}

- (void)interstitial:(SampleInterstitial *)interstitial
    didFailWithError:(SampleErrorCode)error {
  [self.connector adapter:self
      didFailInterstitial:[NSError errorWithDomain:@"Ad request failed"
                                              code:error
                                          userInfo:nil]];
}

- (void)interstitialWillPresentScreen:(SampleInterstitial *)interstitial {
  [self.connector adapterWillPresentInterstitial:self];
}

- (void)interstitialWillDismissScreen:(SampleInterstitial *)interstitial {
  [self.connector adapterWillDismissInterstitial:self];
}

- (void)interstitialDidDismissScreen:(SampleInterstitial *)interstitial {
  [self.connector adapterDidDismissInterstitial:self];
}

Hiển thị quảng cáo xen kẽ

Sau khi bộ chuyển đổi gọi adapterDidReceiveInterstitial, hãy đợi hiển thị quảng cáo xen kẽ cho đến khi presentInterstitialFromRootViewController được gọi. Nhà phát triển ứng dụng sẽ quyết định thời điểm hiển thị quảng cáo xen kẽ, có thể là vài phút sau khi nhận được.

Dưới đây là hoạt động triển khai presentInterstitialFromRootViewController: cho Mạng quảng cáo mẫu:

- (void)presentInterstitialFromRootViewController:
    (UIViewController *)rootViewController {
  if ([self.interstitialAd isLoaded]) {
    [self.interstitialAd show];
  }
}

Bộ chuyển đổi dàn xếp của bạn đã sẵn sàng để xử lý quảng cáo xen kẽ. Để tham khảo, bạn có thể xem hoạt động triển khai đầy đủ của SampleAdapter trên GitHub.

Câu hỏi thường gặp

Tôi nên đưa bộ chuyển đổi vào như một phần của thư viện SDK hay dưới dạng một thư viện riêng?
Bạn nên đưa bộ chuyển đổi vào thư viện SDK để nhà phát triển chỉ cần tham chiếu một thư viện để kết hợp mạng của bạn.
Tôi phải làm gì nếu bộ chuyển đổi của tôi chỉ hỗ trợ quảng cáo biểu ngữ?

Nếu bộ chuyển đổi của bạn chỉ hỗ trợ quảng cáo biểu ngữ, hãy chuyển tiếp một sự kiện lỗi đến hoạt động dàn xếp cho các yêu cầu quảng cáo xen kẽ:

- (void)getInterstitial {
  NSDictionary *errorInfo = @{ NSLocalizedDescriptionKey : @"Some error" };
  NSError *error = [NSError errorWithDomain:GADErrorDomain
                                       code:GADErrorInvalidRequest
                                   userInfo:errorInfo];
  [self.connector adapter:self didFailInterstitial:error];
  return;
}
Tôi phải làm gì nếu bộ chuyển đổi của tôi chỉ hỗ trợ quảng cáo xen kẽ?

Nếu bộ chuyển đổi của bạn chỉ hỗ trợ quảng cáo xen kẽ, hãy chuyển tiếp sự kiện lỗi đến nền tảng dàn xếp cho các yêu cầu quảng cáo biểu ngữ:

- (void)getBannerWithSize:(GADAdSize)adSize {
  NSDictionary *errorInfo = @{ NSLocalizedDescriptionKey : @"Some error" };
  NSError *error =
      [NSError errorWithDomain:GADErrorDomain
                          code:GADErrorInvalidRequest
                      userInfo:errorInfo];
  [self.connector adapter:self didFailAd:error];
  return;
}