โฆษณาเปิดแอปจะปรากฏขึ้นเมื่อผู้ใช้เปิดหรือกลับมาที่แอปของคุณ โดยผู้ใช้จะปิดโฆษณาเปิดแอปได้ทุกเมื่อ หากต้องการสร้างรายได้จากหน้าจอโหลดแอป ให้ใช้โฆษณาเปิดแอป ดูรายละเอียดได้ที่คำแนะนำและแนวทางปฏิบัติแนะนำสำหรับโฆษณาเปิดแอป
คู่มือนี้อธิบายวิธีผสานรวมโฆษณาเปิดแอปเข้ากับแอป React Native
ข้อกำหนดเบื้องต้น
โปรดทำสิ่งต่อไปนี้ก่อนดำเนินการต่อ
- ตั้งค่า Google Mobile Ads SDK for React Native
- เปิดใช้โฆษณาทดสอบและใช้หน่วยโฆษณาทดสอบต่อไปนี้
Android
ca-app-pub-3940256099942544/9257395921
iOS
ca-app-pub-3940256099942544/5575463023
ทำความเข้าใจการโหลดโฆษณาล่วงหน้า
การโหลดโฆษณาล่วงหน้าใน Google Mobile Ads SDK for React Native จะโหลดและแคชโฆษณาโดยอัตโนมัติ
การโหลดโฆษณาล่วงหน้ามีประโยชน์ดังนี้
- การจัดการข้อมูลอ้างอิง: เก็บข้อมูลอ้างอิงไว้จนกว่าโฆษณาจะแสดง
- การโหลดซ้ำอัตโนมัติ: โหลดโฆษณาใหม่เมื่อดึงโฆษณาจากแคช
- การลองใหม่ที่มีการจัดการ: โหลดโฆษณาใหม่เมื่อโหลดโฆษณาไม่สำเร็จ
- การจัดการการหมดอายุ: รีเฟรชโฆษณาก่อนหมดอายุ
- การเพิ่มประสิทธิภาพแคช: เพิ่มประสิทธิภาพลำดับแคชเพื่อแสดงโฆษณาที่มีลำดับความสำคัญสูงสุด
หากต้องการโหลดโฆษณาด้วยตนเอง โปรดดูคู่มือโหลดโฆษณาเปิดแอปรายการเดียว
เริ่มโหลดล่วงหน้า
หากต้องการเริ่มโหลดโฆษณาล่วงหน้า ให้เรียกใช้เมธอด AppOpenAdPreloader.start และส่งค่า preloadId, การตั้งค่า และ Callback ของเหตุการณ์เพื่อตรวจสอบการเปลี่ยนแปลงสถานะบัฟเฟอร์ ดังนี้
export function startAppOpenAdPreloader(
adUnitId: string,
preloadId: string,
customPreloadCallback?: PreloadCallback,
): boolean {
const started = AppOpenAdPreloader.start(
preloadId,
{
request: {adUnitId},
bufferSize: 2,
},
{
// Called when an ad is preloaded into the buffer.
onAdPreloaded: (event) => {
console.log(`App open ad preloaded for ${event.preloadId}`);
customPreloadCallback?.onAdPreloaded?.(event);
},
// Called when an ad fails to preload.
onAdFailedToPreload: (error: LoadAdError) => {
console.error('Failed to preload app open ad:', error.message);
customPreloadCallback?.onAdFailedToPreload?.(error);
},
// Called when all preloaded ads in the buffer have been shown.
onAdsExhausted: () => {
console.log('App open ad buffer exhausted.');
customPreloadCallback?.onAdsExhausted?.();
},
},
);
return started;
}
preloadId คือสตริงที่ระบุการกำหนดค่าการโหลดโฆษณาล่วงหน้าโดยไม่ซ้ำกัน หากใช้ adUnitId สำหรับการกำหนดค่าการโหลดล่วงหน้าเพียงรายการเดียวในแอป คุณสามารถใช้รหัสหน่วยโฆษณานั้นเป็นรหัสการโหลดล่วงหน้าได้ หากแอปของคุณต้องใช้ตัวโหลดล่วงหน้าหลายตัวสำหรับรหัสหน่วยโฆษณาเดียวกัน ให้ส่งสตริงที่แตกต่างกันสำหรับรหัสการโหลดล่วงหน้าแต่ละรหัส
เมื่อแอปของคุณดึงโฆษณาที่โหลดไว้ล่วงหน้าจากบัฟเฟอร์ Google Mobile Ads SDK for React Native จะขอโฆษณาทดแทนในเบื้องหลังเพื่อเติมบัฟเฟอร์อีกครั้ง หากไม่มีโฆษณาที่โหลดไว้ล่วงหน้าเหลืออยู่ในบัฟเฟอร์ Google Mobile Ads SDK for React Native จะเรียกใช้ Callback onAdsExhausted
ขีดจำกัดแคชที่โหลดล่วงหน้า
Google Mobile Ads SDK for React Native บังคับใช้ขีดจำกัดทั่วทั้งแอปสำหรับจำนวนโฆษณาที่โหลดไว้ล่วงหน้าทั้งหมด ดังนี้
- ขีดจำกัดเริ่มต้น: Google จะเก็บโฆษณาที่โหลดไว้ล่วงหน้าไว้ในหน่วยความจำได้สูงสุด 6 รายการ
- เราขอแนะนำให้ใช้ขนาดบัฟเฟอร์เป็น 2 สำหรับรหัสการโหลดล่วงหน้าแต่ละรหัส
หากแอปถึงขีดจำกัดทั่วทั้งแอป คำขอในเบื้องหลังสำหรับโฆษณาที่โหลดไว้ล่วงหน้าจะหยุดชั่วคราวจนกว่าโฆษณาที่มีอยู่จะได้รับการสำรวจและแสดงหรือทำลาย
สำรวจและแสดงโฆษณา
หากต้องการตรวจสอบโฆษณาที่โหลดไว้ล่วงหน้าซึ่งพร้อมใช้งานและดึงข้อมูลอินสแตนซ์โฆษณา ให้เรียกใช้เมธอด AppOpenAdPreloader.pollAd
หากต้องการฟังเหตุการณ์การนำเสนอแบบเต็มหน้าจอ ให้ลงทะเบียน Callback ในพร็อพเพอร์ตี้ adEventCallback ของอินสแตนซ์ AppOpenAd ที่แสดงผลก่อนเรียกใช้เมธอด show ดังนี้
export function showPreloadedAppOpenAd(
preloadId: string,
customAdEventCallback?: FullScreenAdEventCallback,
) {
if (!AppOpenAdPreloader.isAdAvailable(preloadId)) {
console.log('No preloaded app open ad available right now.');
return;
}
const ad = AppOpenAdPreloader.pollAd(preloadId);
if (!ad) {
return;
}
ad.adEventCallback = {
// Called when the ad is presented on screen.
onAdShowedFullScreenContent: () => {
console.log('Preloaded app open ad showed full screen content.');
customAdEventCallback?.onAdShowedFullScreenContent?.();
},
// Called when the ad is closed by the user.
onAdDismissedFullScreenContent: () => {
console.log('Preloaded app open ad dismissed full screen content.');
customAdEventCallback?.onAdDismissedFullScreenContent?.();
ad.destroy();
},
// Called when presentation fails.
onAdFailedToShowFullScreenContent: (error) => {
console.error('Failed to show preloaded app open ad:', error);
customAdEventCallback?.onAdFailedToShowFullScreenContent?.(error);
ad.destroy();
},
// Called when an impression is recorded.
onAdImpression: () => {
console.log('Preloaded app open ad recorded an impression.');
customAdEventCallback?.onAdImpression?.();
},
// Called when the user taps the ad.
onAdClicked: () => {
console.log('Preloaded app open ad was clicked.');
customAdEventCallback?.onAdClicked?.();
},
// Called when the ad is estimated to have earned money.
onAdPaid: (adValue) => {
console.log(
`Preloaded app open ad paid: ${adValue.amountMicros}` +
` ${adValue.currencyCode}`,
);
customAdEventCallback?.onAdPaid?.(adValue);
},
};
ad.show();
}
หากต้องการปล่อยหน่วยความจำและทรัพยากร ให้เรียกใช้เมธอด ad.destroy ใน Callback onAdDismissedFullScreenContent และ onAdFailedToShowFullScreenContent เมื่อผู้ใช้ปิดโฆษณาหรือโฆษณาไม่แสดง
อ่านข้อมูลการตอบกลับ
หากต้องการตรวจสอบรายละเอียดของโฆษณาที่โหลดไว้ล่วงหน้าถัดไปโดยไม่นำโฆษณาออกจากแคช ให้เรียกใช้เมธอด AppOpenAdPreloader.peekAdResponseInfo ดังนี้
export function peekAppOpenAdResponseInfo(
preloadId: string,
): ResponseInfo | null {
const responseInfo = AppOpenAdPreloader.peekAdResponseInfo(preloadId);
if (responseInfo) {
console.log('Next preloaded app open ad response info:', responseInfo);
}
return responseInfo;
}
จัดการโฆษณาเปิดแอปด้วยเครื่องมือจัดการระดับแอป
เนื่องจากโฆษณาเปิดแอปจะแสดงทั่วโลกในระหว่างการเปิดแอปและการเปลี่ยนไปใช้แอปที่ทำงานอยู่เบื้องหน้า เราขอแนะนำให้จัดการสถานะวงจรของ Preloader ในเครื่องมือจัดการระดับแอปนอกแผนผังคอมโพเนนต์ React
การใช้เครื่องมือจัดการระดับแอปมีข้อดีหลักๆ หลายประการดังนี้
- ทำให้สถานะของตัวโหลดล่วงหน้าเป็นอิสระจากการนำทางหน้าจอและวงจรของคอมโพเนนต์แต่ละรายการ
- รวมศูนย์ Callback ของเหตุการณ์โฆษณา การติดตามสถานะ และการล้างข้อมูลไว้ในอินสแตนซ์ที่ใช้ร่วมกันรายการเดียวในแอป
- ควบคุมเวลาที่ระบบจะฟังเหตุการณ์การนำแอปไปไว้เบื้องหน้า เพื่อป้องกันไม่ให้มีการนำเสนอซ้ำเมื่อปิดโฆษณา
ตัวอย่างต่อไปนี้ใช้เครื่องมือจัดการระดับแอปโดยใช้ออบเจ็กต์ AppOpenAdPreloader
export class AppOpenAdManager {
private adUnitId: string;
private preloadId: string;
private appStateSubscription?: NativeEventSubscription;
private startTimeoutId?: ReturnType<typeof setTimeout>;
constructor(adUnitId: string, preloadId: string) {
this.adUnitId = adUnitId;
this.preloadId = preloadId;
}
start(): boolean {
if (!AppOpenAdPreloader.getConfiguration(this.preloadId)) {
AppOpenAdPreloader.start(
this.preloadId,
{
request: {adUnitId: this.adUnitId},
bufferSize: 2,
},
{
onAdPreloaded: (event) => {
console.log(`App open ad preloaded for ${event.preloadId}`);
},
onAdFailedToPreload: (error: LoadAdError) => {
console.error('Failed to preload app open ad:', error.message);
},
onAdsExhausted: () => {
console.log('App open ad buffer exhausted.');
},
},
);
}
if (!this.appStateSubscription && !this.startTimeoutId) {
// Delay attaching the listener to ensure native dismissal transitions complete
this.startTimeoutId = setTimeout(() => {
this.startTimeoutId = undefined;
if (!this.appStateSubscription) {
this.appStateSubscription = AppState.addEventListener(
'change',
(nextAppState: AppStateStatus) => {
if (nextAppState === 'active') {
this.showAdIfAvailable();
}
},
);
}
}, APP_STATE_LISTENER_DELAY_MS);
}
return true;
}
pause(): void {
if (this.startTimeoutId) {
clearTimeout(this.startTimeoutId);
this.startTimeoutId = undefined;
}
this.appStateSubscription?.remove();
this.appStateSubscription = undefined;
}
stop(): void {
this.pause();
AppOpenAdPreloader.destroy(this.preloadId);
}
showAdIfAvailable() {
if (!AppOpenAdPreloader.isAdAvailable(this.preloadId)) {
console.log('App open ad is not preloaded or available right now.');
return;
}
const ad = AppOpenAdPreloader.pollAd(this.preloadId);
if (!ad) {
return;
}
// Pause listener while presenting the ad
this.pause();
ad.adEventCallback = {
onAdShowedFullScreenContent: () => {
console.log('Preloaded app open ad showed full screen content.');
},
onAdDismissedFullScreenContent: () => {
console.log('Preloaded app open ad dismissed full screen content.');
ad.destroy();
this.start();
},
onAdFailedToShowFullScreenContent: (error) => {
console.error('Failed to show preloaded app open ad:', error);
ad.destroy();
this.start();
},
};
ad.show();
}
}
รอเหตุการณ์การนำแอปไปไว้เบื้องหน้า
หากต้องการแสดงโฆษณาเมื่อแอปกลับมาทำงานอยู่เบื้องหน้า ให้ลงทะเบียน Listener change ในโมดูล AppState ในคอมโพเนนต์รูทของแอป เช่น App.tsx ตรวจสอบเมื่อสถานะเปลี่ยนเป็น active
เช่น เรียกใช้เมธอด start ในอินสแตนซ์ตัวจัดการโฆษณาในคอมโพเนนต์ App.tsx
การแสดงหน้าต่างซ้อนทับโฆษณาหรือหน้า Landing Page เช่น การแสดงโฆษณาแบบเต็มหน้าจอหรือการแตะโฆษณาแบนเนอร์ จะทำให้แอปพลิเคชันของคุณทำงานอยู่เบื้องหลัง เมื่อผู้ใช้กลับมาที่แอปพลิเคชัน แอปจะได้รับเหตุการณ์สถานะ active ใหม่ เพื่อป้องกันการนำเสนอโฆษณาหรือการวนซ้ำโดยไม่ตั้งใจ ซึ่งการกลับมาจากโฆษณาจะแสดงโฆษณาเปิดแอปจากแคช ให้ทำดังนี้
- นำ Listener เหตุการณ์
AppStateออกก่อนแสดงโฆษณาแบบเต็มหน้าจอ - หากต้องการให้แน่ใจว่าการฟังจะกลับมาทำงานอีกครั้งไม่ว่าผู้ใช้จะปิดโฆษณาหรือโฆษณาไม่แสดง ให้เพิ่ม Listener เหตุการณ์
AppStateอีกครั้งใน CallbackonAdDismissedFullScreenContentและonAdFailedToShowFullScreenContent
ดูตัวอย่างที่สมบูรณ์ของการควบคุมเวลาที่หยุดชั่วคราวและกลับมาทำงานต่อของ Listener เหตุการณ์ที่ทำงานอยู่เบื้องหน้าได้ที่การติดตั้งใช้งาน AppOpenAdManager
ดูข้อมูลเกี่ยวกับ Cold Start และหน้าจอการโหลด
Cold Start เกิดขึ้นเมื่อแอปของคุณเปิดขึ้นใหม่ตั้งแต่ต้น เช่น เมื่อผู้ใช้เปิดแอปเป็นครั้งแรกหรือหลังจากที่อุปกรณ์ปิดแอปเพื่อเพิ่มหน่วยความจำ ในระหว่างการเริ่มแอปแบบ Cold Start คุณจะไม่มีโฆษณาเปิดแอปที่โหลดไว้ก่อนหน้านี้เพื่อแสดงในครั้งถัดไป
เนื่องจากความล่าช้าของคำขอโฆษณา ผู้ใช้อาจโต้ตอบกับแอปก่อนที่โฆษณาจะปรากฏ แสดงโฆษณาเปิดแอปใน Cold Start จากหน้าจอการโหลดเท่านั้นขณะที่โหลดชิ้นงานของแอป หากชิ้นงานโหลดเสร็จและผู้ใช้เข้าถึงเนื้อหาหลักก่อนที่การโหลดโฆษณาจะเสร็จสิ้น ก็ไม่ต้องแสดงโฆษณา
ล้างทรัพยากร
เมื่อไม่จำเป็นต้องโหลดล่วงหน้าสำหรับหน้าจอหรือรหัสหน่วยโฆษณาอีกต่อไป เช่น เมื่อออกจากหน้าจอที่โหลดโฆษณาล่วงหน้า ให้เรียกใช้เมธอด AppOpenAdPreloader.destroy เพื่อปล่อยทรัพยากรของตัวโหลดล่วงหน้าและป้องกันไม่ให้เก็บออบเจ็กต์โฆษณาที่ไม่ได้ใช้ไว้ในหน่วยความจำ
export function destroyAppOpenAdPreloader(preloadId: string) {
AppOpenAdPreloader.destroy(preloadId);
}
นอกจากการทำลายคิวของตัวโหลดล่วงหน้าแล้ว อย่าลืมทำลายอินสแตนซ์โฆษณาที่สำรวจแต่ละรายการเมื่อผู้ใช้ปิดโฆษณาหรือโฆษณาไม่แสดง โปรดดูรายละเอียดที่หัวข้อตรวจสอบและแสดงโฆษณา
ดูตัวอย่างแบบเต็ม
คอมโพเนนต์ตัวอย่างต่อไปนี้จะเริ่มโหลดล่วงหน้าเมื่อต่อเชื่อม ติดตามจำนวนโฆษณาที่พร้อมใช้งาน และให้การควบคุมเพื่อแสดงโฆษณาเปิดแอปที่โหลดล่วงหน้า
แทนที่ค่าต่อไปนี้
- APP_OPEN_AD_UNIT_ID ด้วยรหัสหน่วยโฆษณา
- PRELOAD_ID ด้วยรหัส Preloader
ขั้นตอนถัดไป
หลังจากผสานรวมโฆษณาเปิดแอปแล้ว ให้สำรวจหัวข้อต่อไปนี้