توسعه آداپتور میانجی شبکه تبلیغاتی

این راهنما برای شبکه های تبلیغاتی در نظر گرفته شده است که به دنبال ساخت یک آداپتور میانجی هستند. اگر ناشر هستید، دستورالعمل‌های میانجی‌گری ناشر را ببینید.

آداپتور میانجی لایه ارتباطی بین شبکه تبلیغاتی شما و میانجیگری تبلیغات موبایل Google است. آداپتورها در حالی که رویدادهای تبلیغاتی مرتبط را به AdMob بازارسال می‌کنند، تبلیغات را از شبکه تبلیغاتی شما ارائه می‌کنند. یک آداپتور وظیفه پیاده سازی پروتکل GADMAdNetworkAdapter را بر عهده دارد تا اطمینان حاصل شود که قابلیت های مورد نیاز را فراهم می کند.

پیش نیازها

  • Xcode 15.3 یا بالاتر
  • هدف استقرار 8.0 یا بالاتر
  • سرصفحه‌های اضافی از پوشه Mediation Adapters دانلود Google Mobile Ads iOS SDK

شبکه تبلیغاتی شما برای ایجاد یک آداپتور میانجی باید یک رابطه کاری ثابت با Google داشته باشد.

نمونه شبکه تبلیغاتی

این راهنما نحوه ساخت یک آداپتور برای نمونه شبکه تبلیغاتی را نشان می دهد. Sample Ad Network 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 را ببینید.

رابط

آداپتورهای میانجی با استفاده از یک شی که پروتکل GADMAdNetworkConnector را پیاده‌سازی می‌کند، با Google Mobile Ads SDK تعامل می‌کنند. از اینجا به بعد، این شی را کانکتور می نامیم. رابط اطلاعات لازم را برای درخواست‌های تبلیغاتی نشان می‌دهد و ابزاری برای فراخوانی میانجی‌گری برای رویدادهای تبلیغاتی و تعاملات کاربر فراهم می‌کند. کانکتور در زمان اولیه سازی به آداپتورهای واسطه ارائه می شود. آداپتور خود را برای ذخیره کانکتور در یک متغیر نمونه تنظیم کنید:

- (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 از شما می‌خواهد مقادیر لازم برای نمونه‌سازی آداپتور خود را وارد کنید. تصویر زیر نشان می‌دهد که برای Millennial Media یک Application Placement Identifier (APID) و برای 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 را برمی گرداند.

میانجیگری را اطلاع دهید

از آداپتور خود بخواهید شنونده تبلیغات را برای شبکه شما اجرا کند و تماس‌های رویداد تبلیغاتی مربوطه را از طریق رابط ارسال کند. جدول زیر زمان فراخوانی هر متد delegate را توضیح می دهد:

روش چه زمانی تماس بگیرید
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];
}

همپوشانی درون برنامه ای را در مقابل برنامه خارجی راه اندازی کنید

وقتی روی یک بنر کلیک می‌شود، آگهی ممکن است یک پوشش تمام صفحه یا یک برنامه خارجی (مانند سافاری یا فروشگاه برنامه) را باز کند. تماس های کانکتور برای فراخوانی در این دو مورد متفاوت است.

اگر با کلیک بر بنر یک پوشش تمام صفحه باز می شود، هنگام ارائه روکش با adapterWillPresentFullScreenModal: تماس بگیرید. وقتی پوشش بسته شد، هم adapterWillDismissFullScreenModal: و هم adapterDidDismissFullScreenModal: را فراخوانی کنید.

اگر یک کلیک بر روی بنر (یا کلیک روی تمام صفحه) باعث خروج کاربر از برنامه می شود، adapterWillLeaveApplication: callback را فراخوانی کنید.

اکنون یک آداپتور میانجی کار برای بنرها دارید. برای مرجع، یک پیاده سازی کامل از 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 ، می‌توانید اطلاعات شناسایی ناشر و هدف‌یابی آگهی را از رابط دریافت کنید.

میانجیگری را اطلاع دهید

از آداپتور خود بخواهید نماینده تبلیغات را برای شبکه شما اجرا کند و تماس‌های رویداد تبلیغاتی مربوطه را از طریق رابط ارسال کند. جدول زیر زمان فراخوانی هر متد delegate را توضیح می دهد:

روش چه زمانی تماس بگیرید
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 را صدا زد، منتظر بمانید تا interstitial نمایش داده شود تا presentInterstitialFromRootViewController فراخوانی شود. توسعه‌دهنده برنامه تصمیم می‌گیرد که چه زمانی بینابینی را نشان دهد، که ممکن است چند دقیقه پس از دریافت آن باشد.

در اینجا پیاده سازی presentInterstitialFromRootViewController: برای نمونه شبکه تبلیغاتی:

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

آداپتور میانجی شما آماده رسیدگی به تبلیغات بینابینی است. برای مرجع، یک پیاده سازی کامل از SampleAdapter را می توان در GitHub یافت.

سوالات متداول

آیا باید آداپتور را به عنوان بخشی از کتابخانه SDK خود قرار دهم یا به عنوان یک کتابخانه جداگانه؟
توصیه می‌کنیم آداپتور را به‌عنوان بخشی از کتابخانه SDK خود قرار دهید تا توسعه‌دهندگان مجبور باشند برای ادغام شبکه شما فقط به یک کتابخانه ارجاع دهند.
اگر آداپتور من فقط از تبلیغات بنری پشتیبانی کند، چه کار کنم؟

اگر آداپتور شما فقط از بنرها پشتیبانی می کند، از آن بخواهید یک رویداد خطا را به واسطه درخواست های بینابینی ارسال کند:

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