إعلانات البانر التكيُّفية المضمّنة

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

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

حالات استخدام إعلانات البانر التكيُّفية المضمّنة

إعلانات البانر التكيُّفية المضمّنة هي إعلانات بانر أكبر حجمًا وأطول مقارنةً بإعلانات البانر التكيُّفية الثابتة. ولها ارتفاع متغير، ويمكن أن تكون بطول شاشة الجهاز.

والغرض منها هو وضعها في محتوى التمرير، مثل:

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

قبل البدء

عند تنفيذ إعلانات البانر التكيُّفية في تطبيقك، يُرجى مراعاة النقاط التالية:

  • تأكّد من استخدام أحدث إصدار من حزمة SDK لإعلانات Google على الأجهزة الجوّالة، وفي حال استخدام التوسّط، يمكنك استخدام أحدث إصدارات محوّلات التوسّط.

  • تم تصميم أحجام البانر التكيُّفية المضمّنة لتعمل على أفضل وجه عند استخدام العرض الكامل المتاح. وفي معظم الحالات، سيكون هذا العرض هو العرض الكامل لشاشة الجهاز المستخدَم. تأكَّد من مراعاة المناطق الآمنة السارية.

  • إن طرق الحصول على حجم الإعلان هي

    • AdSize.getCurrentOrientationInlineAdaptiveBannerAdSize(int width)
    • AdSize.getLandscapeInlineAdaptiveBannerAdSize(int width)
    • AdSize.getPortraitInlineAdaptiveBannerAdSize(int width)
    • AdSize.getInlineAdaptiveBannerAdSize(int width, int maxHeight)
  • عند استخدام واجهات برمجة التطبيقات المضمَّنة في إعلانات البانر التكيُّفية، تعرِض حزمة "SDK لإعلانات Google على الأجهزة الجوّالة" رمز الاستجابة AdSize بالعرض المحدّد وعلامة مضمّنة. يكون الارتفاع صفرًا أو maxHeight، بناءً على واجهة برمجة التطبيقات التي تستخدمها. ويكون الارتفاع الفعلي للإعلان متاحًا عند إرجاعه.

  • تم تصميم إعلان بانر تكيُّفي مضمَّن ليتم وضعه ضمن محتوى يمكن التنقّل فيه. يمكن أن يكون طول إعلان البانر بطول شاشة الجهاز أو مقيدًا بالحد الأقصى للارتفاع، بناءً على واجهة برمجة التطبيقات.

التنفيذ

اتّبِع الخطوات التالية لتنفيذ إعلان بانر تكيُّفي مضمّن وبسيط.

  1. احصل على حجم إعلان بانر تكيُّفي مضمَّن. سيُستخدم الحجم الذي تحصل عليه لطلب إعلان البانر التكيُّفي. للحصول على حجم الإعلان التكيُّفي، يُرجى التأكُّد مما يلي:
    1. اطّلِع على عرض الجهاز المستخدَم بوحدات بكسل مستقلة الكثافة، أو اضبط عرضك الخاص إذا لم تكن تريد استخدام عرض الشاشة الكامل. يمكنك استخدام "MediaQuery.of(context)" للحصول على عرض الشاشة.
    2. استخدِم الطرق الثابتة المناسبة في فئة حجم الإعلان، مثل AdSize.getCurrentOrientationInlineAdaptiveBannerAdSize(int width)للحصول على عنصر AdSize تكيُّفي مضمَّن مع الاتجاه الحالي.
    3. إذا كنت تريد وضع حد لارتفاع إعلان البانر، يمكنك استخدام الطريقة الثابتة AdSize.getInlineAdaptiveBannerAdSize(int width, int maxHeight).
  2. أنشئ عنصر BannerAd باستخدام رقم تعريف وحدتك الإعلانية وحجم الإعلان التكيّفي وكائن طلب الإعلان.
  3. حمِّل الإعلان.
  4. في معاودة الاتصال onAdLoaded، استخدِم BannerAd.getPlatformAdSize() للحصول على حجم إعلان المنصة المعدَّل وتعديل ارتفاع الحاوية AdWidget.

مثال الرمز البرمجي

