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

Quảng cáo có tặng thưởng là những quảng cáo mà người dùng có thể chọn tương tác để đổi lấy phần thưởng trong ứng dụng. Hướng dẫn này sẽ cho bạn biết cách tích hợp quảng cáo có tặng thưởng từ AdMob vào ứng dụng iOS.

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

Tạo đối tượng quảng cáo có tặng thưởng

Quảng cáo có tặng thưởng được yêu cầu và hiển thị theo các đối tượng GADRewardedAd. Bước đầu tiên trong việc sử dụng quảng cáo có tặng thưởng là tạo phiên bản quảng cáo và đặt mã đơn vị quảng cáo. Ví dụ: dưới đây là cách tạo GADRewardedAd trong phương thức viewDidLoad: của UIViewController:

Swift

import GoogleMobileAds
import UIKit

class ViewController: UIViewController, GADRewardedAdDelegate {
  /// The rewarded video ad.
  var rewardedAd: GADRewardedAd? override func viewDidLoad() {
    super.viewDidLoad()
    rewardedAd = GADRewardedAd(adUnitID: "ca-app-pub-3940256099942544/1712485313")
  }
}

Objective-C

@import GoogleMobileAds;
@import UIKit;

@interface ViewController ()

@property(nonatomic, strong) GADRewardedAd *rewardedAd;

@end

@implementation ViewController
- (void)viewDidLoad {
  [super viewDidLoad];

  self.rewardedAd = [[GADRewardedAd alloc]
      initWithAdUnitID:@"ca-app-pub-3940256099942544/1712485313"];
}

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

Khi tạo và thử nghiệm ứng dụng, hãy đảm bảo rằng bạn sử dụng quảng cáo thử nghiệm thay vì quảng cáo đang chạy thực tế. Chúng tôi sẽ tạm ngưng tài khoản của bạn nếu bạn không thực hiện việc nà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 quảng cáo có tặng thưởng trên iOS:

ca-app-pub-3940256099942544/1712485313

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 có thể sử dụng mã này trong ứng dụng của mình khi viết mã, thử nghiệm và gỡ lỗi. Bạn chỉ cần nhớ thay thế mã này bằng mã đơn vị quảng cáo của 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 về Quảng cáo thử nghiệm.

Tải quảng cáo

Để tải quảng cáo có tặng thưởng, hãy gọi loadRequest:completionHandler: trên đối tượng GADRewardedAd:

Swift

rewardedAd?.load(GADRequest()) { error in
  self.adRequestInProgress = false
  if let error = error {
    print("Loading failed: \(error)")
  } else {
    print("Loading Succeeded")
  }
}

Objective-C

@import GoogleMobileAds;
@import UIKit;

@interface ViewController ()

@property(nonatomic, strong) GADRewardedAd *rewardedAd;

@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];

  self.rewardedAd = [[GADRewardedAd alloc]
      initWithAdUnitID:@"ca-app-pub-3940256099942544/1712485313"];

  GADRequest *request = [GADRequest request];
  [self.rewardedAd loadRequest:request completionHandler:^(GADRequestError * _Nullable error) {
    if (error) {
      // Handle ad failed to load case.
    } else {
      // Ad successfully loaded.
    }
  }];
}

Đoạn mã này tải một quảng cáo có tặng thưởng cùng với GADRequest và khối hoàn thành đã cung cấp. Sau khi yêu cầu quảng cáo hoàn tất, hệ thống sẽ thực thi khối hoàn thành với thông số GADRequestError nil. Nếu không tải quảng cáo thành công, đối tượng lỗi non-nil sẽ cung cấp thông tin về lỗi.

Hiển thị quảng cáo

Trước khi hiển thị quảng cáo có tặng thưởng cho người dùng, bạn cần hiển thị cho người dùng tùy 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. Trong mọi trường hợp, người dùng phải có thể chọn xem hoặc không xem quảng cáo có tặng thưởng.

Để hiển thị quảng cáo có tặng thưởng, bạn hãy kiểm tra thuộc tính isReady trên GADRewardedAd để để xác minh rằng quảng cáo đã tải xong, sau đó gọi presentFromRootViewController:delegate:. Dưới đây là một ví dụ về cách thực hiện việc này theo một trong các phương thức hành động trong UIViewController:

