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

المتطلبات الأساسية
قبل المتابعة، يُرجى تنفيذ ما يلي:
- تثبيت المكوّن الإضافي Flutter الإصدار 0.13.6 أو إصدار أحدث
- إعداد Google Mobile Ads Flutter Plugin يجب استيراد Google Mobile Ads Flutter Plugin إلى تطبيق Flutter.
الاختبار دائمًا باستخدام الإعلانات الاختبارية
عند إنشاء تطبيقاتك واختبارها، احرِص على استخدام الإعلانات الاختبارية بدلاً من الإعلانات الفعلية المعروضة للمستخدمين. وقد يؤدي عدم إجراء ذلك إلى تعليق حسابك.
أسهل طريقة لتحميل الإعلانات الاختبارية هي استخدام أرقام تعريف الوحدات الإعلانية الاختبارية المخصّصة للإعلانات بمكافأة على 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
الإعلانات على شاشة فتح التطبيق