คู่มือนี้มีไว้สำหรับผู้เผยแพร่โฆษณาที่ผสานรวมโฆษณาเปิดแอป
โฆษณาเปิดแอปเป็นรูปแบบโฆษณาพิเศษที่ออกแบบมาสําหรับผู้เผยแพร่โฆษณาที่ต้องการสร้างรายได้ จากหน้าจอโหลดของแอป ผู้ใช้สามารถปิดโฆษณาเปิดแอปได้ทุกเมื่อ โฆษณาเปิดแอปจะแสดงได้เมื่อผู้ใช้นำแอปของคุณมาไว้เบื้องหน้า
โฆษณาเปิดแอปจะแสดงพื้นที่การสร้างแบรนด์ขนาดเล็กๆ โดยอัตโนมัติเพื่อให้ผู้ใช้รู้ว่ากำลังอยู่ในแอปของคุณ ตัวอย่างโฆษณาเปิดแอปมีลักษณะดังนี้
ขั้นตอนที่จำเป็นในการใช้งานโฆษณาเปิดแอปในระดับสูงมีดังนี้
- สร้างคลาส Manager ที่โหลดโฆษณาก่อนที่คุณจะต้องแสดง
- แสดงโฆษณาระหว่างเหตุการณ์การนำแอปไปไว้เบื้องหน้า
- จัดการการเรียกกลับของงานนำเสนอ
ข้อกำหนดเบื้องต้น
- ทําตามวิธีการตั้งค่าในคู่มือเริ่มต้นใช้งาน
- ทราบวิธีกำหนดค่าอุปกรณ์เป็นอุปกรณ์ ทดสอบ
ทดสอบด้วยโฆษณาทดสอบเสมอ
เมื่อสร้างและทดสอบแอป โปรดใช้โฆษณาทดสอบแทน โฆษณาจริงที่ใช้งานจริง หากไม่ดำเนินการดังกล่าวอาจส่งผลให้บัญชีถูกระงับ
วิธีที่ง่ายที่สุดในการโหลดโฆษณาทดสอบคือการใช้รหัสหน่วยโฆษณาทดสอบเฉพาะสำหรับโฆษณา แอปที่เปิดอยู่
ca-app-pub-3940256099942544/5575463023
เราได้กำหนดค่าไว้เป็นพิเศษเพื่อแสดงโฆษณาทดสอบสำหรับทุกคำขอ และคุณสามารถใช้ในแอปของคุณเองได้ขณะเขียนโค้ด ทดสอบ และแก้ไขข้อบกพร่อง เพียงตรวจสอบว่าคุณได้แทนที่ด้วยรหัสหน่วยโฆษณาของคุณเองก่อนเผยแพร่แอป
ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีการทำงานของโฆษณาทดสอบของ Mobile Ads SDK ได้ที่โฆษณาทดสอบ
ใช้คลาสผู้จัดการ
โฆษณาควรแสดงอย่างรวดเร็ว ดังนั้นจึงควรโหลดโฆษณาก่อนที่คุณจะต้อง แสดง วิธีนี้จะช่วยให้คุณมีโฆษณาพร้อมแสดงทันทีที่ผู้ใช้เข้าสู่แอปของคุณ ใช้คลาสตัวจัดการเพื่อส่งคำขอโฆษณาล่วงหน้าก่อนเวลาที่คุณต้องการ แสดงโฆษณา
สร้างคลาส Singleton ใหม่ชื่อ AppOpenAdManager
และกรอกข้อมูลดังนี้
Swift
class AppOpenAdManager: NSObject {
var appOpenAd: AppOpenAd?
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 AppOpenAd.load(
with: "ca-app-pub-3940256099942544/5575463023", request: Request())
} 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;
}];
}
แสดงโฆษณา
ขั้นตอนถัดไปคือการกรอก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(from: 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, FullScreenContentDelegate {
// ...
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 AppOpenAd.load(
with: "ca-app-pub-3940256099942544/5575463023", request: Request())
appOpenAd?.fullScreenContentDelegate = self
} catch {
print("App open ad failed to load with error: \(error.localizedDescription)")
}
isLoadingAd = false
}
// ...
// MARK: - FullScreenContentDelegate methods
func adWillPresentFullScreenContent(_ ad: FullScreenPresentingAd) {
print("App open ad will be presented.")
}
func adDidDismissFullScreenContent(_ ad: FullScreenPresentingAd) {
appOpenAd = nil
isShowingAd = false
// Reload an ad.
Task {
await loadAd()
}
}
func ad(
_ ad: FullScreenPresentingAd,
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
พิจารณาการหมดอายุของโฆษณา
หากต้องการไม่ให้แสดงโฆษณาที่หมดอายุแล้ว คุณสามารถเพิ่มเมธอดลงในตัวแทนแอป ซึ่งจะตรวจสอบเวลาที่ผ่านไปนับตั้งแต่โหลดการอ้างอิงโฆษณา
ใน AppOpenAdManager
ให้เพิ่มพร็อพเพอร์ตี้ Date
ที่ชื่อ loadTime
และตั้งค่า
พร็อพเพอร์ตี้เมื่อโฆษณาโหลด จากนั้นคุณสามารถเพิ่มเมธอดที่แสดงผล true
หาก
เวลาผ่านไปน้อยกว่าจำนวนชั่วโมงที่กำหนดนับตั้งแต่โฆษณาโหลด โปรดตรวจสอบความถูกต้องของการอ้างอิงโฆษณาก่อนที่จะพยายามแสดงโฆษณา
Swift
class AppOpenAdManager: NSObject, FullScreenContentDelegate {
var appOpenAd: AppOpenAd?
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 AppOpenAd.load(
with: "ca-app-pub-3940256099942544/5575463023", request: Request())
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
การเริ่มแอปแบบ Cold Start และหน้าจอการโหลด
เอกสารประกอบนี้ถือว่าคุณแสดงโฆษณาเปิดแอปเฉพาะเมื่อผู้ใช้ นำแอปของคุณมาไว้เบื้องหน้าเมื่อระบบระงับแอปไว้ในหน่วยความจำ "Cold Start" จะเกิดขึ้นเมื่อ แอปของคุณเปิดขึ้นแต่ไม่ได้ถูกระงับไว้ในหน่วยความจำก่อนหน้านี้
ตัวอย่างของ Cold Start คือเมื่อผู้ใช้เปิดแอปเป็นครั้งแรก เมื่อมีการเริ่มแอปแบบ Cold Start คุณจะไม่มีโฆษณาเปิดแอปที่โหลดไว้ก่อนหน้านี้ซึ่งพร้อม แสดงทันที ความล่าช้าระหว่างเวลาที่คุณขอโฆษณาและเวลาที่คุณได้รับโฆษณา กลับอาจทำให้เกิดสถานการณ์ที่ผู้ใช้สามารถใช้แอปของคุณได้ในระยะเวลาสั้นๆ ก่อนที่จะ ประหลาดใจกับโฆษณาที่ไม่อยู่ในบริบท คุณควรหลีกเลี่ยงการทำเช่นนี้เนื่องจากจะทำให้ผู้ใช้ได้รับประสบการณ์การใช้งานที่ไม่ดี
วิธีที่แนะนำในการใช้โฆษณาเปิดแอปเมื่อเริ่มแอปเป็นครั้งแรกคือการใช้หน้าจอการโหลด เพื่อโหลดชิ้นงานเกมหรือแอป และแสดงโฆษณาจากหน้าจอการโหลด เท่านั้น หากแอปโหลดเสร็จแล้วและส่งผู้ใช้ไปยังเนื้อหาหลัก ของแอปแล้ว ให้ไม่แสดงโฆษณา
แนวทางปฏิบัติแนะนำ
Google สร้างโฆษณาเปิดแอปเพื่อช่วยให้คุณสร้างรายได้จากหน้าจอการโหลดของแอป แต่ โปรดคำนึงถึงแนวทางปฏิบัติแนะนำเพื่อให้ผู้ใช้ได้รับประสบการณ์การใช้งานแอปที่ดี อย่าลืมทำสิ่งต่อไปนี้
- รอแสดงโฆษณาเปิดแอปแรกจนกว่าผู้ใช้จะใช้แอปของคุณ 2-3 ครั้ง
- แสดงโฆษณาเปิดแอปในช่วงเวลาที่ผู้ใช้ต้องรอให้แอปโหลด
- หากมีหน้าจอการโหลดภายใต้โฆษณาเปิดแอป และหน้าจอการโหลด
โหลดเสร็จก่อนที่จะปิดโฆษณา คุณอาจต้องปิดหน้าจอการโหลดใน
adDidDismissFullScreenContent
วิธี
ตัวอย่างที่สมบูรณ์ใน GitHub
ขั้นตอนถัดไป
ดูข้อมูลเพิ่มเติมเกี่ยวกับความเป็นส่วนตัวของผู้ใช้