"الإعلانات على شاشة فتح التطبيق" هي شكل إعلان خاص مخصّص للناشرين الذين يريدون تحقيق الربح من شاشات تحميل التطبيقات. يمكن إغلاق "الإعلانات على شاشة فتح التطبيق" في أي وقت، وهي مصمّمة للعرض عندما يعرض المستخدمون تطبيقك في المقدّمة.
تعرض "الإعلانات على شاشة فتح التطبيق" تلقائيًا مساحة صغيرة خاصة بالعناصر البصرية للعلامة التجارية كي يعرف المستخدمون أنّهم داخل تطبيقك. إليك مثال على شكل "الإعلان على شاشة فتح التطبيق":

المتطلبات الأساسية
قبل المتابعة، يُرجى تنفيذ ما يلي:
- تثبيت الإصدار 0.13.6 أو إصدار أحدث من مكوّن Flutter الإضافي
- إعداد Google Mobile Ads Flutter Plugin. يجب استيراد Google Mobile Ads Flutter Plugin إلى تطبيق Flutter.
الاختبار دائمًا باستخدام الإعلانات الاختبارية
عند إنشاء تطبيقاتك واختبارها، احرص على استخدام الإعلانات الاختبارية بدلاً من الإعلانات الفعلية المعروضة للمستخدمين. وقد يؤدي عدم إجراء ذلك إلى تعليق حسابك.
أسهل طريقة لتحميل الإعلانات الاختبارية هي استخدام أرقام تعريف الوحدات الإعلانية الاختبارية المخصّصة للإعلانات مقابل مكافأة على Android وiOS:
/21775744923/example/app-open
تم إعداد هذه الأرقام خصيصًا لعرض إعلانات اختبارية لكل طلب، ويمكنك استخدامها في تطبيقاتك أثناء الترميز والاختبار وتحديد الأخطاء وحلّها. ما عليك سوى استبدالها برقم تعريف الوحدة الإعلانية الخاص بك قبل نشر تطبيقك.
التنفيذ
الخطوات الرئيسية لدمج "الإعلانات على شاشة فتح التطبيق" هي:
- إنشاء فئة أدوات تحمّل إعلانًا قبل أن تحتاج إلى عرضه
- تحميل إعلان
- تسجيل دوالّ ردّ النداء وعرض الإعلان
- الاشتراك في
AppStateEventNotifier.appStateStreamلعرض الإعلان أثناء أحداث فتح التطبيق.
إنشاء فئة أدوات
أنشئ فئة جديدة باسم AppOpenAdManager لتحميل الإعلان. تُدير هذه الفئة متغيّرًا في مثيل لتتبُّع إعلان تم تحميله ورقم تعريف الوحدة الإعلانية لكل نظام أساسي.
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;
}
}
تحميل إعلان
يجب أن يكون "الإعلان على شاشة فتح التطبيق" جاهزًا قبل أن يدخل المستخدمون إلى تطبيقك. نفِّذ فئة أدوات لتقديم طلبات عرض الإعلانات قبل الوقت الذي تحتاج فيه إلى عرض الإعلان.
يتم تحميل الإعلان باستخدام طريقة loadWithAdManagerAdRequest في فئة AppOpenAd. تتطلّب طريقة التحميل رقم تعريف وحدة إعلانية ووضع توجيه وكائن AdManagerAdRequest ومعالج إكمال يتم استدعاؤه عند نجاح تحميل الإعلان أو تعذّره. يتم توفير كائن AppOpenAd الذي تم تحميله كمعلَمة في معالج الإكمال. يوضّح المثال التالي كيفية تحميل 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.
},
),
);
}
}
عرض الإعلان والتعامل مع دوالّ ردّ النداء بملء الشاشة
قبل عرض الإعلان، سجِّل 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.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();
}
}
عمليات بدء التشغيل الباردة وشاشات التحميل
تفترض المستندات حتى الآن أنّك لا تعرض "الإعلانات على شاشة فتح التطبيق" إلا عندما يعرض المستخدمون تطبيقك في المقدّمة عندما يكون معلّقًا في الذاكرة. تحدث "عمليات بدء التشغيل الباردة" عند تشغيل تطبيقك ولكن لم يتم تعليقه سابقًا في الذاكرة.
أحد الأمثلة على عملية بدء التشغيل الباردة هو عندما يفتح المستخدم تطبيقك لأول مرة. في عمليات بدء التشغيل الباردة، لن يكون لديك "إعلان على شاشة فتح التطبيق" تم تحميله سابقًا وجاهز للعرض على الفور. يمكن أن يؤدي التأخير بين وقت طلب الإعلان وتلقّيه إلى تمكّن المستخدمين من استخدام تطبيقك لفترة وجيزة قبل أن يفاجئهم إعلان خارج السياق. يجب تجنُّب ذلك لأنّه يؤدي إلى تجربة سيئة للمستخدم.
الطريقة المفضّلة لاستخدام "الإعلانات على شاشة فتح التطبيق" في عمليات بدء التشغيل الباردة هي استخدام شاشة تحميل لتحميل مواد عرض لعبتك أو تطبيقك، وعرض الإعلان من شاشة التحميل فقط. إذا اكتمل تحميل تطبيقك وتم توجيه المستخدم إلى المحتوى الرئيسي لتطبيقك، لا تعرِض الإعلان.
أفضل الممارسات
تساعدك "الإعلانات على شاشة فتح التطبيق" في تحقيق الربح من شاشة تحميل تطبيقك عند تشغيل التطبيق لأول مرة وأثناء تبديل التطبيقات، ولكن من المهم مراعاة أفضل الممارسات لكي يستمتع المستخدمون باستخدام تطبيقك. من الأفضل إجراء ما يلي:
- عرض أول "إعلان على شاشة فتح التطبيق" بعد أن يستخدم المستخدمون تطبيقك عدة مرات
- عرض "الإعلانات على شاشة فتح التطبيق" في الأوقات التي ينتظر فيها المستخدمون تحميل تطبيقك
- إذا كان لديك شاشة تحميل أسفل "الإعلان على شاشة فتح التطبيق" واكتمل تحميل شاشة التحميل قبل إغلاق الإعلان، قد تحتاج إلى إغلاق شاشة التحميل في معالج أحداث
onAdDismissedFullScreenContent.