Quảng cáo khi mở ứng dụng

Hướng dẫn này dành cho các nhà xuất bản tích hợp quảng cáo khi mở ứng dụng.

Quảng cáo khi mở ứng dụng là một định dạng quảng cáo đặc biệt dành cho những nhà xuất bản muốn kiếm tiền từ màn hình tải ứng dụng của họ. Người dùng có thể đóng quảng cáo khi mở ứng dụng bất cứ lúc nào. Quảng cáo khi mở ứng dụng có thể xuất hiện khi người dùng chạy ứng dụng của bạn trên nền trước.

Quảng cáo khi mở ứng dụng tự động hiển thị một vùng nhận diện thương hiệu nhỏ để người dùng biết họ đang ở trong ứng dụng của bạn. Dưới đây là một ví dụ về hình thức hiển thị của quảng cáo khi mở ứng dụng:

Nhìn chung, bạn cần thực hiện các bước sau đây để triển khai quảng cáo khi mở ứng dụng:

  1. Tạo một lớp người quản lý sẽ tải quảng cáo trước khi bạn cần hiển thị quảng cáo đó.
  2. Hiển thị quảng cáo trong các sự kiện đưa ứng dụng lên nền trước.
  3. Xử lý lệnh gọi lại bản trình bày.

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

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 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 quảng cáo khi mở ứng dụng:

ca-app-pub-3940256099942544/5575463023

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 lập trình, chạy thử nghiệm và gỡ lỗi. Bạn chỉ cần 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 Quảng cáo thử nghiệm.

Triển khai một lớp người quản lý

Quảng cáo của bạn phải nhanh chóng hiển thị. Vì vậy, tốt nhất là bạn nên tải quảng cáo trước khi cần hiển thị quảng cáo. Bằng cách này, bạn sẽ có một quảng cáo sẵn sàng chạy ngay khi người dùng truy cập vào ứng dụng của bạn. Hãy triển khai lớp người quản lý để thực hiện yêu cầu quảng cáo trước khi bạn cần hiển thị quảng cáo.

Tạo một lớp singleton mới có tên là AppOpenAdManager rồi điền như sau:

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

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

Bước tiếp theo là điền vào phương thức 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: "ca-app-pub-3940256099942544/5575463023", request: GADRequest())
  } 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:@"ca-app-pub-3940256099942544/5575463023"
                       request:[GADRequest 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;
             }];
}

Hiển thị quảng cáo

Bước tiếp theo là điền vào phương thức showAdIfAvailable(). Nếu không có quảng cáo nào, phương thức này sẽ cố gắng tải quảng cáo.

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

Hiển thị quảng cáo trong các sự kiện đưa ứng dụng lên nền trước

Khi ứng dụng đang hoạt động, hãy gọi showAdIfAvailable() để hiển thị quảng cáo nếu có quảng cáo hoặc tải một quảng cáo mới.

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

Xử lý lệnh gọi lại bản trình bày

Khi ứng dụng của bạn hiển thị quảng cáo khi mở ứng dụng, bạn nên dựa vào GADFullScreenContentDelegate để xử lý một số sự kiện trình bày nhất định. Cụ thể, bạn sẽ muốn yêu cầu quảng cáo khi mở ứng dụng tiếp theo sau khi quảng cáo đầu tiên hiển thị xong.

Trong lớp AppOpenAdManager, hãy thêm nội dung sau:

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: "ca-app-pub-3940256099942544/5575463023", request: GADRequest())
      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:@"ca-app-pub-3940256099942544/5575463023"
                       request:[GADRequest 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

Xem xét thời hạn quảng cáo

Để đảm bảo không hiển thị quảng cáo đã hết hạn, bạn có thể thêm một phương thức vào thực thể đại diện cho ứng dụng để kiểm tra thời gian đã trôi qua kể từ khi tệp tham chiếu quảng cáo của bạn được tải.

Trong AppOpenAdManager, hãy thêm một thuộc tính Date có tên là loadTime và đặt thuộc tính đó khi quảng cáo của bạn tải. Sau đó, bạn có thể thêm một phương thức trả về true nếu ít hơn một số giờ nhất định đã trôi qua kể từ khi quảng cáo của bạn được tải. Hãy đảm bảo bạn kiểm tra tính hợp lệ của tệp tham chiếu quảng cáo trước khi cố gắng hiển thị quảng cáo.

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: "ca-app-pub-3940256099942544/5575463023", request: GADRequest())
      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:@"ca-app-pub-3940256099942544/5575463023"
                       request:[GADRequest 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

Khởi động nguội và màn hình tải

Tài liệu này giả định rằng bạn chỉ hiển thị quảng cáo khi mở ứng dụng khi người dùng đưa ứng dụng của bạn lên nền trước khi ứng dụng đang bị tạm ngưng trong bộ nhớ. Quá trình "Khởi động nguội" xảy ra khi người dùng chạy ứng dụng của bạn nhưng trước đó, ứng dụng này chưa bị tạm ngưng trong bộ nhớ.

Một ví dụ về khởi động nguội là khi người dùng mở ứng dụng của bạn lần đầu tiên. Khi khởi động nguội, quảng cáo khi mở ứng dụng sẽ chưa được tải trước đó và sẵn sàng hiển thị ngay lập tức. Độ trễ giữa thời điểm bạn yêu cầu quảng cáo và thời điểm nhận lại quảng cáo có thể dẫn đến một trường hợp, trong đó người dùng có thể sử dụng ứng dụng của bạn trong một thời gian ngắn trước khi bị một quảng cáo không theo bối cảnh làm bất ngờ. Bạn nên tránh làm như vậy vì điều này sẽ tạo ra trải nghiệm không tốt cho người dùng.

Để sử dụng quảng cáo khi mở ứng dụng vào lúc khởi động nguội, cách tốt nhất là bạn nên dùng màn hình tải để tải các thành phần trò chơi hoặc ứng dụng và chỉ hiển thị quảng cáo trên màn hình tải. Bạn không nên hiển thị quảng cáo nếu ứng dụng đã tải xong và đã đưa người dùng đến nội dung chính của ứng dụng.

Các phương pháp hay nhất

Google tạo quảng cáo khi mở ứng dụng để giúp bạn kiếm tiền từ màn hình tải của ứng dụng, nhưng bạn cần lưu ý đến các phương pháp hay nhất để người dùng thích sử dụng ứng dụng của bạn. Hãy nhớ:

  • Chờ người dùng sử dụng ứng dụng của bạn một vài lần rồi mới hiển thị quảng cáo khi mở ứng dụng đầu tiên.
  • Hiển thị quảng cáo khi mở ứng dụng trong thời gian người dùng chờ ứng dụng của bạn tải.
  • Nếu bạn có màn hình tải trong quảng cáo khi mở ứng dụng và màn hình tải đó sẽ tải xong trước khi quảng cáo bị đóng, thì bạn nên đóng màn hình tải theo phương thức adDidDismissFullScreenContent.

Ví dụ đầy đủ trên GitHub

Swift Objective-C

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.