1. مقدمه
در این کد لبه، شما یک بنر AdMob و یک تبلیغ داخلی AdMob را در یک برنامه Flutter پیاده سازی می کنید.
چیزی که خواهی ساخت
این لبه کد شما را از طریق اجرای یک بنر درون خطی AdMob و تبلیغات داخلی AdMob در یک برنامه Flutter با استفاده از افزونه Google Mobile Ads برای Flutter راهنمایی می کند.
|
|
اگر در حین کار در این کدنویسی با مشکلی مواجه شدید (اشکالات کد، خطاهای دستوری، جمله بندی نامشخص و غیره)، مشکل را با استفاده از پیوند گزارش یک اشتباه در گوشه سمت چپ پایین صفحه کد گزارش کنید.
چیزی که یاد خواهید گرفت
- نحوه پیکربندی افزونه Google Mobile Ads Flutter
- نحوه پیاده سازی یک بنر درون خطی و تبلیغات پاداش در یک برنامه فلاتر
آنچه شما نیاز دارید
- اندروید استودیو 4.1 یا بالاتر
- Xcode 12 یا بالاتر (برای توسعه iOS)
سطح تجربه خود را با AdMob چگونه ارزیابی می کنید؟
سطح تجربه خود را با فلاتر چگونه ارزیابی می کنید؟
2. محیط توسعه Flutter خود را تنظیم کنید
برای تکمیل این آزمایشگاه به دو نرم افزار نیاز دارید - Flutter SDK و یک ویرایشگر .
شما می توانید کدلب را با استفاده از هر یک از این دستگاه ها اجرا کنید:
- یک دستگاه فیزیکی Android یا iOS که به رایانه شما متصل شده و روی حالت Developer تنظیم شده است.
- شبیه ساز iOS (نیاز به نصب ابزار Xcode دارد).
- شبیه ساز اندروید (نیاز به نصب در Android Studio دارد).
- یک مرورگر (Chrome برای اشکال زدایی لازم است).
- به عنوان یک برنامه دسکتاپ Windows ، Linux ، یا macOS . شما باید روی پلتفرمی که قصد استقرار در آن را دارید توسعه دهید. بنابراین، اگر می خواهید یک برنامه دسکتاپ ویندوز توسعه دهید، باید در ویندوز توسعه دهید تا به زنجیره ساخت مناسب دسترسی داشته باشید. الزامات خاص سیستم عامل وجود دارد که به طور مفصل در docs.flutter.dev/desktop پوشش داده شده است.
کد را دانلود کنید
پس از دانلود فایل فشرده، محتویات آن را استخراج کنید. شما یک پوشه به نام admob-inline-ads-in-flutter-main خواهید داشت.
همچنین، میتوانید مخزن GitHub را از خط فرمان کلون کنید:
$ git clone https://github.com/googlecodelabs/admob-inline-ads-in-flutter
مخزن شامل سه پوشه است:
starter: کد شروعی که در این Codelab خواهید ساخت.
کامل: کد تکمیل شده برای این کد لبه. (جاوا و Objective-C برای کد بومی)
full_kotlin_swift: کد کامل شده برای این کد لبه. (کاتلین و سوئیفت برای کد بومی)
3. برنامه AdMob و واحدهای تبلیغاتی را تنظیم کنید
از آنجایی که Flutter یک SDK چند پلتفرمی است، باید یک برنامه و واحدهای تبلیغاتی برای Android و iOS در AdMob اضافه کنید.
برای اندروید راه اندازی کنید
برای راهاندازی برای Android، باید یک برنامه Android اضافه کنید و واحدهای تبلیغاتی ایجاد کنید.
یک برنامه اندروید اضافه کنید
- در کنسول AdMob ، روی ADD APP از منوی Apps کلیک کنید.
- وقتی از شما می پرسند آیا برنامه خود را در Google Play یا App Store منتشر کرده اید؟ ، روی NO کلیک کنید.
-
AdMob inline adsدر قسمت نام برنامه وارد کنید و Android را به عنوان پلتفرم انتخاب کنید.

- فعال کردن معیارهای کاربر برای تکمیل این کد لبه ضروری نیست. با این حال، توصیه می کنیم این کار را انجام دهید زیرا به شما امکان می دهد رفتار کاربر را با جزئیات بیشتری درک کنید. برای تکمیل فرآیند روی ADD کلیک کنید.

ایجاد واحدهای تبلیغاتی
برای افزودن واحدهای تبلیغاتی:
- برنامه تبلیغات درون خطی AdMob را از منوی Apps در کنسول AdMob انتخاب کنید.
- روی منوی واحدهای آگهی کلیک کنید.
بنر
|
|
بومی
|
|
معمولاً چند ساعت طول می کشد تا یک واحد تبلیغاتی جدید بتواند تبلیغات را ارائه دهد.
اگر میخواهید رفتار آگهی را فوراً آزمایش کنید، از شناسه برنامه آزمایشی و شناسههای واحد آگهی فهرستشده در جدول شناسه برنامه Android/شناسه واحد آگهی و شناسه برنامه iOS/شناسه واحد آگهی استفاده کنید.
برای iOS تنظیم کنید
برای راهاندازی برای iOS، باید یک برنامه iOS اضافه کنید و واحدهای تبلیغاتی ایجاد کنید.
یک برنامه iOS اضافه کنید
- در کنسول AdMob ، روی ADD APP از منوی Apps کلیک کنید.
- وقتی از شما می پرسند آیا برنامه خود را در Google Play یا App Store منتشر کرده اید؟ ، روی NO کلیک کنید.
-
AdMob inline adsدر قسمت نام برنامه وارد کنید و iOS را به عنوان پلتفرم انتخاب کنید.

- فعال کردن معیارهای کاربر برای تکمیل این کد لبه ضروری نیست. با این حال، توصیه می کنیم این کار را انجام دهید زیرا به شما امکان می دهد رفتار کاربر را با جزئیات بیشتری درک کنید. برای تکمیل فرآیند روی ADD کلیک کنید.

