การพัฒนาอะแดปเตอร์สื่อกลางเครือข่ายโฆษณา

คู่มือนี้มีไว้สําหรับเครือข่ายโฆษณาที่ต้องการสร้างอะแดปเตอร์สื่อกลาง หากคุณเป็นผู้เผยแพร่โฆษณา โปรดดูวิธีการสำหรับสื่อกลางของผู้เผยแพร่โฆษณา

อะแดปเตอร์สื่อกลางคือชั้นของการสื่อสารระหว่างเครือข่ายโฆษณากับสื่อกลางโฆษณาบนอุปกรณ์เคลื่อนที่ของ Google อะแดปเตอร์จะแสดงโฆษณาจากเครือข่ายโฆษณาพร้อมกับ ส่งต่อเหตุการณ์โฆษณาที่เกี่ยวข้องไปยัง AdMob อะแดปเตอร์มีหน้าที่รับผิดชอบในการใช้งานโปรโตคอล GADMAdNetworkAdapter เพื่อให้แน่ใจว่ามีความสามารถที่จำเป็น

ข้อกำหนดเบื้องต้น

  • Xcode 15.3 ขึ้นไป
  • เป้าหมายการทำให้ใช้งานได้ 8.0 ขึ้นไป
  • ส่วนหัวเพิ่มเติมจากโฟลเดอร์อะแดปเตอร์สื่อกลาง ของการดาวน์โหลด SDK iOS โฆษณาบนอุปกรณ์เคลื่อนที่ของ Google

เครือข่ายโฆษณาของคุณต้องมีความสัมพันธ์ในการทำงานกับ Google เป็นอย่างดีเพื่อสร้างอะแดปเตอร์สื่อกลาง

เครือข่ายโฆษณาตัวอย่าง

คู่มือนี้สาธิตวิธีสร้างอะแดปเตอร์สำหรับเครือข่ายโฆษณาตัวอย่าง SDK เครือข่ายโฆษณาตัวอย่างประกอบด้วยคลาสที่เป็นตัวแทนของคลาสที่นำเสนอโดยเครือข่ายโฆษณาส่วนใหญ่ ดังนี้

@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

ดูข้อมูลเพิ่มเติมเกี่ยวกับคลาสเหล่านี้ได้ในตัวอย่างการใช้งาน SDK ที่สมบูรณ์

ผู้ให้บริการเชื่อมต่อ

อะแดปเตอร์สื่อกลางจะโต้ตอบกับ SDK โฆษณาในอุปกรณ์เคลื่อนที่ของ Google โดยใช้ออบเจ็กต์ที่ใช้โปรโตคอล GADMAdNetworkConnector จากนี้ไป เราจะเรียก ออบเจ็กต์นี้ว่า "เครื่องมือเชื่อมต่อ" เครื่องมือเชื่อมต่อจะแสดงข้อมูลที่จำเป็นสำหรับคำขอโฆษณาและให้วิธีในการเรียกกลับไปยังสื่อกลางสำหรับเหตุการณ์โฆษณาและการโต้ตอบของผู้ใช้ เครื่องมือเชื่อมต่อจะมีให้กับอะแดปเตอร์สื่อกลาง ณ เวลาที่เริ่มต้น ตั้งค่าอะแดปเตอร์ให้จัดเก็บเครื่องมือเชื่อมต่อในตัวแปรอินสแตนซ์ ดังนี้

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

พารามิเตอร์เซิร์ฟเวอร์

เครือข่ายโฆษณาอาจต้องใช้ตัวระบุเพื่อระบุผู้เผยแพร่โฆษณา ตัวอย่างเช่น เครือข่ายโฆษณาตัวอย่างต้องมีหน่วยโฆษณา ระบบจะส่งพารามิเตอร์เซิร์ฟเวอร์ที่จำเป็นเหล่านี้ให้กับอะแดปเตอร์ผ่านเมธอด credentials ซึ่งจะแสดงผล NSDictionary ของตัวระบุและค่าที่สอดคล้องกัน บรรทัดโค้ดต่อไปนี้จะเรียกพารามิเตอร์เซิร์ฟเวอร์ชื่อ ad_unit ของเครือข่ายโฆษณาตัวอย่างจากเครื่องมือเชื่อมต่อ

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

