Iklan di Layar Pembuka Aplikasi

Panduan ini ditujukan bagi penayang yang mengintegrasikan iklan di layar pembuka aplikasi.

Iklan di layar pembuka aplikasi adalah format iklan khusus yang ditujukan bagi penayang yang ingin memonetisasi layar pemuatan aplikasi mereka. Iklan di layar pembuka aplikasi dapat ditutup oleh pengguna Anda kapan saja. Iklan di layar pembuka aplikasi dapat ditampilkan saat pengguna memindahkan aplikasi Anda ke latar depan.

Iklan di layar pembuka aplikasi secara otomatis menampilkan area branding kecil sehingga pengguna tahu bahwa mereka ada di sana aplikasi Anda. Berikut adalah contoh tampilan iklan di layar pembuka aplikasi:

Berikut adalah langkah-langkah yang diperlukan untuk menerapkan iklan di layar pembuka aplikasi secara umum:

  1. Buat kelas pengelola yang memuat iklan sebelum Anda perlu menampilkannya.
  2. Menampilkan add selama peristiwa latar depan aplikasi.
  3. Menangani callback presentasi.

Prasyarat

Selalu uji dengan iklan percobaan

Saat membuat dan menguji aplikasi, pastikan Anda menggunakan iklan percobaan, bukan iklan produksi secara langsung. Jika Anda tidak melakukannya, akun Anda dapat ditangguhkan.

Cara termudah untuk memuat iklan percobaan adalah dengan menggunakan ID unit iklan percobaan khusus untuk aplikasi iklan terbuka:

/21775744923/example/app-open

URL ini telah dikonfigurasi secara khusus agar menampilkan iklan percobaan untuk setiap permintaan, dan Anda bebas untuk menggunakannya di aplikasi Anda sendiri saat melakukan {i>coding<i}, pengujian, dan {i>debugging<i}. Buat saja pastikan Anda menggantinya dengan ID unit iklan Anda sendiri sebelum memublikasikan aplikasi.

Untuk informasi selengkapnya tentang cara kerja iklan percobaan Mobile Ads SDK, lihat Menguji Google Ads.

Menerapkan class pengelola

Iklan Anda akan tampil cepat, jadi sebaiknya muat iklan Anda sebelum Anda harus menampilkannya. Dengan begitu, iklan Anda akan siap ditayangkan segera setelah pengguna masuk aplikasi Anda. Terapkan kelas pengelola untuk membuat permintaan iklan sebelum Anda membutuhkannya untuk menampilkan iklan.

Buat class singleton baru bernama AppOpenAdManager dan isi sebagai berikut ini:

Swift

class AppOpenAdManager: NSObject {
  var appOpenAd: GADAppOpenAd?
  var isLoadingAd = false.
  var isShowingAd = false

  static let shared = AppOpenAdManager()

  private func loadAd() async {
    // TODO: Implement loading an ad.
  }

  func showAdIfAvailable() {
    // TODO: Implement showing an ad.
  }

  private func isAdAvailable() -> Bool {
    // Check if ad exists and can be shown.
    return appOpenAd != nil
  }
}

Objective-C

@interface AppOpenAdManager ()
@property(nonatomic, strong) GADAppOpenAd *appOpenAd;
@property(nonatomic, assign) BOOL isLoadingAd;
@property(nonatomic, assign) BOOL isShowingAd;

@end

@implementation AppOpenAdManager

+ (nonnull AppOpenAdManager *)sharedInstance {
  static AppOpenAdManager *instance = nil;
  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{
    instance = [[AppOpenAdManager alloc] init];
  });
  return instance;
}

- (void)loadAd {
  // TODO: Implement loading an ad.
}

// Add this method to the .h file.
- (void)showAdIfAvailable {
  // TODO: Implement showing an ad.
}

- (BOOL)isAdAvailable {
  // Check if ad exists and can be shown.
  return self.appOpenAd != nil;
}

@end

Memuat iklan

Langkah berikutnya adalah mengisi metode loadAd().

Swift