ایجاد واحدهای تبلیغاتی
برای افزودن واحدهای تبلیغاتی:
- برنامه تبلیغات درون خطی AdMob را از منوی Apps در کنسول AdMob انتخاب کنید.
- روی منوی واحدهای آگهی کلیک کنید.
بنر
|
|
بومی
|
|
معمولاً چند ساعت طول می کشد تا یک واحد تبلیغاتی جدید بتواند تبلیغات را ارائه دهد.
اگر میخواهید رفتار آگهی را فوراً آزمایش کنید، از شناسه برنامه آزمایشی و شناسههای واحد آگهی فهرستشده در جدول زیر استفاده کنید.
اختیاری: از برنامه آزمایشی AdMob و واحدهای تبلیغاتی استفاده کنید
اگر میخواهید بهجای ایجاد یک برنامه جدید و واحدهای تبلیغاتی بهتنهایی از نرمافزار کد پیروی کنید، میتوانید از شناسه برنامه آزمایشی AdMob و شناسههای واحد آگهی فهرستشده در جداول زیر استفاده کنید.
شناسه برنامه Android/شناسه واحد آگهی
مورد | شناسه برنامه/شناسه واحد آگهی |
شناسه برنامه AdMob | |
بنر | |
بومی | |
شناسه برنامه iOS/شناسه واحد آگهی
مورد | شناسه برنامه/شناسه واحد آگهی |
شناسه برنامه AdMob | |
بنر | |
بومی | |
برای کسب اطلاعات بیشتر در مورد تبلیغات آزمایشی، به آگهی های آزمایشی اندروید و مستندات توسعه دهنده تبلیغات آزمایشی iOS مراجعه کنید.
4. افزونه Google Mobile Ads Flutter را اضافه کنید
Flutter از پلاگین ها برای دسترسی به طیف گسترده ای از خدمات پلتفرم خاص استفاده می کند. پلاگین ها شما را قادر می سازند به سرویس ها و API ها در هر پلتفرم دسترسی داشته باشید.
افزونه google_mobile_ads از بارگیری و نمایش تبلیغات بنر، بینابینی، پاداش و بومی با استفاده از AdMob API پشتیبانی می کند.
از آنجایی که Flutter یک SDK چند پلتفرمی است، افزونه google_mobile_ads هم برای iOS و هم برای اندروید قابل اجرا است. بنابراین، اگر افزونه را به برنامه Flutter خود اضافه کنید، در هر دو نسخه اندروید و iOS برنامه تبلیغات درون خطی AdMob از آن استفاده می شود.
افزونه Google Mobile Ads را به عنوان یک وابستگی اضافه کنید
برای دسترسی به APIهای AdMob از پروژه تبلیغات درون خطی AdMob ، google_mobile_ads به عنوان یک وابستگی به فایل pubspec.yaml که در ریشه پروژه قرار دارد اضافه کنید.
pubspec.yaml
...
dependencies:
flutter:
sdk: flutter
google_fonts: ^0.3.9
# TODO: Add google_mobile_ads as a dependency
google_mobile_ads: ^1.2.0
...
برای نصب افزونه در پروژه تبلیغات درون خطی AdMob روی Pub get کلیک کنید.

بهروزرسانی AndroidManifest.xml (Android)
- فایل
android/app/src/main/AndroidManifest.xmlرا در Android Studio باز کنید. - شناسه برنامه AdMob خود را با افزودن یک برچسب
<meta-data>با نامcom.google.android.gms.ads.APPLICATION_IDاضافه کنید. برای مثال، اگر شناسه برنامه AdMob شماca-app-pub-3940256099942544~3347511713است، باید خطوط زیر را به فایلAndroidManifest.xmlاضافه کنید.
AndroidManifest.xml
<manifest>
...
<application>
...
<meta-data
android:name="com.google.android.gms.ads.APPLICATION_ID"
android:value="ca-app-pub-3940256099942544~3347511713"/>
</application>
</manifest>
بهروزرسانی Info.plist (iOS)
- فایل
ios/Runner/Info.plistرا در Android Studio باز کنید. - یک کلید
GADApplicationIdentifierبا مقدار رشته شناسه برنامه AdMob خود اضافه کنید. برای مثال، اگر شناسه برنامه AdMob شماca-app-pub-3940256099942544~1458002511است، باید خطوط زیر را به فایلInfo.plistاضافه کنید.
ios/Runner/Info.plist
...
<key>GADApplicationIdentifier</key>
<string>ca-app-pub-3940256099942544~1458002511</string>
...
5. یک کلاس کمکی برای تبلیغات اضافه کنید
یک فایل جدید با نام ad_helper.dart در زیر پوشه lib ایجاد کنید. سپس، کلاس AdHelper را پیاده سازی کنید، که شناسه برنامه AdMob و شناسه های واحد تبلیغات را برای Android و iOS ارائه می کند.
مطمئن شوید که شناسه برنامه AdMob ( ca-app-pub-xxxxxx~yyyyy ) و شناسه واحد تبلیغات ( ca-app-pub-xxxxxxx/yyyyyyyy ) را با شناسه هایی که در مرحله قبل ایجاد کرده اید جایگزین کرده اید.
ad_helper.dart
import 'dart:io';
class AdHelper {
static String get bannerAdUnitId {
if (Platform.isAndroid) {
return "<YOUR_ANDROID_BANNER_AD_UNIT_ID";
} else if (Platform.isIOS) {
return "<YOUR_IOS_BANNER_AD_UNIT_ID>";
} else {
throw UnsupportedError("Unsupported platform");
}
}
static String get nativeAdUnitId {
if (Platform.isAndroid) {
return "<YOUR_ANDROID_NATIVE_AD_UNIT_ID>";
} else if (Platform.isIOS) {
return "<YOUR_IOS_NATIVE_AD_UNIT_ID>";
} else {
throw UnsupportedError("Unsupported platform");
}
}
}
اگر میخواهید از شناسه برنامه AdMob آزمایشی و شناسههای واحد آگهی آزمایشی استفاده کنید، از قطعه کد زیر استفاده کنید.
ad_helper.dart
import 'dart:io';
class AdHelper {
static String get bannerAdUnitId {
if (Platform.isAndroid) {
return 'ca-app-pub-3940256099942544/6300978111';
} else if (Platform.isIOS) {
return 'ca-app-pub-3940256099942544/2934735716';
}
throw UnsupportedError("Unsupported platform");
}
static String get nativeAdUnitId {
if (Platform.isAndroid) {
return 'ca-app-pub-3940256099942544/2247696110';
} else if (Platform.isIOS) {
return 'ca-app-pub-3940256099942544/3986624511';
}
throw UnsupportedError("Unsupported platform");
}
}
6. Google Mobile Ads SDK را راه اندازی کنید
قبل از بارگیری تبلیغات، باید Google Mobile Ads SDK را مقداردهی اولیه کنید. فایل lib/home_page.dart را باز کنید و _initGoogleMobileAds() را تغییر دهید تا SDK قبل از بارگیری صفحه اصلی، مقداردهی اولیه شود.
توجه داشته باشید که باید نوع بازگشت متد _initGoogleMobileAds() را از Future<dynamic> به Future<InitializationStatus> تغییر دهید تا نتیجه اولیه سازی SDK را پس از تکمیل آن بدست آورید.
home_page.dart
// TODO: Import google_mobile_ads.dart
import 'package:google_mobile_ads/google_mobile_ads.dart';
import 'package:flutter/material.dart';
...
class HomePage extends StatelessWidget {
...
Future<InitializationStatus> _initGoogleMobileAds() {
// TODO: Initialize Google Mobile Ads SDK
return MobileAds.instance.initialize();
}
}
7. یک بنر تبلیغاتی اضافه کنید
در این قسمت شما یک بنر تبلیغاتی را مانند تصویر زیر در وسط لیست نمایش می دهید.

