Iklan reward

Pilih platform: Android iOS Unity Flutter

Iklan reward adalah iklan yang menyediakan banyak opsi interaksi untuk pengguna dengan imbalan reward dalam aplikasi. Panduan ini menunjukkan cara mengintegrasikan iklan reward dari AdMob ke dalam aplikasi iOS. Baca beberapa kisah sukses pelanggan: studi kasus 1, studi kasus 2.

Prasyarat

Selalu lakukan pengujian dengan iklan percobaan

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

Cara termudah untuk memuat iklan percobaan adalah dengan menggunakan ID unit iklan percobaan khusus kami untuk iklan reward iOS:

ca-app-pub-3940256099942544/1712485313

ID ini telah dikonfigurasi secara khusus untuk menampilkan iklan pengujian untuk setiap permintaan, dan Anda bebas menggunakannya di aplikasi Anda sendiri saat melakukan coding, pengujian, dan pen-debugan. Pastikan Anda menggantinya dengan ID unit iklan Anda sendiri sebelum memublikasikan aplikasi.

Untuk mengetahui informasi selengkapnya tentang cara kerja iklan percobaan Mobile Ads SDK, lihat Iklan Percobaan.

Penerapan

Langkah-langkah utama untuk mengintegrasikan iklan reward adalah sebagai berikut:

  • Memuat iklan
  • [Opsional] Memvalidasi callback SSV
  • Mendaftar untuk callback
  • Menampilkan iklan dan menangani peristiwa reward

Memuat iklan

Pemuatan iklan dilakukan menggunakan metode load(adUnitID:request) pada class GADRewardedAd.

Swift

func loadRewardedAd() async {
  do {
    rewardedAd = try await RewardedAd.load(
      // Replace this ad unit ID with your own ad unit ID.
      with: "ca-app-pub-3940256099942544/1712485313", request: Request())
    rewardedAd?.fullScreenContentDelegate = self
  } catch {
    print("Rewarded ad failed to load with error: \(error.localizedDescription)")
  }
}

SwiftUI

import GoogleMobileAds

class RewardedViewModel: NSObject, ObservableObject, FullScreenContentDelegate {
  @Published var coins = 0
  private var rewardedAd: RewardedAd?

