Iklan reward

Iklan reward adalah iklan yang menyediakan banyak opsi interaksi untuk pengguna dengan imbalan reward dalam aplikasi. Panduan ini menunjukkan cara mengintegrasikan iklan reward dari Ad Manager ke dalam aplikasi iOS.

Prasyarat

  • Google Mobile Ads SDK 8.0.0 atau yang lebih tinggi.
  • Selesaikan Panduan memulai.

Selalu uji dengan iklan percobaan

Saat mem-build 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 pengujian adalah dengan menggunakan ID unit iklan pengujian khusus kami untuk iklan reward iOS:

/21775744923/example/rewarded

Iklan ini telah dikonfigurasi secara khusus untuk menampilkan iklan pengujian untuk setiap permintaan, dan Anda dapat menggunakannya di aplikasi Anda sendiri saat melakukan coding, pengujian, dan proses debug. Pastikan saja Anda menggantinya dengan ID unit iklan Anda sendiri sebelum memublikasikan aplikasi.

Untuk 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) di class GADRewardedAd.

Swift

import GoogleMobileAds
import UIKit

class ViewController: UIViewController {

  private var rewardedAd: GADRewardedAd?

  func loadRewardedAd() async {
    do {
      rewardedAd = try await GADRewardedAd.load(
        withAdUnitID: "/21775744923/example/rewarded", request: GAMRequest())
    } catch {
      print("Rewarded ad failed to load with error: \(error.localizedDescription)")
    }
  }
}

SwiftUI

import GoogleMobileAds

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

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

Objective-C

@import GoogleMobileAds;
@import UIKit;

@interface ViewController ()

@property(nonatomic, strong) GADRewardedAd *rewardedAd;

@end

@implementation ViewController
- (void)loadRewardedAd {
  GAMRequest *request = [GAMRequest request];
  [GADRewardedAd
      loadWithAdUnitID:@"/21775744923/example/rewarded"
                request:request
      completionHandler:^(GADRewardedAd *ad, NSError *error) {
        if (error) {
          NSLog(@"Rewarded ad failed to load with error: %@", [error localizedDescription]);
          return;
        }
        self.rewardedAd = ad;
        NSLog(@"Rewarded ad loaded.");
      }];
}

[Opsional] Memvalidasi callback verifikasi sisi server (SSV)

Aplikasi yang memerlukan data tambahan dalam callback verifikasi sisi server harus menggunakan fitur data kustom iklan reward. Setiap nilai string yang ditetapkan pada objek iklan reward 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 menetapkan data kustom pada objek iklan reward sebelum meminta iklan.

Swift

do {
  rewardedAd = try await GADRewardedAd.load(
    withAdUnitID: "/21775744923/example/rewarded", request: GAMRequest())
  let options = GADServerSideVerificationOptions()
  options.customRewardString = "SAMPLE_CUSTOM_DATA_STRING"
  rewardedAd.serverSideVerificationOptions = options
} catch {
  print("Rewarded ad failed to load with error: \(error.localizedDescription)")
}

Objective-C

[GADRewardedAd
     loadWithAdUnitID:@"/21775744923/example/rewarded"
              request:[GAMRequest request];
    completionHandler:^(GADRewardedAd *ad, NSError *error) {
      if (error) {
        // Handle Error
        return;
      }
      self.rewardedAd = ad;
      GADServerSideVerificationOptions *options =
          [[GADServerSideVerificationOptions alloc] init];
      options.customRewardString = @"SAMPLE_CUSTOM_DATA_STRING";
      ad.serverSideVerificationOptions = options;
    }];

Mendaftar untuk callback

Untuk menerima notifikasi peristiwa presentasi, Anda harus mengimplementasikan protokol GADFullScreenContentDelegate dan menetapkannya ke properti fullScreenContentDelegate iklan yang ditampilkan. Protokol GADFullScreenContentDelegate menangani callback saat iklan ditampilkan dengan berhasil atau tidak, dan saat iklan ditutup. Kode berikut menunjukkan cara menerapkan protokol dan menetapkannya ke iklan:

Swift

import GoogleMobileAds
import UIKit

class ViewController: UIViewController, GADFullScreenContentDelegate {

  private var rewardedAd: GADRewardedAd?

  func loadRewardedAd() async {
    do {
      rewardedAd = try await GADRewardedAd.load(
        withAdUnitID: "/21775744923/example/rewarded", request: GAMRequest())
      rewardedAd?.fullScreenContentDelegate = self
    } catch {
      print("Rewarded ad failed to load with error: \(error.localizedDescription)")
    }
  }

  /// Tells the delegate that the ad failed to present full screen content.
  func ad(_ ad: GADFullScreenPresentingAd, didFailToPresentFullScreenContentWithError error: Error) {
    print("Ad did fail to present full screen content.")
  }