- فایل
lib/banner_inline_page.dartرا باز کنید. -
ad_helper.dartوgoogle_mobile_ads.dartرا با افزودن خطوط زیر وارد کنید:
banner_inline_page.dart
...
// TODO: Import ad_helper.dart
import 'package:admob_inline_ads_in_flutter/ad_helper.dart';
// TODO: Import google_mobile_ads.dart
import 'package:google_mobile_ads/google_mobile_ads.dart';
class BannerInlinePage extends StatefulWidget {
...
}
- در کلاس
_BannerInlinePageState، اعضا و متدهای زیر را برای تبلیغات بنری اضافه کنید.
توجه داشته باشید که _kAdIndex نمایه ای را نشان می دهد که یک بنر تبلیغاتی در آن نمایش داده می شود و برای محاسبه شاخص آیتم از روش _getDestinationItemIndex() استفاده می شود.
banner_inline_page.dart
class _BannerInlinePageState extends State<BannerInlinePage> {
// TODO: Add _kAdIndex
static final _kAdIndex = 4;
// TODO: Add a banner ad instance
BannerAd? _ad;
...
// TODO: Add _getDestinationItemIndex()
int _getDestinationItemIndex(int rawIndex) {
if (rawIndex >= _kAdIndex && _ad != null) {
return rawIndex - 1;
}
return rawIndex;
}
...
}
- در متد
initState()یکBannerAdبرای بنر 320x50 ایجاد و بارگذاری کنید (AdSize.banner). توجه داشته باشید که شنونده رویداد تبلیغاتی برای بهروزرسانی رابط کاربری (setState()) هنگام بارگیری آگهی پیکربندی شده است.
banner_inline_page.dart
@override
void initState() {
super.initState();
// TODO: Load a banner ad
BannerAd(
adUnitId: AdHelper.bannerAdUnitId,
size: AdSize.banner,
request: AdRequest(),
listener: BannerAdListener(
onAdLoaded: (ad) {
setState(() {
_ad = ad as BannerAd;
});
},
onAdFailedToLoad: (ad, error) {
// Releases an ad resource when it fails to load
ad.dispose();
print('Ad load failed (code=${error.code} message=${error.message})');
},
),
).load();
}
- متد
build()را برای نمایش بنر تبلیغاتی در صورت موجود بودن تغییر دهید. -
itemCount,برای شمارش ورودی تبلیغات بنری، وitemBuilder,را بهروزرسانی کنید تا یک آگهی بنری را در فهرست آگهی (_kAdIndex) در هنگام بارگیری آگهی ارائه کنید. - کد را به روز کنید تا از متد
_getDestinationItemIndex()برای بازیابی فهرستی برای آیتم محتوا استفاده کنید.
banner_inline_page.dart
@override
Widget build(BuildContext context) {
return Scaffold(
...
body: ListView.builder(
// TODO: Adjust itemCount based on the ad load state
itemCount: widget.entries.length + (_ad != null ? 1 : 0),
itemBuilder: (context, index) {
// TODO: Render a banner ad
if (_ad != null && index == _kAdIndex) {
return Container(
width: _ad!.size.width.toDouble(),
height: 72.0,
alignment: Alignment.center,
child: AdWidget(ad: _ad!),
);
} else {
// TODO: Get adjusted item index from _getDestinationItemIndex()
final item = widget.entries[_getDestinationItemIndex(index)];
return ListTile(
...
);
}
},
),
);
}
- منبع مرتبط با شی
BannerAdرا با فراخوانی متدBannerAd.dispose()در متد callbackdispose()آزاد کنید.
banner_inline_page.dart
@override
void dispose() {
// TODO: Dispose a BannerAd object
_ad?.dispose();
super.dispose();
}
همین! پروژه را اجرا کنید و روی دکمه تبلیغات درون خطی بنر از صفحه اصلی کلیک کنید. پس از بارگذاری یک تبلیغ، یک بنر تبلیغاتی را در وسط لیست خواهید دید.


