Panduan ini ditujukan untuk penayang yang mengintegrasikan iklan di layar pembuka aplikasi.
Iklan di layar pembuka aplikasi adalah format iklan khusus yang ditujukan untuk penayang yang ingin memonetisasi layar pemuatan aplikasi mereka. Iklan di layar pembuka aplikasi dapat ditutup oleh pengguna Anda kapan saja. Iklan di layar pembuka aplikasi dapat ditampilkan saat pengguna menampilkan aplikasi ke latar depan.
Iklan di layar pembuka aplikasi otomatis menampilkan area branding kecil sehingga pengguna tahu bahwa mereka ada di aplikasi Anda. Berikut contoh tampilan iklan di layar pembuka aplikasi:
Berikut adalah langkah-langkah yang diperlukan untuk menerapkan iklan di layar pembuka aplikasi secara umum:
- Buat class pengelola yang memuat iklan sebelum Anda perlu menampilkannya.
- Menampilkan tambahan selama peristiwa latar depan aplikasi.
- Menangani callback presentasi.
Prasyarat
- Ikuti petunjuk penyiapan di Panduan Memulai.
- Ketahui cara mengonfigurasi perangkat sebagai perangkat pengujian.
Selalu uji dengan iklan percobaan
Saat mem-build dan menguji aplikasi, pastikan Anda menggunakan iklan percobaan, bukan iklan produksi langsung. Jika Anda tidak melakukannya, akun Anda dapat ditangguhkan.
Cara termudah untuk memuat iklan percobaan adalah dengan menggunakan ID unit iklan percobaan khusus untuk iklan di layar pembuka aplikasi:
/21775744923/example/app-open
Iklan ini telah dikonfigurasi secara khusus untuk menampilkan iklan pengujian untuk setiap permintaan, dan Anda dapat menggunakannya di aplikasi Anda sendiri saat melakukan coding, pengujian, dan proses debug. Pastikan saja Anda menggantinya dengan ID unit iklan Anda sendiri sebelum memublikasikan aplikasi.
Untuk informasi selengkapnya tentang cara kerja iklan percobaan Mobile Ads SDK, lihat Iklan Percobaan.
Mengimplementasikan class pengelola
Iklan Anda akan ditampilkan dengan cepat, jadi sebaiknya muat iklan sebelum Anda perlu menampilkannya. Dengan begitu, iklan Anda akan siap ditayangkan begitu pengguna masuk ke aplikasi. Terapkan kelas pengelola untuk membuat permintaan iklan sebelum Anda perlu menampilkan iklan.
Buat class singleton baru bernama AppOpenAdManager
dan isi dengan cara berikut:
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
Memuat iklan
Langkah berikutnya adalah mengisi metode 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;
}];
}
Menampilkan iklan
Langkah berikutnya adalah mengisi metode showAdIfAvailable()
. Jika tidak ada iklan
yang tersedia, metode akan mencoba memuat iklan.
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];
}
Menampilkan iklan selama peristiwa latar depan aplikasi
Saat aplikasi menjadi aktif, panggil showAdIfAvailable()
untuk menampilkan iklan jika
tersedia, atau memuat iklan baru.
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
Menangani callback presentasi
Saat aplikasi menampilkan iklan di layar pembuka aplikasi, Anda harus mengandalkan
GADFullScreenContentDelegate
untuk menangani peristiwa presentasi tertentu. Secara
khusus, Anda sebaiknya meminta iklan di layar pembuka aplikasi berikutnya setelah iklan pertama
selesai ditampilkan.
Di class AppOpenAdManager
, tambahkan kode berikut:
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
Pertimbangkan waktu berakhir iklan
Untuk memastikan Anda tidak menampilkan iklan yang masa berlakunya sudah habis, Anda dapat menambahkan metode ke delegasi aplikasi yang memeriksa waktu yang telah berlalu sejak referensi iklan dimuat.
Di AppOpenAdManager
, tambahkan properti Date
yang disebut loadTime
dan tetapkan properti tersebut saat iklan Anda dimuat. Anda kemudian dapat menambahkan metode yang menampilkan true
jika
kurang dari jumlah jam tertentu telah berlalu sejak iklan Anda dimuat. Pastikan
Anda memeriksa validitas referensi iklan sebelum mencoba menampilkan iklan.
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 dan layar pemuatan
Dokumentasi mengasumsikan bahwa Anda hanya menampilkan iklan di layar pembuka aplikasi saat pengguna menampilkan aplikasi Anda di latar depan saat ditangguhkan dalam memori. "Cold start" terjadi saat aplikasi Anda diluncurkan, tetapi sebelumnya tidak ditangguhkan dalam memori.
Contoh cold start adalah saat pengguna membuka aplikasi Anda untuk pertama kalinya. Dengan cold start, Anda tidak akan memiliki iklan di layar pembuka aplikasi yang dimuat sebelumnya yang siap ditampilkan langsung. Penundaan antara saat Anda meminta iklan dan menerima iklan kembali dapat menciptakan situasi saat pengguna dapat menggunakan aplikasi Anda sebentar sebelum terkejut dengan iklan yang tidak sesuai konteks. Hal ini harus dihindari karena merupakan pengalaman pengguna yang buruk.
Cara yang lebih disukai untuk menggunakan iklan di layar pembuka aplikasi pada cold start adalah menggunakan layar pemuatan untuk memuat aset game atau aplikasi, dan hanya menampilkan iklan dari layar pemuatan. Jika aplikasi Anda telah selesai dimuat dan telah mengarahkan pengguna ke konten utama aplikasi, jangan tampilkan iklan.
Praktik terbaik
Google membuat iklan di layar pembuka aplikasi untuk membantu Anda memonetisasi layar pemuatan aplikasi, tetapi penting untuk selalu mengingat praktik terbaik agar pengguna senang menggunakan aplikasi Anda. Pastikan untuk:
- Tunggu hingga pengguna menggunakan aplikasi Anda beberapa kali sebelum menampilkan iklan di layar pembuka aplikasi pertama.
- Tampilkan iklan di layar pembuka aplikasi selama pengguna menunggu aplikasi Anda dimuat.
- Jika Anda memiliki layar pemuatan di bawah iklan di layar pembuka aplikasi, dan layar pemuatan
selesai dimuat sebelum iklan ditutup, sebaiknya hapus
layar pemuatan dalam metode
adDidDismissFullScreenContent
.
Contoh lengkap di GitHub
Langkah berikutnya
Pelajari privasi pengguna lebih lanjut.