একাধিক উইন্ডো ও ফোল্ডেবল ডিভাইসে কাজ করে

iPad-এ একাধিক উইন্ডো সাপোর্ট করে অথবা iPhone Duo-এর মতো ফোল্ডেবল ডিভাইসে রান করে এমন অ্যাপ্লিকেশন, ডায়নামিক উইন্ডো সাইজ ও স্ক্রিন কনফিগারেশন জুড়ে UI দেখাতে পারে। iPad-এ, ব্যবহারকারীরা অ্যাপের UI-এর একাধিক সমবর্তী কপির সাথে ইন্টার‍্যাক্ট করতে এবং উইন্ডোর সাইজ পরিবর্তন করতে পারবেন। ফোল্ডেবল ডিভাইসে, ডিভাইসের ফোল্ড স্টেট অ্যাক্টিভ স্ক্রিন নির্ধারণ করে। আনফোল্ড করা থাকলে, ডিভাইসটি আরও বড় ইনার ডিসপ্লে ব্যবহার করে। ফোল্ড করা থাকলে, ডিভাইসটি ছোট আউটার ডিসপ্লে ব্যবহার করে।

এই নির্দেশিকায় মাল্টি-উইন্ডো এনভায়রনমেন্ট ও ফোল্ডেবল ডিসপ্লেতে বিজ্ঞাপন লোড ও রেন্ডার করার বিষয়ে আলোচনা করা হয়েছে।

পূর্বশর্ত

শুরু করার আগে, নিম্নলিখিত ধাপগুলি সম্পূর্ণ করুন:

বিজ্ঞাপনের অনুরোধে উইন্ডো সিন সেট করা

নির্দিষ্ট উইন্ডো বা অ্যাক্টিভ ডিসপ্লেতে ফিট করে এমন বিজ্ঞাপন পেতে, GAMRequest অবজেক্টের scene প্রপার্টিতে অ্যাক্টিভ UIWindowScene অবজেক্ট অ্যাসাইন করুন। Google Mobile Ads SDK সেই দৃশ্যের জন্য উপযুক্ত সাইজের বিজ্ঞাপন দেখায়। SwiftUI-তে, অ্যাক্টিভ ফোরগ্রাউন্ড উইন্ডো সিনের জন্য কানেক্ট করা সিন কোয়েরি করুন।

নিম্নলিখিত উদাহরণটি উইন্ডো সিন কনফিগার করে, সফল হলে একটি ইন্টারস্টিশিয়াল বিজ্ঞাপন লোড করে এবং ব্যর্থ হলে একটি ত্রুটি মেসেজ লগ করে:

Swift

func loadAdManagerInterstitial() async {
  let request = AdManagerRequest()
  request.scene = view.window?.windowScene

  do {
    adManagerInterstitial = try await AdManagerInterstitialAd.load(
      with: "/21775744923/example/interstitial", request: request)
  } catch {
    print("Failed to load interstitial ad with error: \(error.localizedDescription)")
  }
}

SwiftUI

func loadAdManagerInterstitial() async {
  let request = AdManagerRequest()
  request.scene =
    UIApplication.shared.connectedScenes
    .first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene

  do {
    let _ = try await AdManagerInterstitialAd.load(
      with: "/21775744923/example/interstitial", request: request)
  } catch {
    print("Failed to load interstitial ad with error: \(error.localizedDescription)")
  }
}

Objective-C

- (void)loadAdManagerInterstitial {
  GAMRequest *request = [GAMRequest request];
  request.scene = self.view.window.windowScene;

  [GAMInterstitialAd loadWithAdManagerAdUnitID:@"/21775744923/example/interstitial"
                                       request:request
                             completionHandler:^(GAMInterstitialAd *ad, NSError *error) {
                               if (error) {
                                 NSLog(@"Failed to load interstitial ad with error: %@",
                                       [error localizedDescription]);
                                 return;
                               }
                               self.adManagerInterstitial = ad;
                             }];
}

টেস্ট মোডে, আপনার মাল্টি-সিন অ্যাপ কোনও সিন পাস না করে বিজ্ঞাপনের অনুরোধ করলে, বিজ্ঞাপনের অনুরোধ নিম্নলিখিত সমস্যার কারণে ব্যর্থ হয়:

<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.

বিজ্ঞাপনের অনুরোধ তৈরি করা

বিজ্ঞাপনের অনুরোধ পাঠানোর সময়, মাল্টি-সিন অ্যাপ্লিকেশনের জন্য একটি সঠিক উইন্ডো সিন প্রয়োজন। যেখানে উইন্ডো সিন পপুলেট করা হয়, সেখানে viewDidAppear পদ্ধতি ব্যবহার করে বিজ্ঞাপনের অনুরোধ তৈরি করুন। আমরা এই প্রসেসটি সাজেস্ট করি কারণ viewDidLoad পদ্ধতিতে উইন্ডোতে এখনও কোনও ভিউ যোগ করা হয়নি।

আপনি অ্যাপের লাইফসাইকেলে একাধিকবার viewDidAppear মেথড কল করতে পারলেও, আপনাকে বিজ্ঞাপনের অনুরোধটি একটি বুলিয়ান ফ্ল্যাগে র‍্যাপ করতে হবে যাতে এটি শুধুমাত্র একবার রান করে।

নিম্নলিখিত উদাহরণটি viewDidAppear পদ্ধতিতে বিজ্ঞাপনের অনুরোধ শুরু করে:

Swift

override func viewDidAppear(_ animated: Bool) {
  super.viewDidAppear(animated)
  if !requestInitialized {
    Task {
      await loadInterstitial()
    }
    requestInitialized = true
  }
}

Objective-C

- (void)viewDidAppear:(BOOL)animated {
  [super viewDidAppear:animated];
  if (!_requestInitialized) {
    [self loadInterstitial];
    _requestInitialized = YES;
  }
}

উইন্ডো রিসাইজ করা ম্যানেজ করুন

ব্যবহারকারী iPad-এ দৃশ্যের সাইজ পরিবর্তন করলে অথবা iPhone Duo-এর মতো ফোল্ডেবল ডিভাইস ফোল্ড বা আনফোল্ড করলে উইন্ডোর সাইজ পরিবর্তন হয়। উইন্ডোর সাইজ পরিবর্তন হলে, লোড করা বিজ্ঞাপন আপডেট করা ডাইমেনশনে ফিট করছে কিনা তা যাচাই করুন এবং প্রয়োজন হলে বিজ্ঞাপন আবার লোড করুন।

লোড করা বিজ্ঞাপন আপডেট করা ডাইমেনশনে ফিট করছে কিনা তা যাচাই করতে, নিম্নলিখিত পদ্ধতিগুলির মধ্যে যেকোনও একটি ব্যবহার করুন:

ফুল-স্ক্রিন বিজ্ঞাপন

আপডেট করা উইন্ডো সাইজ বা ফোল্ড স্টেটের জন্য লোড করা ফুল-স্ক্রিন বিজ্ঞাপন বৈধ কিনা তা যাচাই করতে, canPresentFromRootViewController:error: পদ্ধতি ব্যবহার করুন। চেক করা না গেলে, আপডেট করা সিনের জন্য সাইজ করা বিজ্ঞাপন লোড করুন।

নিম্নলিখিত উদাহরণটি চেক করে দেখে যে সাইজ ট্রানজিশনের পরে ইন্টারস্টিশিয়াল বিজ্ঞাপন দেখানো যাবে কিনা এবং প্রয়োজন হলে বিজ্ঞাপনটি আবার লোড করে:

Swift

override func viewWillTransition(
  to size: CGSize,
  with coordinator: UIViewControllerTransitionCoordinator
) {
  super.viewWillTransition(to: size, with: coordinator)

  coordinator.animate(alongsideTransition: nil) { [weak self] _ in
    guard let self else { return }
    do {
      try self.interstitial?.canPresent(from: self)
    } catch {
      Task {
        await self.loadInterstitial()
      }
    }
  }
}

Objective-C

- (void)viewWillTransitionToSize:(CGSize)size
       withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
  [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];

  [coordinator
      animateAlongsideTransition:nil
                      completion:^(id<UIViewControllerTransitionCoordinatorContext> context) {
                        if (![self.interstitial canPresentFromRootViewController:self error:nil]) {
                          [self loadInterstitial];
                        }
                      }];
}