8. یک تبلیغ بومی اضافه کنید
در این بخش، همانطور که در تصویر زیر نشان داده شده است، یک تبلیغ بومی را در وسط لیست نمایش می دهید.

تبلیغات بومی با استفاده از مؤلفههای رابط کاربری که در پلتفرم بومی هستند به کاربران ارائه میشوند (مثلاً View در Android یا UIView در iOS).
با این حال، با استفاده از ویجتهای Flutter نمیتوان مؤلفههای رابط کاربری بومی را ایجاد کرد. بنابراین، شما باید یک NativeAdFactory برای هر پلتفرم پیادهسازی کنید، که برای ایجاد نمای تبلیغاتی بومی مخصوص پلتفرم ( NativeAdView در Android و GADNativeAdView در iOS) از یک شی تبلیغاتی بومی ( NativeAd در Android و GADNativeAd در iOS) استفاده میشود.
پیاده سازی NativeAdFactory برای اندروید (جاوا)
- فایل
android/build.gradle(یا هر فایلی که در پوشه اندروید است) را باز کنید و روی Open for Editing در Android Studio کلیک کنید تا یک پروژه Android باز شود.

- اگر از شما خواسته شد که پنجره ای را برای باز کردن یک پروژه جدید انتخاب کنید، روی New Window کلیک کنید تا پروژه Flutter در زمانی که روی پروژه Android کار می کنید باز بماند.

یک طرح تبلیغاتی بومی ایجاد کنید
- با باز شدن پروژه اندروید، روی برنامه از پنجره پروژه در Android Studio کلیک راست کرده و New > Android Resource File را از منوی زمینه انتخاب کنید.

- در محاوره New Resource File ،
list_tile_native_ad.xmlرا به عنوان نام فایل وارد کنید. - Layout را به عنوان نوع منبع انتخاب کنید و
com.google.android.gms.ads.nativead.NativeAdViewرا به عنوان عنصر ریشه وارد کنید. - برای ایجاد یک فایل طرح بندی جدید روی OK کلیک کنید.

- طرح تبلیغات را به صورت زیر پیاده سازی کنید. توجه داشته باشید که طرح باید با طراحی بصری تجربه کاربر برای پلتفرمی که برای آن در نظر گرفته شده مطابقت داشته باشد.
list_tile_native_ad.xml
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.gms.ads.nativead.NativeAdView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_list_tile_native_ad_attribution_small"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#F19938"
android:text="Ad"
android:textColor="#FFFFFF"
android:textSize="12sp" />
<ImageView
android:id="@+id/iv_list_tile_native_ad_icon"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_gravity="center_vertical"
android:layout_marginStart="16dp"
android:layout_marginLeft="16dp"
android:scaleType="fitXY"
tools:background="#EDEDED" />
<TextView
android:id="@+id/tv_list_tile_native_ad_attribution_large"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_gravity="center_vertical"
android:layout_marginStart="16dp"
android:layout_marginLeft="16dp"
android:background="#F19938"
android:gravity="center"
android:text="Ad"
android:textColor="#FFFFFF"
android:visibility="invisible" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="80dp"
android:layout_marginLeft="80dp"
android:layout_marginEnd="16dp"
android:layout_marginRight="16dp"
android:orientation="vertical">
<TextView
android:id="@+id/tv_list_tile_native_ad_headline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:lines="1"
android:maxLines="1"
android:textColor="#000000"
android:textSize="16sp"
tools:text="Headline" />
<TextView
android:id="@+id/tv_list_tile_native_ad_body"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:lines="1"
android:maxLines="1"
android:textColor="#828282"
android:textSize="14sp"
tools:text="body" />
</LinearLayout>
</FrameLayout>
</com.google.android.gms.ads.nativead.NativeAdView>
کلاس ListTileNativeAdFactory را ایجاد کنید
- در پنجره Project، روی بسته com.codelab.flutter.admobinlineads راست کلیک کرده و New > Java Class را انتخاب کنید.

-
ListTileNativeAdFactoryبه عنوان نام وارد کنید و Class را از لیست انتخاب کنید.

- پس از ظاهر شدن کادر گفتگوی New Class ، همه چیز را خالی بگذارید و روی OK کلیک کنید.
خواهید دید که کلاس ListTileNativeAdFactory در بسته com.codelab.flutter.admobinlineads ایجاد شده است.

