آگهیهای باز شدن برنامه قالب آگهی ویژهای است که برای ناشرانی درنظر گرفته شده است که میخواهند از صفحههای بار کردن برنامه خود درآمدزایی کنند. آگهیهای باز شدن برنامه را میتوان در هر زمانی بست و این آگهیها بهگونهای طراحی شدهاند که وقتی کاربران برنامه شما را به پیشنما میآورند نشان داده شوند.
آگهیهای باز شدن برنامه بهطور خودکار یک ناحیه کوچک نمانامسازی را نشان میدهند تا کاربران بدانند که در برنامه شما هستند. در اینجا نمونهای از ظاهر آگهی باز شدن برنامه آورده شده است:

پیشنیازها
پیشاز ادامه دادن، کارهای زیر را انجام دهید:
- افزایه Flutter نسخه ۰.۱۳.۶ یا بالاتر را نصب کنید.
- Google Mobile Ads Flutter Plugin را راهاندازی کنید. برنامه Flutter شما باید Google Mobile Ads Flutter Plugin را وارد کرده باشد.
همیشه با آگهیهای آزمایشی آزمایش کنید
هنگام ساختن و آزمایش کردن برنامههایتان، حتماً از آگهیهای آزمایشی استفاده کنید نه آگهیهای زنده و تولیدی. انجام ندادن این کار میتواند منجر به تعلیق حسابتان شود.
سادهترین راه برای بار کردن آگهیهای آزمایشی استفاده از شناسههای واحد آگهی آزمایشی اختصاصی ما برای آگهیهای پاداشدار Android و iOS است:
Android
ca-app-pub-3940256099942544/9257395921
iOS
ca-app-pub-3940256099942544/5575463023
این شناسهها بهطور ویژه پیکربندی شدهاند تا برای هر درخواست، آگهی آزمایشی برگردانند و میتوانید آزادانه از آنها در برنامههای خودتان هنگام کدنویسی، آزمایش، و اشکالزدایی استفاده کنید. فقط مطمئن شوید که قبلاز انتشار برنامهتان، آنها را با شناسه واحد آگهی خودتان جایگزین کنید.
پیادهسازی
مراحل اصلی برای ادغام آگهیهای باز شدن برنامه عبارتند از:
- کلاس کاربردیای ایجاد کنید که آگهی را قبلاز اینکه لازم باشد نمایش داده شود بار میکند.
- آگهی را بار کنید.
- برای فراخوانیها ثبتنام کنید و آگهی را نشان دهید.
- برای نمایش آگهی درطول رویدادهای پیشزمینه،
در
AppStateEventNotifier.appStateStreamمشترک شوید.
ایجاد کلاس سودمند
کلاس جدیدی بهنام AppOpenAdManager برای بار کردن آگهی ایجاد کنید. این کلاس یک متغیر نمونه را برای پیگیری آگهی بارشده و شناسه واحد آگهی برای هر پلاتفرم مدیریت میکند.
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;
}
}
بار کردن آگهی
آگهی در صفحه باز شدن برنامه شما باید قبلاز ورود کاربران به برنامه آماده باشد. یک کلاس کمکی پیادهسازی کنید تا درخواستهای آگهی را قبلاز زمانی که نیاز به نمایش آگهی دارید، انجام دهد.
بار کردن آگهی بااستفاده از روش load
در کلاس AppOpenAd انجام میشود. روش بار کردن به شناسه واحد آگهی، حالت جهتیابی، شیء AdRequest، و گرداننده تکمیل نیاز دارد که هنگام موفقیت یا شکست بار کردن آگهی فراخوانده میشود. شیء AppOpenAd بارشده بهعنوان پارامتر در گرداننده تکمیل ارائه میشود. مثال زیر نحوه بار کردن AppOpenAd را نشان میدهد.
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.
},
),
);
}
}
نمایش آگهی و مدیریت فراخوانیهای تمامصفحه
قبلاز نمایش آگهی، برای هر رویداد آگهی که میخواهید به آن گوش دهید،
FullScreenContentCallback ثبت کنید.
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();
},
);
}
}
اگر کاربری پساز خروج از برنامه شما با کلیک کردن روی آگهی در صفحه باز شدن برنامه به برنامه شما برگردد، مطمئن شوید که آگهی در صفحه باز شدن برنامه دیگری به او نشان داده نشود.
گوش دادن به رویدادهای پیشزمینه برنامه
برای مطلع شدن از رویدادهای پیشزمینه برنامه، باید در
AppStateEventNotifier.appStateStream مشترک شوید و به رویدادهای 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();
}
}
}
اکنون میتوانید AppLifecycleReactor خود را مقداردهی اولیه کنید و گوش دادن به
تغییرات چرخه حیات برنامه را شروع کنید. برای مثال، از صفحه اصلی:
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);
}
توجه به انقضای آگهی
برای اطمینان از اینکه آگهی منقضیشده را نشان نمیدهید، مُهر زمان را به
AppOpenAdManager اضافه کنید تا بتوانید بررسی کنید چقدر از زمان بار شدن آگهیتان گذشته است.
سپس از آن مُهر زمان استفاده کنید تا بررسی کنید که آیا آگهی هنوز معتبر است یا نه.
/// 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();
}
}
شروع سرد و صفحهنمایشهای بار کردن
تا اینجا، فرض بر این است که آگهیهای در صفحه باز شدن برنامه را فقط زمانی نشان میدهید که کاربران برنامه شما را وقتی در حافظه معلق است در پیشزمینه قرار میدهند. «راهاندازی سرد» زمانی اتفاق میافتد که برنامه شما راهاندازی میشود اما قبلاً در حافظه تعلیق نشده است.
نمونهای از راهاندازی سرد زمانی است که کاربر برای اولینبار برنامهتان را باز میکند. با راهاندازی سرد، آگهی در صفحه باز شدن برنامه که قبلاً بار شده باشد و آماده نمایش فوری باشد نخواهید داشت. تأخیر بین زمانی که آگهی درخواست میکنید و زمانی که آگهی را دریافت میکنید میتواند شرایطی ایجاد کند که کاربران بتوانند برای مدت کوتاهی از برنامهتان استفاده کنند و سپس با آگهیای که با بافتار مطابقت ندارد غافلگیر شوند. باید از این کار اجتناب شود زیرا تجربه کاربری بدی است.
روش ترجیحی برای استفاده از آگهی در صفحه باز شدن برنامه در راهاندازی سرد، استفاده از صفحه بارگیری برای بار کردن داراییهای بازی یا برنامه و نمایش آگهی فقط از صفحه بارگیری است. اگر بار کردن برنامهتان تکمیل شده است و کاربر را به محتوای اصلی برنامهتان فرستاده است، آگهی را نشان ندهید.
روالهای مطلوب
آگهیهای باز شدن برنامه به شما کمک میکند از صفحه بار کردن برنامهتان، هنگام اولین راهاندازی برنامه و درطول جابهجایی بین برنامهها، درآمدزایی کنید، اما مهم است که روالهای مطلوب را در ذهن داشته باشید تا کاربران از استفاده از برنامه شما لذت ببرند. بهتر است:
- اولین آگهی در صفحه باز شدن برنامه را پساز اینکه کاربرانتان چند بار از برنامهتان استفاده کردند نشان دهید.
- آگهیهای در صفحه باز شدن برنامه را در زمانهایی نشان دهید که کاربران درغیراینصورت منتظر بار شدن برنامهتان میمانند.
- اگر صفحه بارگیری در زیر آگهی در صفحه باز شدن برنامه دارید و صفحه بارگیری شما
پیشاز بسته شدن آگهی بارگیری را تکمیل میکند، شاید بخواهید صفحه بارگیری را در
گرداننده رویداد
onAdDismissedFullScreenContentببندید.
نمونه کامل در GitHub
برای مشاهده نمونه کامل، نسخه نمایشی میانای برنامهسازی کاربردی را ببینید.