Quảng cáo có tặng thưởng

Quảng cáo có tặng thưởng là quảng cáo mà người dùng có thể tương tác để đổi lại để nhận phần thưởng trong ứng dụng. Hướng dẫn này hướng dẫn bạn cách tích hợp quảng cáo có tặng thưởng từ Ad Manager vào một ứng dụng iOS.

Điều kiện tiên quyết

Luôn thử nghiệm bằng quảng cáo thử nghiệm

Khi tạo và thử nghiệm ứng dụng, hãy nhớ sử dụng quảng cáo thử nghiệm thay vì quảng cáo thực tế. Chúng tôi có thể tạm ngưng tài khoản của bạn nếu bạn không làm như vậy.

Cách dễ nhất để tải quảng cáo thử nghiệm là sử dụng mã đơn vị quảng cáo thử nghiệm dành riêng cho iOS quảng cáo có tặng thưởng:

/21775744923/example/rewarded

Mã này được định cấu hình đặc biệt để trả về quảng cáo thử nghiệm cho mọi yêu cầu và bạn sử dụng miễn phí mã này trong ứng dụng của riêng bạn khi lập trình, thử nghiệm và gỡ lỗi. Chỉ cần tạo bạn nhớ thay thế mã này bằng mã đơn vị quảng cáo của riêng mình trước khi xuất bản ứng dụng.

Để biết thêm thông tin về cách hoạt động của quảng cáo thử nghiệm của SDK quảng cáo trên thiết bị di động, hãy xem bài viết Thử nghiệm Google Ads.

Triển khai

Sau đây là các bước chính để tích hợp quảng cáo có tặng thưởng:

  • Tải một quảng cáo
  • [Không bắt buộc] Xác thực lệnh gọi lại của SSO
  • Đăng ký các lệnh gọi lại
  • Hiển thị quảng cáo và xử lý sự kiện tặng thưởng

Tải một quảng cáo

Bạn có thể tải một quảng cáo bằng cách sử dụng load(adUnitID:request) trên lớp 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.");
      }];
}

[Không bắt buộc] Xác thực lệnh gọi lại của tính năng xác minh phía máy chủ (SSV)

Ứng dụng yêu cầu thêm dữ liệu ở phía máy chủ xác minh nên sử dụng phương thức tính năng dữ liệu tuỳ chỉnh của quảng cáo có tặng thưởng. Bất kỳ giá trị chuỗi nào được đặt cho quảng cáo có tặng thưởng được truyền đến tham số truy vấn custom_data của lệnh gọi lại adb. Nếu không sau khi đã đặt giá trị dữ liệu tùy chỉnh, giá trị tham số truy vấn custom_data sẽ không là hiển thị trong lệnh gọi lại TCF.

Mã mẫu sau đây minh hoạ cách đặt dữ liệu tuỳ chỉnh cho một quảng cáo có tặng thưởng trước khi yêu cầu một quảng cáo.

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;
    }];

Đăng ký các lệnh gọi lại

Để nhận thông báo cho các sự kiện trình bày, bạn phải triển khai giao thức GADFullScreenContentDelegate và chỉ định giao thức đó cho thuộc tính fullScreenContentDelegate của quảng cáo được trả về. Chiến lược phát hành đĩa đơn Giao thức GADFullScreenContentDelegate xử lý lệnh gọi lại khi quảng cáo hiển thị thành công hoặc không thành công và khi bị loại bỏ. Nội dung sau đây mã cho biết cách triển khai giao thức và chỉ định giao thức đó cho quảng cáo:

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

Chỉ định thuộc tính fullScreenContentDelegate cho quảng cáo được trả về:

rewardedAd?.fullScreenContentDelegate = self

Triển khai giao thức:

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 là đối tượng dùng một lần. Điều này có nghĩa là sau khi một quảng cáo có tặng thưởng nên sẽ không thể hiển thị lại. Phương pháp hay nhất là tải một quảng cáo có tặng thưởng khác trong phương thức adDidDismissFullScreenContent: trên GADFullScreenContentDelegate để quảng cáo có tặng thưởng tiếp theo bắt đầu tải ngay khi quảng cáo trước đó được tải đã loại bỏ.

