โฆษณาเปิดแอป

คู่มือนี้มีไว้สำหรับผู้เผยแพร่โฆษณาที่ผสานรวมโฆษณาเปิดแอป

โฆษณาเปิดแอปเป็นรูปแบบโฆษณาพิเศษที่มีไว้สำหรับผู้เผยแพร่โฆษณาที่ต้องการสร้างรายได้ หน้าจอโหลดแอป ผู้ใช้สามารถปิดโฆษณาเปิดแอปได้ทุกเมื่อ โฆษณาเปิดแอปอาจแสดงขึ้นเมื่อผู้ใช้นำแอปของคุณมาไว้เบื้องหน้า

โฆษณาเปิดแอปจะแสดงพื้นที่การสร้างแบรนด์ขนาดเล็กโดยอัตโนมัติเพื่อให้ผู้ใช้ทราบว่าตนอยู่ในพื้นที่ แอปของคุณ ต่อไปนี้คือตัวอย่างลักษณะของโฆษณาเปิดแอป

ขั้นตอนที่จำเป็นในการใช้โฆษณาเปิดแอปในระดับสูงมีดังนี้

  1. สร้างคลาสตัวจัดการที่โหลดโฆษณาก่อนที่คุณต้องแสดงโฆษณา
  2. แสดงการเพิ่มระหว่างเหตุการณ์เบื้องหน้าแอป
  3. จัดการ Callback ของงานนำเสนอ

ข้อกำหนดเบื้องต้น

ทดสอบด้วยโฆษณาทดสอบเสมอ

เมื่อสร้างและทดสอบแอป โปรดใช้โฆษณาทดสอบแทน โฆษณาที่ใช้งานจริง การไม่ดำเนินการดังกล่าวอาจส่งผลให้บัญชีของคุณถูกระงับ

วิธีที่ง่ายที่สุดในการโหลดโฆษณาทดสอบคือการใช้รหัสหน่วยโฆษณาทดสอบสำหรับแอปโดยเฉพาะ โฆษณาที่เปิดอยู่:

/21775744923/example/app-open

โดยได้รับการกำหนดค่าเป็นพิเศษให้ส่งคืนโฆษณาทดสอบสำหรับทุกคำขอ โดยคุณจะ นำไปใช้ในแอปของคุณเองขณะเขียนโค้ด ทดสอบ และแก้ไขข้อบกพร่องได้ฟรี ทำ อย่าลืมแทนที่ด้วยรหัสหน่วยโฆษณาของคุณเองก่อนที่จะเผยแพร่แอป

ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีการทำงานของโฆษณาทดสอบของ Mobile Ads SDK ได้ที่ทดสอบ

ใช้คลาสผู้จัดการ

โฆษณาของคุณควรแสดงอย่างรวดเร็ว จึงควรโหลดโฆษณาก่อนที่คุณจะต้อง แสดง วิธีนี้จะทำให้คุณมีโฆษณาพร้อมแสดงได้ทันทีที่ผู้ใช้ป้อน แอปของคุณ ใช้คลาสผู้จัดการเพื่อสร้างคำขอโฆษณาล่วงหน้าเมื่อคุณต้องการ เพื่อแสดงโฆษณา

สร้างคลาส Singleton ใหม่ชื่อ AppOpenAdManager และกรอกข้อมูลเป็น ดังต่อไปนี้:

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

โหลดโฆษณา

ขั้นตอนถัดไปคือการกรอกข้อมูลในเมธอด 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;
             }];
}

แสดงโฆษณา

ขั้นตอนถัดไปคือการกรอกข้อมูลในเมธอด showAdIfAvailable() หากไม่มีโฆษณา วิธีนี้จะพยายามโหลดโฆษณา

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

แสดงโฆษณาระหว่างเหตุการณ์เบื้องหน้าแอป

เมื่อแอปพลิเคชันเริ่มทำงาน ให้โทรหา showAdIfAvailable() เพื่อแสดงโฆษณา มีอยู่แล้ว หรือโหลดอันใหม่

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

จัดการ Callback ของงานนำเสนอ

เมื่อแอปแสดงโฆษณาเปิดแอป คุณควรใช้ GADFullScreenContentDelegate สำหรับจัดการเหตุการณ์การนำเสนอบางรายการ ใน คุณจะต้องขอโฆษณาเปิดแอปถัดไปเมื่อโฆษณาแรก เสร็จสิ้นการนำเสนอ