private func loadAd() async {
  // Do not load ad if there is an unused ad or one is already loading.
  if isLoadingAd || isAdAvailable() {
    return
  }
  isLoadingAd = true

  do {
    appOpenAd = try await GADAppOpenAd.load(
      withAdUnitID: "/21775744923/example/app-open", request: GAMRequest())
  } catch {
    print("App open ad failed to load with error: \(error.localizedDescription)")
  }
  isLoadingAd = false
}

Objective-C

- (void)loadAd {
  // Do not load ad if there is an unused ad or one is already loading.
  if (self.isLoadingAd || [self isAdAvailable]) {
    return;
  }
  self.isLoadingAd = YES;

  [GADAppOpenAd loadWithAdUnitID:@"/21775744923/example/app-open"
                       request:[GAMRequest request]
             completionHandler:^(GADAppOpenAd *_Nullable appOpenAd, NSError *_Nullable error) {
               self.isLoadingAd = NO;
               if (error) {
                 NSLog(@"Failed to load app open ad: %@", error);
                 return;
               }
               self.appOpenAd = appOpenAd;
             }];
}

Menampilkan iklan

Langkah berikutnya adalah mengisi metode showAdIfAvailable(). Jika tidak ada iklan yang tersedia, metode ini akan mencoba memuat iklan.

Swift

func showAdIfAvailable() {
  // If the app open ad is already showing, do not show the ad again.
  guard !isShowingAd else { return }

  // If the app open ad is not available yet but is supposed to show, load
  // a new ad.
  if !isAdAvailable() {
    Task {
      await loadAd()
    }
    return
  }

  if let ad = appOpenAd {
    isShowingAd = true
    ad.present(fromRootViewController: nil)
  }
}

Objective-C

- (void)showAdIfAvailable {
  // If the app open ad is already showing, do not show the ad again.
  if (self.isShowingAd) {
    return;
  }

  // If the app open ad is not available yet but is supposed to show, load a
  // new ad.
  if (![self isAdAvailable]) {
    [self loadAd];
    return;
  }

  self.isShowingAd = YES;
  [self.appOpenAd presentFromRootViewController:nil];
}

Tampilkan iklan selama peristiwa latar depan aplikasi

Saat aplikasi menjadi aktif, panggil showAdIfAvailable() untuk menampilkan iklan jika tersedia, atau memuat yang baru.

Swift

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
  // ...

  func applicationDidBecomeActive(_ application: UIApplication) {
    // Show the app open ad when the app is foregrounded.
    AppOpenAdManager.shared.showAdIfAvailable()
  }
}

Objective-C

@implementation AppDelegate
// ...

- (void) applicationDidBecomeActive:(UIApplication *)application {
  // Show the app open ad when the app is foregrounded.
  [AppOpenAdManager.sharedInstance showAdIfAvailable];
}

@end

Menangani callback presentasi

Saat aplikasi Anda menampilkan iklan di layar pembuka aplikasi, Anda harus mengandalkan GADFullScreenContentDelegate untuk menangani peristiwa presentasi tertentu. Di beberapa Anda sebaiknya meminta iklan di layar pembuka aplikasi berikutnya setelah iklan presentasi selesai.

Di class AppOpenAdManager, tambahkan kode berikut:

Swift

class AppOpenAdManager: NSObject, GADFullScreenContentDelegate {
  // ...

  private func loadAd() async {
    // Do not load ad if there is an unused ad or one is already loading.
    if isLoadingAd || isAdAvailable() {
      return
    }
    isLoadingAd = true

    do {
      appOpenAd = try await GADAppOpenAd.load(
        withAdUnitID: "/21775744923/example/app-open", request: GAMRequest())
      appOpenAd?.fullScreenContentDelegate = self
    } catch {
      print("App open ad failed to load with error: \(error.localizedDescription)")
    }
    isLoadingAd = false
  }

  // ...

  // MARK: - GADFullScreenContentDelegate methods

  func adWillPresentFullScreenContent(_ ad: GADFullScreenPresentingAd) {
    print("App open ad will be presented.")
  }