Swift

@IBAction func doSomething(sender: UIButton) {
  if rewardedAd?.isReady == true {
     rewardedAd?.present(fromRootViewController: self, delegate:self)
  }
}

Objective-C

@import GoogleMobileAds;

@import UIKit;

@interface ViewController () <GADRewardedAdDelegate>

@property(nonatomic, strong) GADRewardedAd *rewardedAd;

@end

@implementation ViewController
- (IBAction)doSomething:(id)sender {
  ...
  if (self.rewardedAd.isReady) {
    [self.rewardedAd presentFromRootViewController:self delegate:self];
  } else {
    NSLog(@"Ad wasn't ready");
  }
}

Nhận thông báo sự kiện quảng cáo

GADRewardedAdDelegate đã cung cấp trong phương thức presentFromRootViewController:delegate: được gọi khi xảy ra sự kiện quảng cáo có tặng thưởng. Mỗi phương thức trong GADRewardedAdDelegate tương ứng với một sự kiện trong thời gian hoạt động của quảng cáo có tặng thưởng. Phương thức rewardedAd:userDidEarnReward: là bắt buộc phải triển khai, nhưng tất cả các phương thức khác cho lớp được đánh dấu là không bắt buộc, vì vậy, bạn chỉ cần triển khai các phương thức mà bạn muốn. Ví dụ sau triển khai từng phương thức và ghi nhật ký thông báo vào bảng điều khiển:

Swift

/// Tells the delegate that the user earned a reward.
func rewardedAd(_ rewardedAd: GADRewardedAd, userDidEarn reward: GADAdReward) {
  print("Reward received with currency: \(reward.type), amount \(reward.amount).")
}
/// Tells the delegate that the rewarded ad was presented.
func rewardedAdDidPresent(_ rewardedAd: GADRewardedAd) {
  print("Rewarded ad presented.")
}
/// Tells the delegate that the rewarded ad was dismissed.
func rewardedAdDidDismiss(_ rewardedAd: GADRewardedAd) {
  print("Rewarded ad dismissed.")
}
/// Tells the delegate that the rewarded ad failed to present.
func rewardedAd(_ rewardedAd: GADRewardedAd, didFailToPresentWithError error: Error) {
  print("Rewarded ad failed to present.")
}

Objective-C

/// Tells the delegate that the user earned a reward.
- (void)rewardedAd:(GADRewardedAd *)rewardedAd userDidEarnReward:(GADAdReward *)reward {
  // TODO: Reward the user.
  NSLog(@"rewardedAd:userDidEarnReward:");
}

/// Tells the delegate that the rewarded ad was presented.
- (void)rewardedAdDidPresent:(GADRewardedAd *)rewardedAd {
  NSLog(@"rewardedAdDidPresent:");
}

/// Tells the delegate that the rewarded ad failed to present.
- (void)rewardedAd:(GADRewardedAd *)rewardedAd didFailToPresentWithError:(NSError *)error {
  NSLog(@"rewardedAd:didFailToPresentWithError");
}

/// Tells the delegate that the rewarded ad was dismissed.
- (void)rewardedAdDidDismiss:(GADRewardedAd *)rewardedAd {
  NSLog(@"rewardedAdDidDismiss:");
}

Sử dụng GADRewardedAdDelegate để tải trước quảng cáo có tặng thưởng tiếp theo

GADRewardedAd là đối tượng sử dụng một lần. Điều này có nghĩa là sau khi quảng cáo có tặng thưởng xuất hiện, bạn sẽ không thể sử dụng đối tượng này để tải quảng cáo khác. Để yêu cầu một quảng cáo có tặng thưởng khác, bạn cần tạo đối tượng GADRewardedAd mớ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 rewardedAdDidDismiss: trên GADRewardedAdDelegate để 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 đó bị loại bỏ:

Swift

override func viewDidLoad() {
  super.viewDidLoad()
  rewardedAd = createAndLoadRewardedAd()
}