- کلاس
ListTileNativeAdFactoryرا به صورت زیر پیاده سازی کنید. توجه داشته باشید که کلاس متدcreateNativeAd()در رابطGoogleMobileAdsPlugin.NativeAdFactoryپیاده سازی می کند.
کلاس factory مسئول ایجاد یک شیء view برای رندر کردن یک تبلیغ بومی است. همانطور که از کد می بینید، کلاس کارخانه یک UnifiedNativeAdView ایجاد می کند و آن را با یک شی NativeAd پر می کند.
ListTileNativeAdFactory.java
// TODO: Implement ListTileNativeAdFactory class
package com.codelab.flutter.admobinlineads;
import com.google.android.gms.ads.nativead.NativeAd;
import com.google.android.gms.ads.nativead.NativeAdView;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.Map;
import io.flutter.plugins.googlemobileads.GoogleMobileAdsPlugin;
class ListTileNativeAdFactory implements GoogleMobileAdsPlugin.NativeAdFactory {
private final Context context;
ListTileNativeAdFactory(Context context) {
this.context = context;
}
@Override
public NativeAdView createNativeAd(
NativeAd nativeAd, Map<String, Object> customOptions) {
NativeAdView nativeAdView = (NativeAdView) LayoutInflater.from(context)
.inflate(R.layout.list_tile_native_ad, null);
TextView attributionViewSmall = nativeAdView
.findViewById(R.id.tv_list_tile_native_ad_attribution_small);
TextView attributionViewLarge = nativeAdView
.findViewById(R.id.tv_list_tile_native_ad_attribution_large);
ImageView iconView = nativeAdView.findViewById(R.id.iv_list_tile_native_ad_icon);
NativeAd.Image icon = nativeAd.getIcon();
if (icon != null) {
attributionViewSmall.setVisibility(View.VISIBLE);
attributionViewLarge.setVisibility(View.INVISIBLE);
iconView.setImageDrawable(icon.getDrawable());
} else {
attributionViewSmall.setVisibility(View.INVISIBLE);
attributionViewLarge.setVisibility(View.VISIBLE);
}
nativeAdView.setIconView(iconView);
TextView headlineView = nativeAdView.findViewById(R.id.tv_list_tile_native_ad_headline);
headlineView.setText(nativeAd.getHeadline());
nativeAdView.setHeadlineView(headlineView);
TextView bodyView = nativeAdView.findViewById(R.id.tv_list_tile_native_ad_body);
bodyView.setText(nativeAd.getBody());
bodyView.setVisibility(nativeAd.getBody() != null ? View.VISIBLE : View.INVISIBLE);
nativeAdView.setBodyView(bodyView);
nativeAdView.setNativeAd(nativeAd);
return nativeAdView;
}
}
کلاس ListTileNativeAdFactory را ثبت کنید
یک نمونه از NativeAdFactory باید قبل از استفاده از Flutter در GoogleMobileAdsPlugin ثبت شود.
- فایل
MainActivity.javaرا باز کنید و متدconfigureFlutterEngine()و متدcleanUpFlutterEngine()را لغو کنید. - کلاس
ListTileNativeAdFactoryرا با یک شناسه رشته منحصر به فرد (listTile) در متدconfigureFlutterEngine()ثبت کنید.
MainActivity.java
public class MainActivity extends FlutterActivity {
@Override
public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
super.configureFlutterEngine(flutterEngine);
// TODO: Register the ListTileNativeAdFactory
GoogleMobileAdsPlugin.registerNativeAdFactory(flutterEngine, "listTile",
new ListTileNativeAdFactory(getContext()));
}
...
}
- هر نمونه
NativeAdFactoryباید در طول فرآیند پاکسازی از ثبت خارج شود. کلاسListTileNativeAdFactoryرا در متدcleanUpFlutterEngine()لغو ثبت کنید.
MainActivity.java
public class MainActivity extends FlutterActivity {
...
@Override
public void cleanUpFlutterEngine(@NonNull FlutterEngine flutterEngine) {
super.cleanUpFlutterEngine(flutterEngine);
// TODO: Unregister the ListTileNativeAdFactory
GoogleMobileAdsPlugin.unregisterNativeAdFactory(flutterEngine, "listTile");
}
}
اکنون شما آماده استفاده از کلاس ListTileNativeAdFactory برای ارائه تبلیغات بومی در اندروید هستید.
پیاده سازی NativeAdFactory برای اندروید (Kotlin)
- فایل
android/build.gradle(یا هر فایلی که در پوشه اندروید است) را باز کنید و روی Open for Editing در Android Studio کلیک کنید تا یک پروژه Android باز شود.

- اگر از شما خواسته شد که پنجره ای را برای باز کردن یک پروژه جدید انتخاب کنید، روی New Window کلیک کنید تا پروژه Flutter در زمانی که روی پروژه Android کار می کنید باز بماند.

یک طرح تبلیغاتی بومی ایجاد کنید
- با باز شدن پروژه اندروید، روی برنامه از پنجره پروژه در Android Studio کلیک راست کرده و New > Android Resource File را از منوی زمینه انتخاب کنید.

- در محاوره New Resource File ،
list_tile_native_ad.xmlرا به عنوان نام فایل وارد کنید. - Layout را به عنوان نوع منبع انتخاب کنید و
com.google.android.gms.ads.nativead.NativeAdViewرا به عنوان عنصر ریشه وارد کنید. - برای ایجاد یک فایل طرح بندی جدید روی OK کلیک کنید.

- طرح تبلیغات را به صورت زیر پیاده سازی کنید. توجه داشته باشید که طرح باید با طراحی بصری تجربه کاربر برای پلتفرمی که برای آن در نظر گرفته شده مطابقت داشته باشد.
list_tile_native_ad.xml
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.gms.ads.nativead.NativeAdView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_list_tile_native_ad_attribution_small"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#F19938"
android:text="Ad"
android:textColor="#FFFFFF"
android:textSize="12sp" />
<ImageView
android:id="@+id/iv_list_tile_native_ad_icon"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_gravity="center_vertical"
android:layout_marginStart="16dp"
android:layout_marginLeft="16dp"
android:scaleType="fitXY"
tools:background="#EDEDED" />
<TextView
android:id="@+id/tv_list_tile_native_ad_attribution_large"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_gravity="center_vertical"
android:layout_marginStart="16dp"
android:layout_marginLeft="16dp"
android:background="#F19938"
android:gravity="center"
android:text="Ad"
android:textColor="#FFFFFF"
android:visibility="invisible" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="80dp"
android:layout_marginLeft="80dp"
android:layout_marginEnd="16dp"
android:layout_marginRight="16dp"
android:orientation="vertical">
<TextView
android:id="@+id/tv_list_tile_native_ad_headline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:lines="1"
android:maxLines="1"
android:textColor="#000000"
android:textSize="16sp"
tools:text="Headline" />
<TextView
android:id="@+id/tv_list_tile_native_ad_body"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:lines="1"
android:maxLines="1"
android:textColor="#828282"
android:textSize="14sp"
tools:text="body" />
</LinearLayout>
</FrameLayout>
</com.google.android.gms.ads.nativead.NativeAdView>
کلاس ListTileNativeAdFactory را ایجاد کنید
- در پنجره Project، روی بسته com.codelab.flutter.admobinlineads راست کلیک کرده و New > Kotlin File/Class را انتخاب کنید.

