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 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ỏ chứa thương hiệu để người dùng biết rằng họ đang ở ứng dụng của bạn. Sau đây là ví dụ về hình thức 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 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 trong bản trình bày.

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

/21775744923/example/app-open

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 lớp trình 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 bạn nên tải quảng cáo trước khi cần hiển thị màn hình. Bằng cách đó, bạn sẽ có quảng cáo sẵn sàng chạy ngay khi người dùng nhập ứng dụng của bạn. Triển khai một lớp người quản lý để thực hiện các yêu cầu quảng cáo trước khi bạn cần hiện quảng cáo.

Tạo một lớp singleton mới có tên là AppOpenAdManager rồi điền vào lớp đó dưới dạng 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: "/21775744923/example/app-open", request: GAMRequest())
  } 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:@"/21775744923/example/app-open"
                       request:[GAMRequest 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 cố gắng tải một 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 được kích hoạt, hãy gọi showAdIfAvailable() để hiển thị quảng cáo nếu có sẵn một tệp mới hoặc tải một tệp 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 trong 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. Trong cụ thể, bạn sẽ muốn yêu cầu quảng cáo khi mở ứng dụng tiếp theo sau quảng cáo đầu tiên kết thúc trình bày.

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: "/21775744923/example/app-open", request: GAMRequest())
      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:@"/21775744923/example/app-open"
                       request:[GAMRequest 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 của 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 ứng dụng ủy quyền để 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 rồi đặt giá trị cho thuộc tính này 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 chưa đầy một số giờ nhất định đã trôi qua kể từ khi quảng cáo của bạn được tải. Đảm bảo bạn kiểm tra tính hợp lệ của 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: "/21775744923/example/app-open", request: GAMRequest())
      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:@"/21775744923/example/app-open"
                       request:[GAMRequest 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 chạy ứng dụng trên nền trước khi ứng dụng bị tạm ngưng trong bộ nhớ. "Khởi động nguội" xảy ra khi ứng dụng của bạn đã được khởi chạy nhưng trước đó không 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 lần đầu tiên. Trong trường hợp khởi động nguội, bạn sẽ không có quảng cáo khi mở ứng dụng đã tải trước đó sẵn sàng được 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à nhận được quảng cáo có thể tạo ra một tình huống trong đó người dùng có thể sử dụng ngay ứng dụng của bạn trước khi bị bất ngờ bởi quảng cáo không phù hợp. Bạn nên tránh điều này vì đây là trải nghiệm người dùng kém.

Cách ưu tiên để sử dụng quảng cáo khi mở ứng dụng khi khởi động nguội là dùng màn hình tải để tải nội dung trò chơi hoặc ứng dụng của bạn và chỉ hiển thị quảng cáo khi tải màn hình. Nếu ứng dụng của bạn đã tải xong và đã đưa người dùng đến nội dung của ứng dụng thì đừng hiển thị quảng cáo.

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 ý 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 quảng cáo khi mở ứng dụng đầu tiên mới xuất hiện ứng dụng của bạn một vài lần.
  • Hiển thị quảng cáo khi mở ứng dụng trong những khoảng thời gian mà người dùng đáng lẽ phải chờ đợi để tải ứng dụng.
  • 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 tải xong trước khi quảng cáo bị đóng, bạn nên đóng màn hình tải trong phương thức adDidDismissFullScreenContent.

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

Swift Đối tượng 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.