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