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

پیشنیازها
پیشاز ادامه دادن، کارهای زیر را انجام دهید:
- افزایه 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
برای مشاهده نمونه کامل، نمونه نمایشی میانای برنامهسازی کاربردی را ببینید.