Hiển thị quảng cáo và xử lý sự kiện tặng thưởng

Trước khi hiển thị quảng cáo có tặng thưởng cho người dùng, bạn phải trình bày cho người dùng lựa chọn rõ ràng về việc xem nội dung quảng cáo có tặng thưởng để đổi lấy phần thưởng. Quảng cáo có tặng thưởng quảng cáo phải luôn là trải nghiệm chọn tham gia.

Khi hiển thị quảng cáo, bạn phải cung cấp một đối tượng GADUserDidEarnRewardHandler để xử lý phần thưởng cho người dùng.

Bạn nên sử dụng đoạn mã sau đây để hiển thị quảng cáo có tặng thưởng.

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

Theo dõi các sự kiện giao diện người dùng trong chế độ xem để xác định thời điểm hiển thị quảng cáo.

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

Hiển thị quảng cáo có tặng thưởng từ mô hình chế độ xem:

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");
  }
}

Câu hỏi thường gặp

Tôi có thể nhận thông tin chi tiết về phần thưởng cho GADRewardedAd không?
Có, nếu bạn cần biết số tiền thưởng trước khi kích hoạt lệnh gọi lại userDidEarnReward, GADRewardedAd có thuộc tính adReward để bạn có thể kiểm tra nhằm xác minh số tiền thưởng sau khi quảng cáo đã tải.
Lệnh gọi khởi chạy có thời gian chờ không?
Sau 10 giây, SDK quảng cáo trên thiết bị di động của Google sẽ gọi GADInitializationCompletionHandler được cung cấp cho startWithCompletionHandler:, ngay cả khi mạng dàn xếp vẫn chưa quy trình khởi tạo hoàn tất.
Điều gì sẽ xảy ra nếu một số mạng dàn xếp chưa sẵn sàng khi tôi nhận được lệnh gọi lại khởi chạy?

Bạn nên tải quảng cáo bên trong GADInitializationCompletionHandler. Ngay cả khi mạng dàn xếp chưa sẵn sàng hoạt động, SDK Quảng cáo của Google trên thiết bị di động vẫn yêu cầu mạng đó cung cấp một quảng cáo. Vì vậy, nếu một quá trình khởi chạy kết thúc sau khi hết thời gian chờ, nhưng mạng dàn xếp vẫn có thể hoạt động. yêu cầu quảng cáo tương lai trong phiên hoạt động đó.

Bạn có thể tiếp tục thăm dò trạng thái khởi chạy của tất cả các bộ chuyển đổi trong toàn bộ phiên hoạt động trong ứng dụng của bạn bằng cách gọi GADMobileAds.initializationStatus.

Làm cách nào để biết lý do một mạng dàn xếp cụ thể chưa sẵn sàng?

Thuộc tính description của đối tượng GADAdapterStatus cho biết lý do khiến bộ chuyển đổi chưa sẵn sàng phân phát các yêu cầu quảng cáo.

Trình xử lý hoàn thành userDidEarnRewardHandler có luôn được gọi trước phương thức uỷ quyền adDidDismissFullScreenContent: không?

Đối với quảng cáo của Google, tất cả lệnh gọi userDidEarnRewardHandler đều xảy ra trước adDidDismissFullScreenContent:. Đối với quảng cáo được phân phát qua dàn xếp, mạng quảng cáo của bên thứ ba Quá trình triển khai SDK xác định thứ tự gọi lại. Đối với các SDK mạng quảng cáo cung cấp một phương thức ủy quyền duy nhất cùng với thông tin về phần thưởng, bộ chuyển đổi dàn xếp gọi userDidEarnRewardHandler trước adDidDismissFullScreenContent:.

Ví dụ trên GitHub

Xem toàn bộ ví dụ về quảng cáo có tặng thưởng bằng ngôn ngữ bạn ưu tiên:

Các bước tiếp theo

Tìm hiểu thêm về quyền riêng tư của người dùng.