با شروع iOS 13، برنامهها میتوانند از چندین پنجره در آیپد پشتیبانی کنند، به این معنی که کاربران میتوانند با چندین نسخه همزمان از رابط کاربری یک برنامه تعامل داشته باشند. هر پنجره را میتوان در اندازههای مختلف ایجاد کرد و در هر زمان تغییر اندازه داد، که این امر پیامدهایی برای نحوه بارگیری و ارائه تبلیغات دارد.
این راهنما قصد دارد بهترین شیوهها را برای نمایش صحیح تبلیغات در سناریوی چند پنجرهای آیپد به شما نشان دهد.
- Google Mobile Ads SDK ۷.۵۳.۰ یا بالاتر
- پشتیبانی از صحنه را در پروژه خود فعال کنید
- حداقل یک قالب تبلیغاتی را پیادهسازی کنید
برای دریافت تبلیغی که متناسب با یک پنجره خاص باشد، windowScene مربوط به نما را به درخواست تبلیغ ارسال میکنید. Google Mobile Ads SDK تبلیغی با اندازه معتبر برای آن صحنه را برمیگرداند.
func loadInterstitial() { let request = Request() request.scene = view.window?.windowScene InterstitialAd.load(with: "[AD_UNIT_ID]", request: request) { ad, error in } }
- (void)loadInterstitial { GADRequest *request = [GADRequest request]; request.scene = self.view.window.windowScene; [GADInterstitialAd loadWithAdUnitID:@"[AD_UNIT_ID]" request:request completionHandler:^(GADInterstitialAd *ad, NSError *error) {}]; }
در حالت آزمایشی، اگر برنامهی چندصحنهی شما بدون عبور از صحنه، درخواست تبلیغ کند، درخواستهای تبلیغ با خطای زیر مواجه میشوند:
<Google> Invalid Request. The GADRequest scene property should be set for
applications that support multi-scene. Treating the unset property as an error
while in test mode.
در حالت تولید، درخواست تبلیغ اجرا میشود، اما اگر قرار باشد تبلیغ در پنجرهای غیر از صفحه نمایش داده شود، نمایش تبلیغ با شکست مواجه میشود. پیام خطا در این مورد به شرح زیر است:
<Google> Ad cannot be presented. The full screen ad content size exceeds the current window size.
مورد چند پنجرهای، الزام داشتن یک صحنه پنجره برای ارسال درخواستهای تبلیغ را مطرح میکند. از آنجایی که هنوز یک نما به پنجرهای در viewDidLoad: اضافه نشده است، باید درخواستهای تبلیغ را در viewDidAppear: ایجاد کنید که در آن صحنه پنجره توسط آن نقطه تنظیم میشود.
توجه داشته باشید که viewDidAppear: میتواند بیش از یک بار در طول چرخه حیات یک برنامه فراخوانی شود. توصیه میکنیم کد مقداردهی اولیه درخواست تبلیغ را در یک پرچم قرار دهید که نشان میدهد آیا قبلاً انجام شده است یا خیر.
override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) if !requestInitialized { loadInterstitial() requestInitialized = true } }
- (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; if (!_requestInitialized) { [self loadInterstitial]; _requestInitialized = YES; } }
کاربران میتوانند صحنهها را در هر زمانی که بخواهند، بکشند و اندازه پنجره را پس از درخواست تبلیغ تغییر دهند. درخواست تبلیغ جدید هنگام تغییر اندازه به شما بستگی دارد. کد نمونه زیر از viewWillTransitionToSize:withTransitionCoordinator: برای اطلاعرسانی هنگام چرخش یا تغییر اندازه پنجره کنترلر نمای ریشه استفاده میکند، اما میتوانید برای تغییرات خاص صحنه پنجره، به windowScene:didUpdateCoordinateSpace:interfaceOrientation:traitCollection: نیز گوش دهید.
Google Mobile Ads SDK متد canPresentFromViewController:error: برای تعیین معتبر بودن یا نبودن یک تبلیغ بینابینی یا تبلیغ پاداشی ارائه میدهد و به شما این امکان را میدهد که بررسی کنید آیا هر تبلیغ تمامصفحهای نیاز به رفرش شدن در هنگام تغییر اندازه پنجره دارد یا خیر.
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { super.viewWillTransition(to: size, with: coordinator) coordinator.animate(alongsideTransition: nil) { [self] context in do { try interstitial?.canPresent(from: self) } catch { loadInterstitial() } } }
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id)coordinator { [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]; [coordinator animateAlongsideTransition:nil completion:^(id _Nonnull context) { if (![self.interstitial canPresentFromRootViewController:self error:nil]) { [self loadInterstitial]; } }]; }
شما میتوانید تغییر اندازه پنجره را به همان روشی که برای چرخش پنجره انجام میدهید، مدیریت کنید. برنامه شما مسئول اطمینان از تناسب بنر تبلیغاتی با اندازه جدید پنجره است.
مثال زیر یک بنر تطبیقی جدید با عرض پنجره جدید ایجاد میکند:
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { super.viewWillTransition(to: size, with: coordinator) coordinator.animate(alongsideTransition: nil) { [self] context in loadBanner() } } func loadBanner() { let bannerWidth = view.frame.size.width bannerView.adSize = currentOrientationAnchoredAdaptiveBanner(width: bannerWidth) let request = Request() request.scene = view.window?.windowScene bannerView.load(request) }
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id)coordinator { [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]; [coordinator animateAlongsideTransition:nil completion:^(id _Nonnull context) { [self loadBannerAd]; }]; } - (void)loadBannerAd { CGFloat bannerWidth = self.view.frame.size.width; self.bannerView.adSize = GADCurrentOrientationAnchoredAdaptiveBannerAdSizeWithWidth(bannerWidth); GADRequest *request = [GADRequest request]; request.scene = self.view.window.windowScene; [self.bannerView loadRequest:request]; }
شما کنترل رندر کردن تبلیغات بومی را در دست دارید و مسئول هستید که مطمئن شوید تبلیغات بومی در یک نمای تغییر اندازه داده شده، مشابه بقیه محتوای برنامه شما، رندر میشوند.
در حال حاضر تبلیغات چند پنجرهای و تقسیم صفحه فقط در حالت عمودی پشتیبانی میشوند. هنگام درخواست تبلیغ در حالت افقی، پیام گزارش زیر را دریافت خواهید کرد.
<Google> Ad cannot be presented. The full screen ad content size exceeds the
current window size.