الإعلانات على شاشة فتح التطبيق

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

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

المتطلبات الأساسية

  • المكوّن الإضافي Flutter 0.13.6 أو إصدار أحدث
  • أكمِل البدء. من المفترض أن يكون قد سبق أن تم استيراد المكوّن الإضافي Flutter لإعلانات Google للأجهزة الجوّالة في تطبيقك المكتوب بلغة Flutter.

إجراء الاختبار دائمًا باستخدام الإعلانات الاختبارية

عند إنشاء تطبيقاتك واختبارها، احرص على استخدام إعلانات اختبارية بدلاً من الإعلانات المنشورة. وقد يؤدي عدم إجراء ذلك إلى تعليق حسابك.

إنّ الطريقة الأسهل لتحميل الإعلانات التجريبية هي استخدام أرقام تعريف الوحدات الإعلانية التجريبية المخصّصة لمحاولة عرض الإعلانات التي تضم مكافآت على Android وiOS:

  • /21775744923/example/app-open

تم إعدادها خصيصًا لعرض إعلانات اختبارية لكل طلب، و يمكنك استخدامها في تطبيقاتك أثناء الترميز والاختبار وتصحيح الأخطاء. ما عليك سوى استبدالها برقم تعريف وحدتك الإعلانية قبل نشر تطبيقك.

التنفيذ

في ما يلي الخطوات الرئيسية لدمج الإعلانات على شاشة فتح التطبيق:

  1. أنشئ فئة أدوات تحمّل إعلانًا قبل أن تحتاج إلى عرضه.
  2. حمِّل إعلانًا.
  3. سجِّل للاستفادة من ميزة "إعادة الاتصال" وعرض الإعلان.
  4. اشترِك في 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 ومعالج completing الذي يتم استدعاؤه عند نجاح تحميل الإعلان أو تعذّره. يتم تقديم كائن 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();
  }
}

عمليات التشغيل المُجرّد وشاشات التحميل

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

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

إنّ الطريقة المفضّلة لاستخدام الإعلانات على شاشة فتح التطبيق عند عمليات البدء البارد هي استخدام شاشة تحميل لتحميل مواد عرض اللعبة أو التطبيق، وعرض الإعلان من شاشة التحميل فقط. إذا اكتمل تحميل تطبيقك وأرسل المستخدم إلى المحتوى الرئيسي لتطبيقك، لا تعرض الإعلان.

أفضل الممارسات

تساعدك الإعلانات على شاشة فتح التطبيق في تحقيق الربح من شاشة تحميل تطبيقك عند بدء استخدامه لأول مرة وأثناء التبديل بين التطبيقات، ولكن من المهم مراعاة أفضل الممارسات كي يستمتع المستخدمون باستخدام تطبيقك. من الأفضل اتّباع ما يلي:

  • اعرض إعلان فتح التطبيق الأول بعد أن يستخدم المستخدمون تطبيقك بضع مرّات.
  • يمكنك عرض الإعلانات على شاشة فتح التطبيق خلال الأوقات التي ينتظر فيها المستخدمون loadingتحميل تطبيقك.
  • إذا كانت لديك شاشة تحميل أسفل الإعلان على شاشة فتح التطبيق واكتملت عملية تحميل شاشة التحميل قبل إغلاق الإعلان، ننصحك بإغلاق شاشة التحميل في معالِج الحدث onAdDismissedFullScreenContent.