func createAndLoadRewardedAd() {
  rewardedAd = GADRewardedAd(adUnitID: "ca-app-pub-3940256099942544/1712485313")
  rewardedAd?.load(GADRequest()) { error in
    if let error = error {
      print("Loading failed: \(error)")
    } else {
      print("Loading Succeeded")
    }
  }
  return rewardedAd
}

func rewardedAdDidDismiss(_ rewardedAd: GADRewardedAd) {
  rewardedAd = createAndLoadRewardedAd()
}

Objective-C

- (void)viewDidLoad {
  [super viewDidLoad];
  self.rewardedAd = [self createAndLoadRewardedAd];
}

- (GADRewardedAd *)createAndLoadRewardedAd {
  GADRewardedAd *rewardedAd = [[GADRewardedAd alloc]
      initWithAdUnitID:@"ca-app-pub-3940256099942544/1712485313"];
  GADRequest *request = [GADRequest request];
  [rewardedAd loadRequest:request completionHandler:^(GADRequestError * _Nullable error) {
    if (error) {
      // Handle ad failed to load case.
    } else {
      // Ad successfully loaded.
    }
  }];
  return rewardedAd;
}

- (void)rewardedAdDidDismiss:(GADRewardedAd *)rewardedAd {
  self.rewardedAd = [self createAndLoadRewardedAd];
}

Tải nhiều quảng cáo có tặng thưởng

Để tải nhiều quảng cáo có tặng thưởng, hãy làm theo các bước đã nêu trong mục tạo đối tượng quảng cáo có tặng thưởngtải quảng cáo cho từng quảng cáo mà bạn định tải. Đoạn mã dưới đây trình bày cách tải hai quảng cáo có tặng thưởng cho hai vị trí đặt quảng cáo riêng biệt.

Swift

override func viewDidLoad() {
  super.viewDidLoad()
  rewardedAd1 = createAndLoadRewardedAd("first-ad-unit-id")
  rewardedAd2 = createAndLoadRewardedAd("second-ad-unit-id")
}

func createAndLoadRewardedAd(adUnitId) {
  rewardedAd = GADRewardedAd(adUnitID: adUnitId)
  rewardedAd?.load(GADRequest()) { error in
    if let error = error {
      print("Loading failed: \(error)")
    } else {
      print("Loading Succeeded")
    }
  }
  return rewardedAd
}

Objective-C

- (void)viewDidLoad {
  [super viewDidLoad];
  GADRewardedAd *gameOverRewardedAd = [self
    createAndLoadRewardedAdForAdUnit:@"ca-app-pub-3940256099942544/1712485313"];
  GADRewardedAd *extraCoinsRewardedAd = [self
    createAndLoadRewardedAdForAdUnit:@"ca-app-pub-3940256099942544/1712485313"];
}

- (GADRewardedAd *)createAndLoadRewardedAdForAdUnit:(NSString *) adUnitId {
  GADRewardedAd *rewardedAd = [[GADRewardedAd alloc] initWithAdUnitID:adUnitId];
  GADRequest *request = [GADRequest request];
  [rewardedAd loadRequest:request completionHandler:^(GADRequestError * _Nullable error) {
    if (error) {
      // Handle ad failed to load case.
    } else {
      // Ad successfully loaded.
    }
  }];
  return rewardedAd;
}

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 reward để 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.
Cuộc 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 đã cung cấp cho phương thức startWithCompletionHandler:, ngay cả khi mạng dàn xếp chưa hoàn thành quy trình khởi chạy.
Điều gì xảy ra nếu một số mạng dàn xếp chưa sẵn sàng hoạt động khi tôi nhận được lệnh gọi lại khởi chạy?

Đó là phương pháp hay nhất để 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 trên thiết bị di động của Google vẫn sẽ yêu cầu mạng đó cho quảng cáo. Vì vậy, nếu mạng dàn xếp kết thúc quá trình khởi chạy sau khi hết thời gian chờ, mạng quảng cáo đó vẫn có thể phục vụ các yêu cầu quảng cáo tiếp theo trong phiên hoạt động đó.

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

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

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