  func adDidDismissFullScreenContent(_ ad: GADFullScreenPresentingAd) {
    appOpenAd = nil
    isShowingAd = false
    // Reload an ad.
    Task {
      await loadAd()
    }
  }

  func ad(
    _ ad: GADFullScreenPresentingAd,
    didFailToPresentFullScreenContentWithError error: Error
  ) {
    appOpenAd = nil
    isShowingAd = false
    // Reload an ad.
    Task {
      await loadAd()
    }
  }
}

Objective-C

@interface AppOpenAdManager () <GADFullScreenContentDelegate>
@property(nonatomic, strong) GADAppOpenAd *appOpenAd
@property(nonatomic, assign) BOOL isLoadingAd;
@property(nonatomic, assign) BOOL isShowingAd;

@end

@implementation AppOpenAdManager

// ...

- (void)loadAd {
  // Do not load ad if there is an unused ad or one is already loading.
  if (self.isLoadingAd || [self isAdAvailable]) {
    return;
  }
  self.isLoadingAd = YES;

  [GADAppOpenAd loadWithAdUnitID:@"/21775744923/example/app-open"
                       request:[GAMRequest request]
             completionHandler:^(GADAppOpenAd *_Nullable appOpenAd, NSError *_Nullable error) {
              self.isLoadingAd = NO;
               if (error) {
                 NSLog(@"Failed to load app open ad: %@", error);
                 return;
               }
               self.appOpenAd = appOpenAd;
               self.appOpenAd.fullScreenContentDelegate = self;
             }];
}

- (BOOL)isAdAvailable {
  // Check if ad exists and can be shown.
  return self.appOpenAd != nil;
}

// ...

#pragma mark - GADFullScreenContentDelegate methods

- (void)adWillPresentFullScreenContent:(nonnull id<GADFullScreenPresentingAd>)ad {
  NSLog(@"App open ad is will be presented.");
}

- (void)adDidDismissFullScreenContent:(nonnull id<GADFullScreenPresentingAd>)ad {
  self.appOpenAd = nil;
  self.isShowingAd = NO;
  // Reload an ad.
  [self loadAd];
}

- (void)ad:(nonnull id<GADFullScreenPresentingAd>)ad
    didFailToPresentFullScreenContentWithError:(nonnull NSError *)error {
  self.appOpenAd = nil;
  self.isShowingAd = NO;
  // Reload an ad.
  [self loadAd];
}

@end

Pertimbangkan waktu berakhir iklan

Untuk memastikan Anda tidak menampilkan iklan yang masa berlakunya sudah habis, Anda dapat menambahkan metode ke delegasi aplikasi yang memeriksa waktu berlalu sejak referensi iklan dimuat.

Di AppOpenAdManager, tambahkan properti Date bernama loadTime dan setel saat iklan dimuat. Anda kemudian dapat menambahkan metode yang menampilkan true jika kurang dari jumlah jam tertentu sejak iklan dimuat. Pastikan Anda memeriksa validitas referensi iklan sebelum mencoba menampilkannya.

Swift

class AppOpenAdManager: NSObject, GADFullScreenContentDelegate {
  var appOpenAd: GADAppOpenAd?
  var isLoadingAd = false.
  var isShowingAd = false
  var loadTime: Date?
  let fourHoursInSeconds = TimeInterval(3600 * 4)

  // ...

  private func loadAd() async {
    // Do not load ad if there is an unused ad or one is already loading.
    if isLoadingAd || isAdAvailable() {
      return
    }
    isLoadingAd = true

    do {
      appOpenAd = try await GADAppOpenAd.load(
        withAdUnitID: "/21775744923/example/app-open", request: GAMRequest())
      appOpenAd?.fullScreenContentDelegate = self
      loadTime = Date()
    } catch {
      print("App open ad failed to load with error: \(error.localizedDescription)")
    }
    isLoadingAd = false
  }

  private func wasLoadTimeLessThanFourHoursAgo() -> Bool {
    guard let loadTime = loadTime else { return false }
    // Check if ad was loaded more than four hours ago.
    return Date().timeIntervalSince(loadTime) < fourHoursInSeconds
  }