เพิ่มข้อมูลต่อไปนี้ในชั้นเรียน AppOpenAdManager

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

พิจารณาการหมดอายุของโฆษณา

เพิ่มวิธีการให้กับผู้รับมอบสิทธิ์แอปเพื่อให้มั่นใจว่าจะไม่แสดงโฆษณาที่หมดอายุแล้ว เพื่อตรวจสอบเวลาที่ผ่านไปนับจากที่โหลดการอ้างอิงโฆษณา

ใน AppOpenAdManager ให้เพิ่มพร็อพเพอร์ตี้ Date ชื่อ loadTime และตั้งค่า เมื่อโฆษณาของคุณโหลด จากนั้นคุณสามารถเพิ่มเมธอดที่แสดง true ได้ในกรณีต่อไปนี้ เวลาผ่านไปน้อยกว่าจำนวนชั่วโมงตั้งแต่โฆษณาโหลดขึ้น ตรวจสอบว่า คุณสามารถตรวจสอบความถูกต้องของการอ้างอิงโฆษณาของคุณก่อนที่จะพยายามแสดงโฆษณา

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

Cold Start และหน้าจอกำลังโหลด

เอกสารประกอบนี้มีให้คุณแสดงโฆษณาเปิดแอปเฉพาะเมื่อผู้ใช้ เบื้องหน้าแอปของคุณเมื่อถูกระงับในหน่วยความจำ "Cold Start" เกิดขึ้นเมื่อ แอปของคุณเปิดขึ้นแต่ไม่ได้ถูกระงับในหน่วยความจำก่อนหน้านี้

ตัวอย่างของ Cold Start ได้แก่ เมื่อผู้ใช้เปิดแอปของคุณเป็นครั้งแรก เมื่อใช้ Cold Start จะไม่มีโฆษณาเปิดแอปที่โหลดไว้ก่อนหน้านี้ซึ่งพร้อมแสดงทันที ระยะเวลาระหว่างที่คุณขอโฆษณาและรับโฆษณา อาจสร้างสถานการณ์ที่ผู้ใช้ สามารถใช้แอปของคุณเป็นเวลาสั้นๆ โดยโฆษณาที่อยู่นอกบริบท ซึ่งควรหลีกเลี่ยงเนื่องจาก ผู้ใช้ได้รับประสบการณ์ที่ไม่ดี

วิธีที่ควรใช้โฆษณาเปิดแอปเมื่อ Cold Start คือการใช้หน้าจอการโหลด เพื่อโหลดเนื้อหาเกมหรือแอป และแสดงเฉพาะโฆษณาจากการโหลดเท่านั้น บนหน้าจอ หากแอปโหลดเสร็จแล้วและส่งผู้ใช้ไปยังเนื้อหาหลักของแอป อย่าแสดงโฆษณา

แนวทางปฏิบัติแนะนำ

โฆษณาเปิดแอปที่ Google สร้างขึ้นเพื่อช่วยคุณสร้างรายได้จากหน้าจอโหลดของแอป แต่ คุณควรคำนึงถึงแนวทางปฏิบัติที่ดีที่สุดเพื่อให้ผู้ใช้สนุกกับการใช้ แอปของคุณ โปรดดำเนินการต่อไปนี้

  • รอให้แสดงโฆษณาเปิดแอปรายการแรกจนกว่าผู้ใช้จะได้ใช้ 2-3 ครั้ง
  • แสดงโฆษณาเปิดแอปในช่วงเวลาที่ผู้ใช้ต้องรอ เพื่อให้แอปของคุณโหลดขึ้นมา
  • หากคุณมีหน้าจอการโหลดใต้โฆษณาเปิดแอป และหน้าจอการโหลด เสร็จสมบูรณ์ก่อนที่จะปิดโฆษณา คุณอาจต้อง หน้าจอการโหลดในเมธอด adDidDismissFullScreenContent

ตัวอย่างที่สมบูรณ์ใน GitHub

Swift Objective-C

ขั้นตอนถัดไป

ดูข้อมูลเพิ่มเติมเกี่ยวกับความเป็นส่วนตัวของผู้ใช้