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