การตั้งค่าเครือข่ายสื่อกลาง

เครือข่ายโฆษณาต้องแจ้ง AdMob เกี่ยวกับพารามิเตอร์เซิร์ฟเวอร์ที่จำเป็นสำหรับเครือข่าย วิธีนี้ช่วยให้ AdMob กำหนดค่าเครือข่ายของคุณในส่วนหน้าได้

เมื่อเปิดใช้เครือข่ายสำหรับสื่อกลางในส่วนหน้า AdMob กำหนดให้คุณต้องป้อนค่าที่จำเป็นในการสร้างอินสแตนซ์อะแดปเตอร์ ภาพหน้าจอด้านล่างแสดงให้เห็นว่า Application Placement Identifier (APID) ของ Millennial Media ต้องมีรหัสแอปสำหรับ InMobi

ไปที่บทความนี้สำหรับข้อมูลเพิ่มเติม เกี่ยวกับการกำหนดค่าเครือข่ายโฆษณาของสื่อกลาง

สร้างคำขอโฆษณาสื่อกลาง

สำหรับคำขอแบนเนอร์สื่อกลาง ระบบจะเรียกใช้เมธอด getBannerWithSize ทันทีหลังจากที่สร้างอินสแตนซ์อะแดปเตอร์แล้ว วิธีนี้จะไม่แสดงผลใดๆ เลย โดยจะส่งสัญญาณให้อะแดปเตอร์เริ่มการดึงโฆษณาแบบอะซิงโครนัสผ่านเครือข่าย ให้อะแดปเตอร์คอยฟังโค้ดเรียกกลับสำหรับ SDK หาก SDK ไม่รองรับขนาดโฆษณาที่ระบุหรือไม่รองรับโฆษณาแบนเนอร์ ให้เรียกใช้เมธอด adapter:didFailAd: ในเครื่องมือเชื่อมต่อ

การติดตั้งใช้งาน getBannerWithSize สำหรับเครือข่ายโฆษณาตัวอย่างจะมีลักษณะดังนี้

- (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");
}

พารามิเตอร์การกำหนดเป้าหมายเพิ่มเติม

เครื่องมือเชื่อมต่อประกอบด้วยข้อมูลการกำหนดเป้าหมายทั่วไปบางส่วนที่คุณใช้อ้างอิงสำหรับการกำหนดเป้าหมายโฆษณาได้ ดังนี้

  • userKeywords
  • testMode
  • childDirectedTreatment

ส่วนเสริมสำหรับสื่อกลาง

ส่วนเสริมสื่อกลางทำให้เครือข่ายโฆษณารองรับพารามิเตอร์การกำหนดเป้าหมายเพิ่มเติมหรืออินพุตที่พารามิเตอร์คำขอเพิ่มเติมที่เครื่องมือเชื่อมต่อไม่ได้ครอบคลุม ฟังก์ชันการทำงานนี้จัดเตรียมได้ผ่านคลาสที่ใช้โปรโตคอล GADAdNetworkExtras คลาส SampleAdNetworkExtras แสดงตามตัวอย่างด้านล่างนี้

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

@end

ผู้เผยแพร่โฆษณาต้องผ่านอินสแตนซ์ของคลาสย่อย GADAdNetworkExtras เมื่อส่งคำขอโฆษณา อินสแตนซ์ของคลาสย่อย GADAdNetworkExtras นี้เข้าถึงได้ผ่านเครื่องมือเชื่อมต่อ วิธีใช้ส่วนเสริมสื่อกลางเมื่อสร้างคำขอโฆษณาสำหรับเครือข่ายของคุณมีดังนี้

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

หากต้องการตรวจสอบว่าจะเข้าถึงคลาสย่อย GADAdNetworkExtras ผ่านเครื่องมือเชื่อมต่อได้ โปรดติดตั้งใช้งาน networkExtrasClass และแสดงผลคลาสย่อย GADAdNetworkExtras ดังนี้

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

หากอะแดปเตอร์ไม่ได้ใช้ส่วนเสริมสื่อกลาง เมธอด networkExtrasClass จะแสดงผล Nil

แจ้งสื่อกลาง