  private func isAdAvailable() -> Bool {
    // Check if ad exists and can be shown.
    return appOpenAd != nil && wasLoadTimeLessThanFourHoursAgo()
  }
}

Objective-C

static NSTimeInterval const fourHoursInSeconds = 3600 * 4;

@interface AppOpenAdManager () <GADFullScreenContentDelegate>
@property(nonatomic, strong) GADAppOpenAd *appOpenAd
@property(nonatomic, assign) BOOL isLoadingAd;
@property(nonatomic, assign) BOOL isShowingAd;
@property(weak, nonatomic) NSDate *loadTime;

@end

@implementation AppOpenAdManager

// ...

- (void)loadAd {
  // Do not load ad if there is an unused ad or one is already loading.
  if (self.isLoadingAd || [self isAdAvailable]) {
    return;
  }
  self.isLoadingAd = YES;

  [GADAppOpenAd loadWithAdUnitID:@"/21775744923/example/app-open"
                       request:[GAMRequest request]
             completionHandler:^(GADAppOpenAd *_Nullable appOpenAd, NSError *_Nullable error) {
              self.isLoadingAd = NO;
               if (error) {
                 NSLog(@"Failed to load app open ad: %@", error);
                 return;
               }
               self.appOpenAd = appOpenAd;
               self.appOpenAd.fullScreenContentDelegate = self;
               self.loadTime = [NSDate date];
             }];
}

- (BOOL)wasLoadTimeLessThanFourHoursAgo {
  // Check if ad was loaded more than four hours ago.
  return [[NSDate Date] timeIntervalSinceDate:self.loadTime] < fourHoursInSeconds;
}

- (BOOL)isAdAvailable {
  // Check if ad exists and can be shown.
  return self.appOpenAd != nil && [self wasLoadTimeLessThanFourHoursAgo];
}

@end

Cold start dan layar pemuatan

Dokumentasi ini mengasumsikan bahwa Anda hanya menampilkan iklan di layar pembuka aplikasi saat pengguna latar depan aplikasi saat ditangguhkan di memori. "Cold start" (Awal yang dingin) terjadi saat aplikasi Anda diluncurkan, tetapi sebelumnya tidak ditangguhkan di memori.

Contoh cold start adalah saat pengguna membuka aplikasi untuk pertama kalinya. Dengan cold start, Anda tidak akan memiliki iklan di layar pembuka aplikasi yang dimuat sebelumnya yang siap langsung ditampilkan. Jeda dari saat Anda meminta iklan hingga menerima iklan dapat menciptakan situasi di mana pengguna dapat menggunakan aplikasi Anda sebentar sebelum dikejutkan oleh iklan di luar konteks. Hal ini harus dihindari karena merupakan pengalaman pengguna yang buruk.

Cara yang direkomendasikan untuk menggunakan iklan di layar pembuka aplikasi saat cold start adalah menggunakan layar pemuatan untuk memuat game atau aset aplikasi, dan hanya menampilkan iklan dari halaman layar. Jika aplikasi Anda telah selesai dimuat dan telah mengarahkan pengguna ke layar utama konten aplikasi, jangan tampilkan iklan.

Praktik terbaik

Google membuat iklan di layar pembuka aplikasi untuk membantu Anda memonetisasi layar pemuatan aplikasi, tetapi penting untuk mengingat praktik terbaik agar pengguna Anda senang menggunakan aplikasi Anda. Pastikan untuk:

  • Tunggu hingga iklan di layar pembuka aplikasi pertama Anda ditampilkan hingga pengguna selesai menggunakan aplikasi beberapa kali.
  • Tampilkan iklan di layar pembuka aplikasi pada saat pengguna seharusnya menunggu untuk aplikasi Anda.
  • Jika Anda memiliki layar pemuatan di bawah iklan di layar pembuka aplikasi, dan layar pemuatan menyelesaikan pemuatan sebelum iklan ditutup, Anda dapat menutup layar pemuatan dalam metode adDidDismissFullScreenContent.

Contoh lengkap di GitHub

Swift Objective-C

Langkah berikutnya

Pelajari lebih lanjut privasi pengguna.