-
ListTileNativeAdFactoryبه عنوان نام وارد کنید و Class را از لیست انتخاب کنید.

- خواهید دید که کلاس
ListTileNativeAdFactoryدر بستهcom.codelab.flutter.admobinlineadsایجاد شده است. - کلاس
ListTileNativeAdFactoryرا به صورت زیر پیاده سازی کنید. توجه داشته باشید که کلاس متدcreateNativeAd()در رابطGoogleMobileAdsPlugin.NativeAdFactoryپیاده سازی می کند.
کلاس factory مسئول ایجاد یک شیء view برای رندر کردن یک تبلیغ بومی است. همانطور که از کد می بینید، کلاس کارخانه یک NativeAdView ایجاد می کند و آن را با یک شی NativeAd پر می کند.
ListTileNativeAdFactory.kt
// TODO: Implement ListTileNativeAdFactory class
package com.codelab.flutter.admobinlineads
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.widget.ImageView
import android.widget.TextView
import com.google.android.gms.ads.nativead.NativeAd
import com.google.android.gms.ads.nativead.NativeAdView
import io.flutter.plugins.googlemobileads.GoogleMobileAdsPlugin
class ListTileNativeAdFactory(val context: Context) : GoogleMobileAdsPlugin.NativeAdFactory {
override fun createNativeAd(
nativeAd: NativeAd,
customOptions: MutableMap<String, Any>?
): NativeAdView {
val nativeAdView = LayoutInflater.from(context)
.inflate(R.layout.list_tile_native_ad, null) as NativeAdView
with(nativeAdView) {
val attributionViewSmall =
findViewById<TextView>(R.id.tv_list_tile_native_ad_attribution_small)
val attributionViewLarge =
findViewById<TextView>(R.id.tv_list_tile_native_ad_attribution_large)
val iconView = findViewById<ImageView>(R.id.iv_list_tile_native_ad_icon)
val icon = nativeAd.icon
if (icon != null) {
attributionViewSmall.visibility = View.VISIBLE
attributionViewLarge.visibility = View.INVISIBLE
iconView.setImageDrawable(icon.drawable)
} else {
attributionViewSmall.visibility = View.INVISIBLE
attributionViewLarge.visibility = View.VISIBLE
}
this.iconView = iconView
val headlineView = findViewById<TextView>(R.id.tv_list_tile_native_ad_headline)
headlineView.text = nativeAd.headline
this.headlineView = headlineView
val bodyView = findViewById<TextView>(R.id.tv_list_tile_native_ad_body)
with(bodyView) {
text = nativeAd.body
visibility = if (nativeAd.body.isNotEmpty()) View.VISIBLE else View.INVISIBLE
}
this.bodyView = bodyView
setNativeAd(nativeAd)
}
return nativeAdView
}
}
کلاس ListTileNativeAdFactory را ثبت کنید
یک نمونه از NativeAdFactory باید قبل از استفاده از Flutter در GoogleMobileAdsPlugin ثبت شود.
- فایل
MainActivity.ktرا باز کنید و متدconfigureFlutterEngine()و متدcleanUpFlutterEngine()را لغو کنید. - کلاس
ListTileNativeAdFactoryرا با یک شناسه رشته منحصر به فرد (listTile) در متدconfigureFlutterEngine()ثبت کنید.
MainActivity.kt
class MainActivity: FlutterActivity() {
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
// TODO: Register the ListTileNativeAdFactory
GoogleMobileAdsPlugin.registerNativeAdFactory(
flutterEngine, "listTile", ListTileNativeAdFactory(context))
}
...
}
- هر نمونه
NativeAdFactoryباید در طول فرآیند پاکسازی از ثبت خارج شود. کلاسListTileNativeAdFactoryرا در متدcleanUpFlutterEngine()لغو ثبت کنید.
MainActivity.kt
class MainActivity: FlutterActivity() {
...
override fun cleanUpFlutterEngine(flutterEngine: FlutterEngine) {
super.cleanUpFlutterEngine(flutterEngine)
// TODO: Unregister the ListTileNativeAdFactory
GoogleMobileAdsPlugin.unregisterNativeAdFactory(flutterEngine, "listTile")
}
}
اکنون شما آماده استفاده از کلاس ListTileNativeAdFactory برای ارائه تبلیغات بومی در اندروید هستید.
پیاده سازی NativeAdFactory برای iOS (Objective-C)
فایل ios/Podfile (یا هر فایل زیر پوشه ios ) را باز کنید و روی Open iOS module در Xcode کلیک کنید تا پروژه iOS باز شود.

یک طرح تبلیغاتی بومی تهیه کنید
برای چیدمان دارایی های تبلیغاتی بومی باید یک نمای سفارشی ( *.xib ) داشته باشید. در این کد لبه، نمای از پیش تنظیم شده برای به حداقل رساندن تلاش شما استفاده می شود.
با باز شدن پروژه iOS در Xcode، تأیید کنید که ListTileNativeAdView.xib در پروژه Runner وجود دارد.

کلاس ListTileNativeAdFactory را ایجاد کنید
- از ناوبر پروژه، روی گروه Runner کلیک راست کرده و New File را انتخاب کنید تا یک فایل هدر برای کلاس جدید ایجاد شود.