  func loadAd() async {
    do {
      rewardedAd = try await RewardedAd.load(
        with: "ca-app-pub-3940256099942544/1712485313", request: Request())
      rewardedAd?.fullScreenContentDelegate = self
    } catch {
      print("Failed to load rewarded ad with error: \(error.localizedDescription)")
    }
  }

Objective-C

// Replace this ad unit ID with your own ad unit ID.
[GADRewardedAd loadWithAdUnitID:@"ca-app-pub-3940256099942544/1712485313"
              request:[GADRequest request]
    completionHandler:^(GADRewardedAd *ad, NSError *error) {
      if (error) {
        NSLog(@"Rewarded ad failed to load with error: %@", [error localizedDescription]);
        return;
      }
      self.rewardedAd = ad;
      self.rewardedAd.fullScreenContentDelegate = self;
    }];

[Opsional] Memvalidasi callback verifikasi sisi server (SSV)

Aplikasi yang memerlukan data tambahan dalam callback verifikasi sisi server harus menggunakan fitur data kustom iklan reward. Nilai string apa pun yang ditetapkan pada objek iklan bersedia ditonton akan diteruskan ke parameter kueri custom_data dari callback SSV. Jika tidak ada nilai data kustom yang ditetapkan, nilai parameter kueri custom_data tidak akan ada dalam callback SSV.

Contoh kode berikut menunjukkan cara menyetel data kustom pada objek iklan reward sebelum meminta iklan:

Swift

do {
  rewardedAd = try await RewardedAd.load(
    // Replace this ad unit ID with your own ad unit ID.
    with: "ca-app-pub-3940256099942544/1712485313", request: Request())
  let options = ServerSideVerificationOptions()
  options.customRewardText = "SAMPLE_CUSTOM_DATA_STRING"
  rewardedAd?.serverSideVerificationOptions = options
} catch {
  print("Rewarded ad failed to load with error: \(error.localizedDescription)")
}

Objective-C

// Replace this ad unit ID with your own ad unit ID.
[GADRewardedAd loadWithAdUnitID:@"ca-app-pub-3940256099942544/1712485313"
                        request:[GADRequest request]
              completionHandler:^(GADRewardedAd *ad, NSError *error) {
                if (error) {
                  NSLog(@"Rewarded ad failed to load with error: %@", error.localizedDescription);
                  return;
                }
                self.rewardedAd = ad;
                GADServerSideVerificationOptions *options =
                    [[GADServerSideVerificationOptions alloc] init];
                options.customRewardString = @"SAMPLE_CUSTOM_DATA_STRING";
                ad.serverSideVerificationOptions = options;
              }];

Mendaftar untuk callback

Untuk menerima notifikasi untuk peristiwa presentasi, Anda harus menetapkan properti GADFullScreenContentDelegate to thefullScreenContentDelegate` dari iklan yang ditampilkan:

Swift

rewardedAd?.fullScreenContentDelegate = self

SwiftUI

rewardedAd?.fullScreenContentDelegate = self

Objective-C

self.rewardedAd.fullScreenContentDelegate = self;

Protokol GADFullScreenContentDelegate menangani callback saat iklan berhasil atau gagal ditampilkan, dan saat iklan ditutup. Kode berikut menunjukkan cara menerapkan protokol:

Swift

func adDidRecordImpression(_ ad: FullScreenPresentingAd) {
  print("\(#function) called.")
}

func adDidRecordClick(_ ad: FullScreenPresentingAd) {
  print("\(#function) called.")
}

func adWillPresentFullScreenContent(_ ad: FullScreenPresentingAd) {
  print("\(#function) called.")
}

func adWillDismissFullScreenContent(_ ad: FullScreenPresentingAd) {
  print("\(#function) called.")
}

func adDidDismissFullScreenContent(_ ad: FullScreenPresentingAd) {
  print("\(#function) called.")
  // Clear the rewarded ad.
  rewardedAd = nil
}

func ad(
  _ ad: FullScreenPresentingAd,
  didFailToPresentFullScreenContentWithError error: Error
) {
  print("\(#function) called with error: \(error.localizedDescription).")
}

SwiftUI

func adDidRecordImpression(_ ad: FullScreenPresentingAd) {
  print("\(#function) called")
}

func adDidRecordClick(_ ad: FullScreenPresentingAd) {
  print("\(#function) called")
}

func ad(
  _ ad: FullScreenPresentingAd,
  didFailToPresentFullScreenContentWithError error: Error
) {
  print("\(#function) called")
}

func adWillPresentFullScreenContent(_ ad: FullScreenPresentingAd) {
  print("\(#function) called")
}

func adWillDismissFullScreenContent(_ ad: FullScreenPresentingAd) {
  print("\(#function) called")
}

func adDidDismissFullScreenContent(_ ad: FullScreenPresentingAd) {
  print("\(#function) called")
  // Clear the rewarded ad.
  rewardedAd = nil
}

Objective-C

- (void)adDidRecordImpression:(id<GADFullScreenPresentingAd>)ad {
  NSLog(@"%s called", __PRETTY_FUNCTION__);
}

- (void)adDidRecordClick:(id<GADFullScreenPresentingAd>)ad {
  NSLog(@"%s called", __PRETTY_FUNCTION__);
}

- (void)adWillPresentFullScreenContent:(id<GADFullScreenPresentingAd>)ad {
  NSLog(@"%s called", __PRETTY_FUNCTION__);
}

- (void)adWillDismissFullScreenContent:(id<GADFullScreenPresentingAd>)ad {
  NSLog(@"%s called", __PRETTY_FUNCTION__);
}

- (void)adDidDismissFullScreenContent:(id<GADFullScreenPresentingAd>)ad {
  NSLog(@"%s called", __PRETTY_FUNCTION__);
  // Clear the rewarded ad.
  self.rewardedAd = nil;
}

- (void)ad:(id)ad didFailToPresentFullScreenContentWithError:(NSError *)error {
  NSLog(@"%s called with error: %@", __PRETTY_FUNCTION__, error.localizedDescription);
}

Menampilkan iklan dan menangani peristiwa reward

Sebelum menampilkan iklan reward kepada pengguna, Anda harus memberikan pilihan eksplisit kepada pengguna untuk melihat konten iklan reward sebagai imbalan atas reward. Iklan bersama reward harus selalu menjadi pengalaman keikutsertaan.

Saat menampilkan iklan, Anda harus memberikan objek GADUserDidEarnRewardHandler untuk menangani reward bagi pengguna.

Kode berikut menunjukkan metode terbaik untuk menampilkan iklan reward:

Swift

rewardedAd.present(from: self) {
  let reward = rewardedAd.adReward
  print("Reward received with currency \(reward.amount), amount \(reward.amount.doubleValue)")

  // TODO: Reward the user.
}

SwiftUI

Memproses peristiwa UI di tampilan untuk menentukan kapan iklan akan ditampilkan.

var body: some View {
  VStack(spacing: 20) {
      Button("Watch video for additional 10 coins") {
        viewModel.showAd()
        showWatchVideoButton = false
      }

Menampilkan iklan reward dari model tampilan:

func showAd() {
  guard let rewardedAd = rewardedAd else {
    return print("Ad wasn't ready.")
  }

  rewardedAd.present(from: nil) {
    let reward = rewardedAd.adReward
    print("Reward amount: \(reward.amount)")
    self.addCoins(reward.amount.intValue)
  }
}

Objective-C

[self.rewardedAd presentFromRootViewController:self
                      userDidEarnRewardHandler:^{
                        GADAdReward *reward = self.rewardedAd.adReward;
                        NSString *rewardMessage = [NSString
                            stringWithFormat:@"Reward received with currency %@ , amount %lf",
                                             reward.type, [reward.amount doubleValue]];
                        NSLog(@"%@", rewardMessage);

                        // TODO: Reward the user.
                      }];

FAQ

Bisakah saya mendapatkan detail hadiah untuk GADRewardedAd?
Ya, jika Anda memerlukan jumlah reward sebelum callback userDidEarnReward dipicu, GADRewardedAd memiliki properti adReward yang dapat Anda periksa untuk memverifikasi jumlah reward setelah iklan dimuat.
Apakah ada waktu tunggu untuk panggilan inisialisasi?
Setelah 10 detik, Google Mobile Ads SDK memanggil GADInitializationCompletionHandler yang diberikan ke metode startWithCompletionHandler:, meskipun jaringan mediasi belum menyelesaikan inisialisasi.
Bagaimana jika beberapa jaringan mediasi belum siap saat saya mendapatkan callback inisialisasi?

Sebaiknya muat iklan di dalam GADInitializationCompletionHandler. Meskipun jaringan mediasi belum siap, Google Mobile Ads SDK tetap meminta iklan dari jaringan tersebut. Jadi, jika jaringan mediasi selesai diinisialisasi setelah waktu tunggu habis, jaringan tersebut masih dapat melayani permintaan iklan mendatang dalam sesi tersebut.

Anda dapat terus melakukan polling status inisialisasi semua adaptor selama sesi aplikasi dengan memanggil GADMobileAds.initializationStatus.

Bagaimana cara mengetahui alasan jaringan mediasi tertentu tidak siap?

Properti description dari objek GADAdapterStatus menjelaskan alasan adaptor belum siap melayani permintaan iklan.

Apakah pengendali penyelesaian userDidEarnRewardHandler selalu dipanggil sebelum metode delegasi adDidDismissFullScreenContent:?

Untuk iklan Google, semua panggilan userDidEarnRewardHandler terjadi sebelum adDidDismissFullScreenContent:. Untuk iklan yang ditayangkan melalui mediasi, penerapan SDK jaringan iklan pihak ketiga menentukan urutan callback. Untuk SDK jaringan iklan yang menyediakan satu metode delegasi dengan informasi reward, adaptor mediasi memanggil userDidEarnRewardHandler sebelum adDidDismissFullScreenContent:.

Contoh di GitHub

Lihat contoh lengkap iklan reward dalam bahasa pilihan Anda:

Langkah berikutnya

Pelajari lebih lanjut privasi pengguna.