  /// Tells the delegate that the ad will present full screen content.
  func adWillPresentFullScreenContent(_ ad: GADFullScreenPresentingAd) {
    print("Ad will present full screen content.")
  }

  /// Tells the delegate that the ad dismissed full screen content.
  func adDidDismissFullScreenContent(_ ad: GADFullScreenPresentingAd) {
    print("Ad did dismiss full screen content.")
  }
}

SwiftUI

Tetapkan properti fullScreenContentDelegate ke iklan yang ditampilkan:

rewardedAd?.fullScreenContentDelegate = self

Terapkan protokol:

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

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

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

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

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

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

Objective-C

@interface ViewController () <GADFullScreenContentDelegate>

@property(nonatomic, strong) GADRewardedAd *rewardedAd;

@end

@implementation ViewController
- (void)loadRewardedAd {
  GAMRequest *request = [GAMRequest request];
  [GADRewardedAd
      loadWithAdUnitID:@"ca-app-pub-3940256099942544/4806952744"
                request:request
      completionHandler:^(GADRewardedAd *ad, NSError *error) {
        if (error) {
          NSLog(@"Rewarded ad failed to load with error: %@", [error localizedDescription]);
          return;
        }
        self.rewardedAd = ad;
        NSLog(@"Rewarded ad loaded.");
        self.rewardedAd.fullScreenContentDelegate = self;
      }];
}

/// Tells the delegate that the ad failed to present full screen content.
- (void)ad:(nonnull id<GADFullScreenPresentingAd>)ad
    didFailToPresentFullScreenContentWithError:(nonnull NSError *)error {
    NSLog(@"Ad did fail to present full screen content.");
}

/// Tells the delegate that the ad will present full screen content.
- (void)adWillPresentFullScreenContent:(nonnull id<GADFullScreenPresentingAd>)ad {
    NSLog(@"Ad will present full screen content.");
}

/// Tells the delegate that the ad dismissed full screen content.
- (void)adDidDismissFullScreenContent:(nonnull id<GADFullScreenPresentingAd>)ad {
    NSLog(@"Ad did dismiss full screen content.");
}

GADRewardedAd adalah objek sekali pakai. Artinya, setelah ditampilkan, iklan reward tidak dapat ditampilkan lagi. Praktik terbaiknya adalah memuat iklan reward lain dalam metode adDidDismissFullScreenContent: di GADFullScreenContentDelegate sehingga iklan reward berikutnya mulai dimuat segera setelah iklan sebelumnya ditutup.

Menampilkan iklan dan menangani peristiwa reward

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

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

Kode berikut menampilkan metode terbaik untuk menampilkan iklan reward.

Swift

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

  // The UIViewController parameter is an optional.
  ad.present(fromRootViewController: nil) {
    let reward = ad.adReward
    print("Reward received with currency \(reward.amount), amount \(reward.amount.doubleValue)")
    // TODO: Reward the user.
  }
}

SwiftUI

Dengarkan peristiwa UI dalam tampilan untuk menentukan kapan harus menampilkan iklan.

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

Tampilkan iklan reward dari model tampilan:

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

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

Objective-C

- (void)show {
  if (self.rewardedAd) {
    // The UIViewController parameter is nullable.
    [self.rewardedAd presentFromRootViewController:nil
                                  userDidEarnRewardHandler:^{
                                  GADAdReward *reward =
                                      self.rewardedAd.adReward;
                                  // TODO: Reward the user!
                                }];
  } else {
    NSLog(@"Ad wasn't ready");
  }
}

FAQ

Bisakah saya mendapatkan detail reward untuk GADRewardedAd?
Ya, jika Anda memerlukan jumlah reward sebelum callback userDidEarnReward diaktifkan, 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 akan memanggil GADInitializationCompletionHandler yang disediakan ke metode startWithCompletionHandler:, meskipun jaringan mediasi masih 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 masih meminta iklan ke jaringan tersebut. Jadi, jika jaringan mediasi selesai melakukan inisialisasi 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 penyebab jaringan mediasi tertentu tidak siap?

Properti description dari objek GADAdapterStatus menjelaskan alasan adaptor tidak 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, implementasi SDK jaringan iklan pihak ketiga menentukan urutan callback. Untuk SDK jaringan iklan yang menyediakan satu metode delegasi dengan informasi reward, adaptor mediasi akan memanggil userDidEarnRewardHandler sebelum adDidDismissFullScreenContent:.

Contoh di GitHub

Lihat contoh iklan reward lengkap dalam bahasa yang Anda inginkan:

Langkah berikutnya

Pelajari privasi pengguna lebih lanjut.