- در گفتگوی الگو، فایل Header را انتخاب کنید و نام آن را
ListTileNativeAdFactoryبگذارید. - پس از ایجاد فایل
ListTileNativeAdFactory.h، کلاسListNativeAdFactoryرا به صورت زیر تعریف کنید:
ListTileNativeAdFactory.h
#ifndef ListTileNativeAdFactory_h
#define ListTileNativeAdFactory_h
// TODO: Import FLTGoogleMobileAdsPlugin.h
#import "FLTGoogleMobileAdsPlugin.h"
// TODO: Declare ListTileNativeAdFactory
@interface ListTileNativeAdFactory : NSObject<FLTNativeAdFactory>
@end
#endif /* ListTileNativeAdFactory_h */
- با انتخاب New File از گروه Runner یک فایل Objective-C ایجاد کنید.
- در گفتگوی بعدی،
ListTileNativeAdFactoryدر قسمت File وارد کنید و Empty File را به عنوان نوع فایل انتخاب کنید.

- بعد از اینکه روی Next کلیک کردید، از شما خواسته می شود که پوشه ای را انتخاب کنید که فایل جدید باید در آن ایجاد شود. همه چیز را بدون تغییر رها کنید و روی ایجاد کلیک کنید.

- کلاس
ListTileNativeFactoryرا به صورت زیر پیاده سازی کنید. توجه داشته باشید که کلاس متدcreateNativeAd()در پروتکلFLTNativeAdFactoryپیاده سازی می کند.
کلاس factory مسئول ایجاد یک شیء view برای رندر کردن یک تبلیغ بومی است. همانطور که از کد می بینید، کلاس کارخانه یک GADNativeAdView ایجاد می کند و آن را با یک شی GADNativeAd پر می کند.
ListTileNativeAdFactory.m
// TODO: Import ListTileNativeAdFactory.h
#import "ListTileNativeAdFactory.h"
// TODO: Implement ListTileNativeAdFactory
@implementation ListTileNativeAdFactory
- (GADNativeAdView *)createNativeAd:(GADNativeAd *)nativeAd
customOptions:(NSDictionary *)customOptions {
GADNativeAdView *nativeAdView =
[[NSBundle mainBundle] loadNibNamed:@"ListTileNativeAdView" owner:nil options:nil].firstObject;
((UILabel *)nativeAdView.headlineView).text = nativeAd.headline;
((UILabel *)nativeAdView.bodyView).text = nativeAd.body;
nativeAdView.bodyView.hidden = nativeAd.body ? NO : YES;
((UIImageView *)nativeAdView.iconView).image = nativeAd.icon.image;
nativeAdView.iconView.hidden = nativeAd.icon ? NO : YES;
nativeAdView.callToActionView.userInteractionEnabled = NO;
nativeAdView.nativeAd = nativeAd;
return nativeAdView;
}
@end
کلاس ListTileNativeAdFacotry را ثبت کنید
اجرای یک FLTNativeAdFactory باید قبل از استفاده از Flutter در FLTGoogleMobileAdsPlugin ثبت شود.
فایل AppDelegate.m را باز کنید و ListTileNativeAdFactory را با یک شناسه رشته منحصر به فرد ( listTile ) با فراخوانی روش [FLTGoogleMobileAdsPlugin registerNativeAdFactory] ثبت کنید.
AppDelegate.m
#import "AppDelegate.h"
#import "GeneratedPluginRegistrant.h"
// TODO: Import ListTileNativeAdFactory.h
#import "ListTileNativeAdFactory.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[GeneratedPluginRegistrant registerWithRegistry:self];
// TODO: Register ListTileNativeAdFactory
ListTileNativeAdFactory *listTileFactory = [[ListTileNativeAdFactory alloc] init];
[FLTGoogleMobileAdsPlugin registerNativeAdFactory:self
factoryId:@"listTile"
nativeAdFactory:listTileFactory];
// Override point for customization after application launch.
return [super application:application didFinishLaunchingWithOptions:launchOptions];
}
@end
اکنون شما آماده استفاده از ListTileNativeAdFactory برای ارائه تبلیغات بومی در iOS هستید.
پیاده سازی NativeAdFactory برای iOS (Swift)
فایل ios/Podfile (یا هر فایل زیر پوشه ios ) را باز کنید و روی Open iOS module در Xcode کلیک کنید تا پروژه iOS باز شود.

یک طرح تبلیغاتی بومی تهیه کنید
برای چیدمان دارایی های تبلیغاتی بومی باید یک نمای سفارشی ( *.xib ) داشته باشید. در این کد لبه، نمای از پیش تنظیم شده برای به حداقل رساندن تلاش شما استفاده می شود.
با باز شدن پروژه iOS در Xcode، تأیید کنید که ListTileNativeAdView.xib در پروژه Runner وجود دارد.

کلاس ListTileNativeAdFactory را ایجاد کنید
- از ناوبر پروژه، روی گروه Runner کلیک راست کرده و New File را انتخاب کنید تا یک فایل هدر برای کلاس جدید ایجاد شود.