ให้อะแดปเตอร์ใช้ Listener โฆษณาสำหรับเครือข่ายของคุณ และส่งต่อโค้ดเรียกกลับของเหตุการณ์โฆษณาที่เกี่ยวข้องผ่านเครื่องมือเชื่อมต่อ ตารางด้านล่างอธิบายกรณีที่ควรเรียกใช้เมธอดผู้รับมอบสิทธิ์แต่ละวิธี

วิธีการ เวลาที่จะโทร
adapter:didReceiveAdView: ส่งคำขอแบนเนอร์สำเร็จแล้ว
adapter:didFailAd: คำขอแบนเนอร์ล้มเหลว
adapterDidGetAdClick: คลิกแบนเนอร์แล้ว
adapterWillPresentFullScreenModal: แบนเนอร์จะแสดงการวางซ้อนในแอป
adapterWillDismissFullScreenModal: การวางซ้อนในแอปจะปิดลง
adapterDidDismissFullScreenModal: ปิดการวางซ้อนในแอปแล้ว
adapterWillLeaveApplication: แอปพลิเคชันจะวางอยู่ในพื้นหลังหรือสิ้นสุดลงเนื่องจากผู้ใช้คลิกที่โฆษณาที่จะเปิดใช้งานแอปพลิเคชันอื่น

ตัวอย่างต่อไปนี้ใช้อินเทอร์เฟซ SampleBannerAdDelegate จากเครือข่ายโฆษณาตัวอย่างเพื่อส่งต่อข้อความแสดงข้อผิดพลาดและข้อความสถานะ

- (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];
}

เปิดการวางซ้อนในแอปเทียบกับแอปพลิเคชันภายนอก

เมื่อมีการคลิกแบนเนอร์ โฆษณาอาจเปิดโฆษณาซ้อนทับแบบเต็มหน้าจอหรือแอปพลิเคชันภายนอก (เช่น Safari หรือ App Store) การเรียกกลับของเครื่องมือเชื่อมต่อที่จะเรียกใช้ ในสองกรณีนี้จะแตกต่างกัน

หากการคลิกแบนเนอร์จะเปิดโฆษณาซ้อนทับแบบเต็มหน้าจอ ให้เรียกใช้ adapterWillPresentFullScreenModal: เมื่อนำเสนอการวางซ้อน เมื่อการวางซ้อนปิดอยู่ ให้เรียกทั้ง adapterWillDismissFullScreenModal: และ adapterDidDismissFullScreenModal:

หากการคลิกแบนเนอร์ (หรือการคลิกวางซ้อนแบบเต็มหน้าจอ) ทำให้ผู้ใช้ออกจากแอปพลิเคชัน ให้เรียกใช้โค้ดเรียกกลับ adapterWillLeaveApplication:

ตอนนี้คุณมีอะแดปเตอร์สื่อกลางที่ใช้งานได้สำหรับแบนเนอร์แล้ว ดูการใช้งาน SampleAdapter แบบสมบูรณ์ได้ใน GitHub

ใช้อะแดปเตอร์คั่นระหว่างหน้า

การใช้งานอะแดปเตอร์สำหรับโฆษณาคั่นระหว่างหน้าจะคล้ายกับโฆษณาแบนเนอร์ ระบบจะเรียกใช้เมธอด getInterstitial ทันทีหลังจากที่ระบุอะแดปเตอร์แล้ว วิธีนี้ไม่แสดงข้อมูลใดๆ อะแดปเตอร์จะเริ่มต้นการดึงข้อมูลโฆษณาแบบไม่พร้อมกันผ่านเครือข่าย ให้อะแดปเตอร์ทำหน้าที่เป็น มอบสิทธิ์ให้กับ SDK สำหรับการฟังโค้ดเรียกกลับ หาก SDK ไม่รองรับโฆษณาคั่นระหว่างหน้า ให้เรียกใช้เมธอด adapter:didFailAd: ของเครื่องมือเชื่อมต่อดังนี้

- (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");
}

คุณจะได้รับการระบุผู้เผยแพร่โฆษณาและข้อมูลการกำหนดเป้าหมายโฆษณาจากเครื่องมือเชื่อมต่อเช่นเดียวกับ MediationBannerAdapter

แจ้งสื่อกลาง