ডিভাইস ঘোরানোর মতো উইন্ডো রিসাইজ করা ও ফোল্ড ট্রানজিশন ম্যানেজ করা। safeAreaLayoutGuide প্রপার্টিতে ব্যানার ভিউ সীমিত করুন। এই প্রসেস ডিভাইসের হিঞ্জ, কাটআউট ও সিস্টেম বার থেকে বিজ্ঞাপনকে দূরে রাখে। এই প্রসেসটি আপডেট করা নিরাপদ এলাকার প্রস্থ ব্যবহার করে অ্যাঙ্কর করা অ্যাডাপ্টিভ ব্যানারের সাইজও আবার গণনা করে।

নিম্নলিখিত উদাহরণটি সাইজ ট্রানজিশনের সময় আপডেট করা উইন্ডোর প্রস্থ সহ একটি অ্যাঙ্কর করা অ্যাডাপ্টিভ ব্যানার লোড করে:

Swift

override func viewWillTransition(
  to size: CGSize,
  with coordinator: UIViewControllerTransitionCoordinator
) {
  super.viewWillTransition(to: size, with: coordinator)

  coordinator.animate(alongsideTransition: nil) { [weak self] _ in
    self?.loadBannerAd()
  }
}

@MainActor
func loadBannerAd() {
  let frame = view.frame.inset(by: view.safeAreaInsets)
  let viewWidth = frame.size.width

  bannerView.adSize = largeAnchoredAdaptiveBanner(width: viewWidth)

  let request = AdManagerRequest()
  request.scene = view.window?.windowScene
  bannerView.load(request)
}

SwiftUI

struct MultiSceneAdManagerBannerView: View {
  var body: some View {
    GeometryReader { geometry in
      let adSize = largeAnchoredAdaptiveBanner(width: geometry.size.width)
      MultiSceneAdManagerBannerViewContainer(adSize: adSize)
        .frame(width: adSize.size.width, height: adSize.size.height)
    }
  }
}

private struct MultiSceneAdManagerBannerViewContainer: UIViewRepresentable {
  let adSize: AdSize

  func makeUIView(context: Context) -> AdManagerBannerView {
    let bannerView = AdManagerBannerView(adSize: adSize)
    let request = AdManagerRequest()
    request.scene =
      UIApplication.shared.connectedScenes
      .first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene
    bannerView.load(request)
    return bannerView
  }

  func updateUIView(_ uiView: AdManagerBannerView, context: Context) {
    if uiView.adSize.size != adSize.size {
      uiView.adSize = adSize
      let request = AdManagerRequest()
      request.scene = uiView.window?.windowScene
      uiView.load(request)
    }
  }
}

Objective-C

- (void)viewWillTransitionToSize:(CGSize)size
       withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
  [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];

  [coordinator
      animateAlongsideTransition:nil
                      completion:^(id<UIViewControllerTransitionCoordinatorContext> context) {
                        [self loadBannerAd];
                      }];
}

- (void)loadBannerAd {
  dispatch_async(dispatch_get_main_queue(), ^{
    CGRect frame = UIEdgeInsetsInsetRect(self.view.frame, self.view.safeAreaInsets);
    CGFloat viewWidth = frame.size.width;

    self.bannerView.adSize = GADLargeAnchoredAdaptiveBannerAdSizeWithWidth(viewWidth);

    GAMRequest *request = [GAMRequest request];
    request.scene = self.view.window.windowScene;
    [self.bannerView loadRequest:request];
  });
}

নেটিভ বিজ্ঞাপন

নেটিভ বিজ্ঞাপনের লেআউট আপনি নিয়ন্ত্রণ করেন। ব্যানার বা ফুল-স্ক্রিন বিজ্ঞাপনের মতো, উইন্ডো ছোট-বড় করা হলে আপনাকে নেটিভ বিজ্ঞাপন রিলোড করতে হবে না। সাইজ পরিবর্তনের সাথে মানিয়ে নিতে নেটিভ বিজ্ঞাপন ভিউয়ের জন্য স্ট্যান্ডার্ড অটো লেআউট কনস্ট্রেন্ট বা SwiftUI লেআউট ব্যবহার করুন।