Gli annunci apertura app sono un formato speciale destinato ai publisher che vogliono monetizzare le schermate di caricamento delle app. Gli annunci apertura app possono essere chiusi in qualsiasi momento e sono progettati per essere mostrati quando gli utenti portano la tua app in primo piano.
Gli annunci apertura app mostrano automaticamente una piccola area di branding, in modo che gli utenti sappiano di essere all'interno della tua app. Ecco un esempio di annuncio apertura app:
Prerequisiti
- Plugin Flutter 0.13.6 o versioni successive.
- Completa Inizia. Il plug-in Flutter di Google Mobile Ads dovrebbe essere già stato importato nella tua app Flutter.
Esegui sempre test con annunci di prova
Quando crei e testi le tue app, assicurati di utilizzare annunci di prova anziché annunci pubblicati in produzione. In caso contrario, il tuo account potrebbe essere sospeso.
Il modo più semplice per caricare gli annunci di prova è utilizzare i nostri ID unità pubblicitarie di prova dedicati per gli annunci con premio per Android e iOS:
/21775744923/example/app-open
Sono stati configurati appositamente per restituire annunci di prova per ogni richiesta e puoi utilizzarli liberamente nelle tue app durante la programmazione, i test e il debug. Assicurati solo di sostituirli con il tuo ID unità pubblicitaria prima di pubblicare la tua app.
Implementazione
I passaggi principali per integrare gli annunci di apertura dell'app sono:
- Crea una classe di utilità che carichi un annuncio prima che tu debba mostrarlo.
- Carica un annuncio.
- Registrati per i callback e mostra l'annuncio.
- Abbonati a
AppStateEventNotifier.appStateStream
per mostrare l'annuncio durante gli eventi in primo piano.
Creare una classe di utilità
Crea una nuova classe denominata AppOpenAdManager
per caricare l'annuncio. Questa classe gestisce
una variabile di istanza per tenere traccia di un annuncio caricato e dell'ID unità pubblicitaria per ogni
piattaforma.
import 'package:google_mobile_ads/google_mobile_ads.dart';
import 'dart:io' show Platform;
class AppOpenAdManager {
String adUnitId = '/21775744923/example/app-open';
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;
}
}
Carica un annuncio
L'annuncio apertura app deve essere pronto prima che gli utenti accedano alla tua app. Implementa una classe di utilità per effettuare richieste di annunci prima di quando devi mostrare l'annuncio.
Il caricamento di un annuncio viene eseguito utilizzando il metodo loadWithAdManagerAdRequest
nella classe AppOpenAd
. Il metodo load richiede un ID unità pubblicitaria, una modalità di orientamento, un oggetto AdManagerAdRequest
e un gestore di completamento che viene chiamato quando il caricamento dell'annuncio va a buon fine o non va a buon fine. L'oggetto caricato
AppOpenAd
viene fornito come parametro nel gestore di completamento. L'esempio seguente mostra come caricare un AppOpenAd
.
public class AppOpenAdManager {
...
/// Load an AppOpenAd.
void loadAd() {
AppOpenAd.loadWithAdManagerAdRequest(
adUnitId: adUnitId,
adManagerAdRequest: AdManagerAdRequest(),
adLoadCallback: AppOpenAdLoadCallback(
onAdLoaded: (ad) {
_appOpenAd = ad;
},
onAdFailedToLoad: (error) {
print('AppOpenAd failed to load: $error');
// Handle the error.
},
),
);
}
}
Mostrare l'annuncio e gestire i callback a schermo intero
Prima di mostrare l'annuncio, registra un FullScreenContentCallback
per ogni evento correlato all'annuncio che vuoi ascoltare.
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();
},
);
}
}
Se un utente torna nella tua app dopo averla lasciata facendo clic su un annuncio di apertura dell'app, assicurati che non gli venga mostrato un altro annuncio di apertura dell'app.
Ascolta gli eventi di impostazione in primo piano dell'app
Per ricevere una notifica relativa agli eventi di impostazione in primo piano dell'app, devi iscriverti a AppStateEventNotifier.appStateStream
e ascoltare gli eventi foreground
.
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();
}
}
}
Ora puoi aggiungere e inizializzare AppLifecycleReactor
e iniziare a rilevare le modifiche del ciclo di vita dell'app. Ad esempio, dalla home page:
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);
}
Valuta la scadenza degli annunci
Per assicurarti di non mostrare un annuncio scaduto, aggiungi un timestamp a AppOpenAdManager
in modo da poter controllare quanto tempo è trascorso dal caricamento dell'annuncio.
Quindi, utilizza questo timestamp per verificare se l'annuncio è ancora valido.
/// 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.loadWithAdManagerAdRequest(
adUnitId: adUnitId,
orientation: AppOpenAd.orientationPortrait,
adManagerAdRequest: AdManagerAdRequest(),
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();
}
}
Avviamenti a freddo e schermate di caricamento
Finora la documentazione presupponeva che tu mostri gli annunci apertura app solo quando gli utenti attivano l'app in primo piano quando è sospesa in memoria. Gli "avvii a freddo" si verificano quando la tua app viene avviata, ma non era stata precedentemente sospesa in memoria.
Un esempio di avvio a freddo è quando un utente apre l'app per la prima volta. Con gli avvii a freddo, non avrai un annuncio di apertura app caricato in precedenza e pronto per essere mostrato subito. Il ritardo tra la richiesta di un annuncio e la ricezione di un annuncio di risposta può creare una situazione in cui gli utenti sono in grado di utilizzare brevemente la tua app prima di essere sorpresi da un annuncio fuori contesto. Questo comportamento deve essere evitato perché rappresenta una cattiva esperienza utente.
Il modo migliore per utilizzare gli annunci apertura app all'avvio a freddo è utilizzare una schermata di caricamento per caricare gli asset del gioco o dell'app e mostrare l'annuncio solo dalla schermata di caricamento. Se il caricamento dell'app è stato completato e l'utente è stato indirizzato ai contenuti principali dell'app, non mostrare l'annuncio.
Best practice
Gli annunci apertura app ti consentono di monetizzare la schermata di caricamento della tua app, al primo avvio e durante il passaggio da un'app all'altra, ma è importante tenere presente le best practice per consentire agli utenti di utilizzare la tua app con piacere. Ti consigliamo di:
- Mostra il primo annuncio di apertura dell'app dopo che gli utenti hanno utilizzato la tua app alcune volte.
- Mostra gli annunci apertura app nei momenti in cui gli utenti altrimenti dovrebbero attendere il caricamento della tua app.
- Se sotto l'annuncio di apertura dell'app è presente una schermata di caricamento che completa il caricamento prima che l'annuncio venga chiuso, ti consigliamo di chiuderla nel gestore eventi
onAdDismissedFullScreenContent
.