في ما يلي مثال على تطبيق مصغّر يعرض إعلان بانر تكيُّفي مضمّنًا ليلائم عرض الشاشة، مع مراعاة الأجزاء الداخلية:

import 'package:flutter/material.dart';
import 'package:google_mobile_ads/google_mobile_ads.dart';

/// This example demonstrates inline adaptive banner ads.
///
/// Loads and shows an inline adaptive banner ad in a scrolling view,
/// and reloads the ad when the orientation changes.
class InlineAdaptiveExample extends StatefulWidget {
  @override
  _InlineAdaptiveExampleState createState() => _InlineAdaptiveExampleState();
}

class _InlineAdaptiveExampleState extends State<InlineAdaptiveExample> {
  static const _insets = 16.0;
  BannerAd? _inlineAdaptiveAd;
  bool _isLoaded = false;
  AdSize? _adSize;
  late Orientation _currentOrientation;

  double get _adWidth => MediaQuery.of(context).size.width - (2 * _insets);

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    _currentOrientation = MediaQuery.of(context).orientation;
    _loadAd();
  }

  void _loadAd() async {
    await _inlineAdaptiveAd?.dispose();
    setState(() {
      _inlineAdaptiveAd = null;
      _isLoaded = false;
    });

    // Get an inline adaptive size for the current orientation.
    AdSize size = AdSize.getCurrentOrientationInlineAdaptiveBannerAdSize(
        _adWidth.truncate());

    _inlineAdaptiveAd = BannerAd(
      // TODO: replace this test ad unit with your own ad unit.
      adUnitId: 'ca-app-pub-3940256099942544/9214589741',
      size: size,
      request: AdRequest(),
      listener: BannerAdListener(
        onAdLoaded: (Ad ad) async {
          print('Inline adaptive banner loaded: ${ad.responseInfo}');

          // After the ad is loaded, get the platform ad size and use it to
          // update the height of the container. This is necessary because the
          // height can change after the ad is loaded.
          BannerAd bannerAd = (ad as BannerAd);
          final AdSize? size = await bannerAd.getPlatformAdSize();
          if (size == null) {
            print('Error: getPlatformAdSize() returned null for $bannerAd');
            return;
          }

          setState(() {
            _inlineAdaptiveAd = bannerAd;
            _isLoaded = true;
            _adSize = size;
          });
        },
        onAdFailedToLoad: (Ad ad, LoadAdError error) {
          print('Inline adaptive banner failedToLoad: $error');
          ad.dispose();
        },
      ),
    );
    await _inlineAdaptiveAd!.load();
  }

  /// Gets a widget containing the ad, if one is loaded.
  ///
  /// Returns an empty container if no ad is loaded, or the orientation
  /// has changed. Also loads a new ad if the orientation changes.
  Widget _getAdWidget() {
    return OrientationBuilder(
      builder: (context, orientation) {
        if (_currentOrientation == orientation &&
            _inlineAdaptiveAd != null &&
            _isLoaded &&
            _adSize != null) {
          return Align(
              child: Container(
            width: _adWidth,
            height: _adSize!.height.toDouble(),
            child: AdWidget(
              ad: _inlineAdaptiveAd!,
            ),
          ));
        }
        // Reload the ad if the orientation changes.
        if (_currentOrientation != orientation) {
          _currentOrientation = orientation;
          _loadAd();
        }
        return Container();
      },
    );
  }

  @override
  Widget build(BuildContext context) => Scaffold(
      appBar: AppBar(
        title: Text('Inline adaptive banner example'),
      ),
      body: Center(
        child: Padding(
          padding: const EdgeInsets.symmetric(horizontal: _insets),
          child: ListView.separated(
            itemCount: 20,
            separatorBuilder: (BuildContext context, int index) {
              return Container(
                height: 40,
              );
            },
            itemBuilder: (BuildContext context, int index) {
              if (index == 10) {
                return _getAdWidget();
              }
              return Text(
                'Placeholder text',
                style: TextStyle(fontSize: 24),
              );
            },
          ),
        ),
      ));

  @override
  void dispose() {
    super.dispose();
    _inlineAdaptiveAd?.dispose();
  }
}