Uygulama açılış reklamları, uygulama yükleme ekranlarından para kazanmak isteyen yayıncılar için tasarlanmış özel bir reklam biçimidir. Uygulama açılış reklamları, kullanıcılar uygulamanızı ön plana getirdiğinde gösterilmek üzere tasarlanmıştır ve istendiği zaman kapatılabilir.
Uygulama açılış reklamları, kullanıcılara uygulamanızda olduklarını hatırlatmak için otomatik olarak küçük bir marka alanı gösterir. Aşağıda uygulama açılış reklamının nasıl göründüğüne dair bir örnek verilmiştir:
Ön koşullar
- Flutter eklentisi 0.13.6 veya sonraki sürümler.
- Başlayın bölümünü tamamlayın. Flutter uygulamanızda Google Mobil Reklamlar Flutter eklentisi içe aktarılmış olmalıdır.
Her zaman test reklamlarıyla test yapın
Uygulamalarınızı oluşturup test ederken canlı yayınlanan üretim reklamları yerine test reklamlarını kullandığınızdan emin olun. Bu işlemi yapmazsanız hesabınız askıya alınabilir.
Test reklamlarını yüklemenin en kolay yolu, Android ve iOS ödüllü reklamları için özel test reklam birimi kimliklerimizi kullanmaktır:
Android
ca-app-pub-3940256099942544/9257395921
iOS
ca-app-pub-3940256099942544/5575463023
Bu kimlikler, her istek için test reklamları döndürecek şekilde özel olarak yapılandırılmıştır. Kodlama, test etme ve hata ayıklama sırasında bunları kendi uygulamalarınızda kullanabilirsiniz. Uygulamanızı yayınlamadan önce bunları kendi reklam birimi kimliğinizle değiştirdiğinizden emin olun.
Uygulama
Uygulama açılış reklamlarını entegre etmenin temel adımları şunlardır:
- Reklamı göstermeniz gerekmeden önce yükleyen bir yardımcı sınıf oluşturun.
- Reklam yükleyin.
- Geri arama için kaydolun ve reklamı gösterin.
- Ön plana getirme etkinlikleri sırasında reklamı göstermek için
AppStateEventNotifier.appStateStream
'e abone olun.
Yardımcı sınıf oluşturma
Reklamı yüklemek için AppOpenAdManager
adlı yeni bir sınıf oluşturun. Bu sınıf, yüklenen bir reklamı ve her platform için reklam birimi kimliğini takip etmek üzere bir örnek değişkeni yönetir.
import 'package:google_mobile_ads/google_mobile_ads.dart';
import 'dart:io' show Platform;
class AppOpenAdManager {
String adUnitId = Platform.isAndroid
? 'ca-app-pub-3940256099942544/9257395921'
: 'ca-app-pub-3940256099942544/5575463023';
AppOpenAd? _appOpenAd;
bool _isShowingAd = false;
/// Load an AppOpenAd.
void loadAd() {
// We will implement this below.
}
/// Whether an ad is available to be shown.
bool get isAdAvailable {
return _appOpenAd != null;
}
}
Reklam yükleme
Uygulama açılış reklamınız, kullanıcılar uygulamanıza girmeden önce hazır olmalıdır. Reklamı göstermeniz gereken zamandan önce reklam istekleri göndermek için bir yardımcı sınıf uygulayın.
Reklam yükleme işlemi, AppOpenAd
sınıfındaki load
yöntemi kullanılarak gerçekleştirilir. Yükleme yöntemi için bir reklam birimi kimliği, bir yön modu, bir AdRequest
nesnesi ve reklam yükleme işlemi başarılı olduğunda veya başarısız olduğunda çağrılan bir tamamlanma işleyicisi gerekir. Yüklenen AppOpenAd
nesnesi, tamamlanma işleyicide parametre olarak sağlanır. Aşağıdaki örnekte bir AppOpenAd
dosyasının nasıl yükleneceği gösterilmektedir.
public class AppOpenAdManager {
...
/// Load an AppOpenAd.
void loadAd() {
AppOpenAd.load(
adUnitId: adUnitId,
adRequest: AdRequest(),
adLoadCallback: AppOpenAdLoadCallback(
onAdLoaded: (ad) {
_appOpenAd = ad;
},
onAdFailedToLoad: (error) {
print('AppOpenAd failed to load: $error');
// Handle the error.
},
),
);
}
}
Reklamı gösterme ve tam ekran geri çağırmalarını işleme
Reklamı göstermeden önce, dinlemek istediğiniz her reklam etkinliği için bir FullScreenContentCallback
kaydedin.
public class AppOpenAdManager {
...
public void showAdIfAvailable() {
if (!isAdAvailable) {
print('Tried to show ad before available.');
loadAd();
return;
}
if (_isShowingAd) {
print('Tried to show ad while already showing an ad.');
return;
}
// Set the fullScreenContentCallback and show the ad.
_appOpenAd!.fullScreenContentCallback = FullScreenContentCallback(
onAdShowedFullScreenContent: (ad) {
_isShowingAd = true;
print('$ad onAdShowedFullScreenContent');
},
onAdFailedToShowFullScreenContent: (ad, error) {
print('$ad onAdFailedToShowFullScreenContent: $error');
_isShowingAd = false;
ad.dispose();
_appOpenAd = null;
},
onAdDismissedFullScreenContent: (ad) {
print('$ad onAdDismissedFullScreenContent');
_isShowingAd = false;
ad.dispose();
_appOpenAd = null;
loadAd();
},
);
}
}
Bir kullanıcı, uygulama açma reklamını tıklayarak uygulamanızdan ayrıldıktan sonra geri dönerse başka bir uygulama açma reklamı görmediğinden emin olun.
Uygulamanın ön plana getirilmesi etkinliklerini dinleme
Uygulama ön plana getirme etkinliklerinden haberdar olmak için AppStateEventNotifier.appStateStream
öğesine abone olmanız ve foreground
etkinliklerini dinlemeniz gerekir.
import 'package:app_open_example/app_open_ad_manager.dart';
import 'package:google_mobile_ads/google_mobile_ads.dart';
/// Listens for app foreground events and shows app open ads.
class AppLifecycleReactor {
final AppOpenAdManager appOpenAdManager;
AppLifecycleReactor({required this.appOpenAdManager});
void listenToAppStateChanges() {
AppStateEventNotifier.startListening();
AppStateEventNotifier.appStateStream
.forEach((state) => _onAppStateChanged(state));
}
void _onAppStateChanged(AppState appState) {
// Try to show an app open ad if the app is being resumed and
// we're not already showing an app open ad.
if (appState == AppState.foreground) {
appOpenAdManager.showAdIfAvailable();
}
}
}
Artık AppLifecycleReactor
öğenizi başlatabilir ve uygulama yaşam döngüsü değişikliklerini dinlemeye başlayabilirsiniz. Örneğin, ana sayfanızdan:
import 'package:app_open_example/app_open_ad_manager.dart';
import 'package:flutter/material.dart';
import 'package:google_mobile_ads/google_mobile_ads.dart';
import 'app_lifecycle_reactor.dart';
void main() {
WidgetsFlutterBinding.ensureInitialized();
MobileAds.instance.initialize();
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'App Open Example',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'App Open Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key? key, required this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
/// Example home page for an app open ad.
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
late AppLifecycleReactor _appLifecycleReactor;
@override
void initState() {
super.initState();
AppOpenAdManager appOpenAdManager = AppOpenAdManager()..loadAd();
_appLifecycleReactor = AppLifecycleReactor(
appOpenAdManager: appOpenAdManager);
}
Reklam geçerlilik süresini göz önünde bulundurma
Geçerlilik süresi dolan bir reklamı göstermediğinizden emin olmak için AppOpenAdManager
öğesine bir zaman damgası ekleyin. Böylece reklamınızın yüklenmesinden bu yana ne kadar süre geçtiğini kontrol edebilirsiniz.
Ardından, reklamın hâlâ geçerli olup olmadığını kontrol etmek için bu zaman damgasını kullanın.
/// Utility class that manages loading and showing app open ads.
class AppOpenAdManager {
...
/// Maximum duration allowed between loading and showing the ad.
final Duration maxCacheDuration = Duration(hours: 4);
/// Keep track of load time so we don't show an expired ad.
DateTime? _appOpenLoadTime;
...
/// Load an AppOpenAd.
void loadAd() {
AppOpenAd.load(
adUnitId: adUnitId,
orientation: AppOpenAd.orientationPortrait,
adRequest: AdRequest(),
adLoadCallback: AppOpenAdLoadCallback(
onAdLoaded: (ad) {
print('$ad loaded');
_appOpenLoadTime = DateTime.now();
_appOpenAd = ad;
},
onAdFailedToLoad: (error) {
print('AppOpenAd failed to load: $error');
},
),
);
}
/// Shows the ad, if one exists and is not already being shown.
///
/// If the previously cached ad has expired, this just loads and caches a
/// new ad.
void showAdIfAvailable() {
if (!isAdAvailable) {
print('Tried to show ad before available.');
loadAd();
return;
}
if (_isShowingAd) {
print('Tried to show ad while already showing an ad.');
return;
}
if (DateTime.now().subtract(maxCacheDuration).isAfter(_appOpenLoadTime!)) {
print('Maximum cache duration exceeded. Loading another ad.');
_appOpenAd!.dispose();
_appOpenAd = null;
loadAd();
return;
}
// Set the fullScreenContentCallback and show the ad.
_appOpenAd!.fullScreenContentCallback = FullScreenContentCallback(...);
_appOpenAd!.show();
}
}
Soğuk başlatmalar ve yükleme ekranları
Şu ana kadarki dokümanlarda, uygulama açılış reklamlarını yalnızca kullanıcılar bellekte askıya alınmış olan uygulamanızı ön plana getirdiğinde gösterdiğiniz varsayılmaktadır. "Sıfırdan başlatma", uygulamanız başlatıldığında ancak daha önce bellekte askıya alınmadığında gerçekleşir.
Sıfırdan başlatmaya örnek olarak, kullanıcının uygulamanızı ilk kez açması verilebilir. Sıfırdan başlatma durumunda, daha önce yüklenmiş ve hemen gösterilmeye hazır bir uygulama açılış reklamınız olmaz. Reklam isteğinde bulunmanız ile reklam yanıtı almanız arasındaki gecikme, kullanıcıların bağlam dışı bir reklamla karşılaşmadan önce uygulamanızı kısa bir süre kullanabildiği bir durum yaratabilir. Bu durum kötü bir kullanıcı deneyimi olduğundan kaçınılmalıdır.
Uygulama açılış reklamlarını baştan başlatma sırasında kullanmanın tercih edilen yolu, oyununuzu veya uygulama öğelerinizi yüklemek için bir yükleme ekranı kullanmak ve reklamı yalnızca yükleme ekranında göstermektir. Uygulamanızın yüklenmesi tamamlandıysa ve kullanıcı uygulamanızın ana içeriğine yönlendirildiyse reklamı göstermeyin.
En iyi uygulamalar
Uygulama açılış reklamları, uygulama ilk kez başlatıldığında ve uygulamalar arasında geçiş yapılırken uygulamanızın yükleme ekranından para kazanmanıza yardımcı olur. Ancak kullanıcılarınızın uygulamanızı keyifle kullanabilmesi için en iyi uygulamaları göz önünde bulundurmanız önemlidir. En iyi uygulama şunlardır:
- Kullanıcılarınız uygulamanızı birkaç defa kullandıktan sonra ilk uygulama açılış reklamınızı gösterin.
- Uygulama açılış reklamlarını, kullanıcılarınızın uygulamanızın yüklenmesini bekleyeceği zamanlarda gösterin.
- Uygulama açılış reklamının altında yükleme ekranınız varsa ve reklam kapatılmadan önce yükleme ekranınızın yüklenmesi tamamlanırsa, yükleme ekranınızı
onAdDismissedFullScreenContent
etkinlik işleyicisinde kapatmayı deneyebilirsiniz.