- در گفتگوی الگو، فایل Swift را انتخاب کنید و نام آن را
ListTileNativeAdFactoryبگذارید. - پس از ایجاد فایل
ListTileNativeAdFactory.swift، کلاسListNativeAdFactoryرا پیاده سازی کنید.
توجه داشته باشید که کلاس متد createNativeAd() در پروتکل FLTNativeAdFactory پیاده سازی می کند.
کلاس factory مسئول ایجاد یک شیء view برای رندر کردن یک تبلیغ بومی است. همانطور که از کد می بینید، کلاس کارخانه یک GADNativeAdView ایجاد می کند و آن را با یک شی GADNativeAd پر می کند.
ListTileNativeAdFactory.swift
// TODO: Import google_mobile_ads
import google_mobile_ads
// TODO: Implement ListTileNativeAdFactory
class ListTileNativeAdFactory : FLTNativeAdFactory {
func createNativeAd(_ nativeAd: GADNativeAd,
customOptions: [AnyHashable : Any]? = nil) -> GADNativeAdView? {
let nibView = Bundle.main.loadNibNamed("ListTileNativeAdView", owner: nil, options: nil)!.first
let nativeAdView = nibView as! GADNativeAdView
(nativeAdView.headlineView as! UILabel).text = nativeAd.headline
(nativeAdView.bodyView as! UILabel).text = nativeAd.body
nativeAdView.bodyView!.isHidden = nativeAd.body == nil
(nativeAdView.iconView as! UIImageView).image = nativeAd.icon?.image
nativeAdView.iconView!.isHidden = nativeAd.icon == nil
nativeAdView.callToActionView?.isUserInteractionEnabled = false
nativeAdView.nativeAd = nativeAd
return nativeAdView
}
}
کلاس ListTileNativeAdFacotry را ثبت کنید
اجرای یک FLTNativeAdFactory باید قبل از استفاده از Flutter در FLTGoogleMobileAdsPlugin ثبت شود.
فایل AppDelegate.m را باز کنید و ListTileNativeAdFactory را با یک شناسه رشته منحصر به فرد ( listTile ) با فراخوانی متد FLTGoogleMobileAdsPlugin.registerNativeAdFactory() ثبت کنید.
AppDelegate.swift
import UIKit
import Flutter
// TODO: Import google_mobile_ads
import google_mobile_ads
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
GeneratedPluginRegistrant.register(with: self)
// TODO: Register ListTileNativeAdFactory
let listTileFactory = ListTileNativeAdFactory()
FLTGoogleMobileAdsPlugin.registerNativeAdFactory(
self, factoryId: "listTile", nativeAdFactory: listTileFactory)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
}
اکنون شما آماده استفاده از ListTileNativeAdFactory برای ارائه تبلیغات بومی در iOS هستید.
تبلیغات بومی را با ویجت های Flutter ادغام کنید
- فایل
lib/native_inline_page.dartرا باز کنید. سپسad_helper.dartوgoogle_mobile_ads.dartرا با افزودن خطوط زیر وارد کنید:
native_inline_page.dart
...
// TODO: Import ad_helper.dart
import 'package:admob_inline_ads_in_flutter/ad_helper.dart';
// TODO: Import google_mobile_ads.dart
import 'package:google_mobile_ads/google_mobile_ads.dart';
class NativeInlinePage extends StatefulWidget {
...
}
- در کلاس
_NativeInlinePageState، اعضا و متدهای زیر را برای یک تبلیغ بومی اضافه کنید.
توجه داشته باشید که _kAdIndex نمایه ای را نشان می دهد که یک بنر تبلیغاتی در آن نمایش داده می شود و برای محاسبه شاخص آیتم از روش _getDestinationItemIndex() استفاده می شود.
native_inline_page.dart
class _NativeInlinePageState extends State<NativeInlinePage> {
// TODO: Add _kAdIndex
static final _kAdIndex = 4;
// TODO: Add a native ad instance
NativeAd? _ad;
...
// TODO: Add _getDestinationItemIndex()
int _getDestinationItemIndex(int rawIndex) {
if (rawIndex >= _kAdIndex && _ad != null) {
return rawIndex - 1;
}
return rawIndex;
}
...
}
- در متد
initState()یکNativeAdایجاد و بارگذاری کنید که ازListTileNativeAdFactoryبرای تولید نمای تبلیغاتی بومی استفاده می کند.
توجه داشته باشید که همان شناسه کارخانه ( listTile ) که برای ثبت کارخانه در افزونه استفاده می شود استفاده می شود.
native_inline_page.dart
@override
void initState() {
super.initState();
// TODO: Create a NativeAd instance
_ad = NativeAd(
adUnitId: AdHelper.nativeAdUnitId,
factoryId: 'listTile',
request: AdRequest(),
listener: NativeAdListener(
onAdLoaded: (ad) {
setState(() {
_ad = ad as NativeAd;
});
},
onAdFailedToLoad: (ad, error) {
// Releases an ad resource when it fails to load
ad.dispose();
print('Ad load failed (code=${error.code} message=${error.message})'); },
),
);
_ad.load();
}
- متد
build()را برای نمایش بنر تبلیغاتی در صورت موجود بودن تغییر دهید. -
itemCount,برای شمارش ورودی تبلیغات بنری، وitemBuilder,را بهروزرسانی کنید تا یک آگهی بنری را در فهرست آگهی (_kAdIndex) در هنگام بارگیری آگهی ارائه کنید. - کد را به روز کنید تا از متد
_getDestinationItemIndex()برای بازیابی فهرستی برای آیتم محتوا استفاده کنید.
native_inline_page.dart
@override
Widget build(BuildContext context) {
return Scaffold(
...
body: ListView.builder(
// TODO: Adjust itemCount based on the ad load state
itemCount: widget.entries.length + (_ad != null ? 1 : 0),
itemBuilder: (context, index) {
// TODO: Render a banner ad
if (_ad != null && index == _kAdIndex) {
return Container(
height: 72.0,
alignment: Alignment.center,
child: AdWidget(ad: _ad!),
);
} else {
// TODO: Get adjusted item index from _getDestinationItemIndex()
final item = widget.entries[_getDestinationItemIndex(index)];
return ListTile(
...
);
}
},
),
);
}
- منبع مرتبط با شی
NativeAdرا با فراخوانی متدNativeAd.dispose()در روش callbackdispose()آزاد کنید.
native_inline_page.dart
@override
void dispose() {
// TODO: Dispose a NativeAd object
_ad?.dispose();
super.dispose();
}
همین! پروژه را اجرا کنید و روی دکمه Native inline ad از صفحه اصلی کلیک کنید. پس از بارگذاری یک تبلیغ، یک آگهی بومی در وسط لیست خواهید دید.


9. همه چیز تمام شد!
شما برنامه کد را تکمیل کردید. شما می توانید کد تکمیل شده برای این آزمایشگاه کد را در آدرس زیر بیابید
کامل یا
پوشه full_kotlin_swift .