ให้อะแดปเตอร์ใช้การมอบสิทธิ์โฆษณาสำหรับเครือข่ายของคุณ และส่งต่อโค้ดเรียกกลับของเหตุการณ์โฆษณาที่เกี่ยวข้องผ่านเครื่องมือเชื่อมต่อ ตารางด้านล่างอธิบายกรณีที่จะเรียก เมธอดการมอบสิทธิ์แต่ละวิธี

วิธีการ เวลาที่จะโทร
adapterDidReceiveInterstitial: ส่งคำขอคั่นระหว่างหน้าสำเร็จแล้ว
adapter:didFailInterstitial: ส่งคำขอคั่นระหว่างหน้าไม่สำเร็จ
adapterDidGetAdClick: โฆษณาคั่นระหว่างหน้าถูกคลิก
adapterWillPresentInterstitial: โฆษณาคั่นระหว่างหน้าจะปรากฏขึ้น
adapterWillDismissInterstitial: โฆษณาคั่นระหว่างหน้าจะปิดลง
adapterDidDismissInterstitial: ปิดโฆษณาคั่นระหว่างหน้าแล้ว
adapterWillLeaveApplication: แอปพลิเคชันจะทำงานอยู่เบื้องหลังหรือสิ้นสุดลงเนื่องจากผู้ใช้คลิกโฆษณาที่จะเปิดใช้งานแอปพลิเคชันอื่น

ตัวอย่างต่อไปนี้ใช้อินเทอร์เฟซ SampleInterstitialAdDelegate ของเครือข่ายโฆษณาตัวอย่างเพื่อส่งต่อข้อความแสดงข้อผิดพลาดและข้อความสถานะ

- (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];
}

แสดงโฆษณาคั่นระหว่างหน้า

เมื่ออะแดปเตอร์เรียกใช้ adapterDidReceiveInterstitial ให้รอเพื่อแสดงโฆษณาคั่นระหว่างหน้าจนกว่าจะมีการเรียก presentInterstitialFromRootViewController นักพัฒนาแอปเป็นผู้ตัดสินใจว่าจะแสดงโฆษณาคั่นระหว่างหน้าเมื่อใด ซึ่งอาจใช้เวลาหลายนาทีหลังจากได้รับโฆษณา

การติดตั้งใช้งาน presentInterstitialFromRootViewController: สำหรับเครือข่ายโฆษณาตัวอย่างมีดังนี้

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

อะแดปเตอร์สื่อกลางพร้อมจัดการกับโฆษณาคั่นระหว่างหน้าแล้ว เพื่อเป็นข้อมูลอ้างอิง คุณสามารถดูการติดตั้งใช้งาน SampleAdapter อย่างสมบูรณ์ได้ใน GitHub

คำถามที่พบบ่อย

ฉันควรรวมอะแดปเตอร์ไว้เป็นส่วนหนึ่งของไลบรารี SDK หรือเป็นไลบรารีแยกต่างหาก
เราขอแนะนำให้ใส่อะแดปเตอร์ไว้เป็นส่วนหนึ่งของไลบรารี SDK เพื่อให้นักพัฒนาซอฟต์แวร์ใช้ไลบรารีเพียง 1 รายการเท่านั้นในการรวมเครือข่ายของคุณ
ฉันควรทำอย่างไรหากอะแดปเตอร์รองรับเฉพาะโฆษณาแบนเนอร์

หากอะแดปเตอร์รองรับเฉพาะแบนเนอร์ ให้ส่งต่อเหตุการณ์ข้อผิดพลาดไปยังสื่อกลางสําหรับคําขอโฆษณาคั่นระหว่างหน้า

- (void)getInterstitial {
  NSDictionary *errorInfo = @{ NSLocalizedDescriptionKey : @"Some error" };
  NSError *error = [NSError errorWithDomain:GADErrorDomain
                                       code:GADErrorInvalidRequest
                                   userInfo:errorInfo];
  [self.connector adapter:self didFailInterstitial:error];
  return;
}
ฉันควรทำอย่างไรหากอะแดปเตอร์รองรับเฉพาะโฆษณาคั่นระหว่างหน้าเท่านั้น

หากอะแดปเตอร์รองรับเฉพาะโฆษณาคั่นระหว่างหน้า ให้ส่งต่อเหตุการณ์ข้อผิดพลาดไปยังสื่อกลางสำหรับคำขอแบนเนอร์

- (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;
}