はじめに
とあるFlutterアプリに、Google Admobのネイティブアドバンス広告を付けることになりました。実装のやり方は2種類あるようです。
※今回は「2」のみご紹介します。
- Android,iOSそれぞれネイティブ言語で実装
- google_mobile_adsパッケージのテンプレートを使う
そもそもネイティブ広告は、プラットフォームごとにUIをカスタマイズし、アプリ内に自然に溶け込むようにすることでユーザーにストレスがかからないような広告を表示することができます。それをパッケージのテンプレートを使ってDartだけで作れるようにしたのが2です。1に関しては、codelabsに詳しい手順が乗っているのでご参照ください。
今回はgoogle_mobile_adsパッケージに用意されたテンプレートで実装するやり方にしました。説明用に、広告が読み込まれたら表示するだけのアプリにしています。
参考:https://developers.google.com/admob/flutter/native?hl=ja
※Admob管理パネルでのアプリ追加、広告ユニット追加等は説明しません。
環境
実装
AndroidManifest.xmlにアプリIDを追加。今回はAndroidのテスト用アプリID。
<meta-data
android:name="com.google.android.gms.ads.APPLICATION_ID"
android:value="ca-app-pub-3940256099942544~3347511713"/>
Info.plistにもアプリIDを追加。今回はiOSのテスト用アプリID。
<key>GADApplicationIdentifier</key>
<string>ca-app-pub-3940256099942544~1458002511</string>
そして全体のコードになります。
こちらのコードをコピペして"flutter pub get"すればとりあえずAndroidデバイスで動くと思います。
import 'package:flutter/material.dart'; import 'package:google_mobile_ads/google_mobile_ads.dart'; void main() { //GoogleMobileAdsSDKの初期化 WidgetsFlutterBinding.ensureInitialized(); MobileAds.instance.initialize(); runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( title: 'Native Advance Ad Demo', home: const DemoPage(), ); } } class DemoPage extends StatefulWidget { const DemoPage({super.key}); @override State<DemoPage> createState() => _DemoPageState(); } class _DemoPageState extends State<DemoPage> { NativeAd? _nativeAd; //アプリの広告ユニットIDを入れる //今回の場合Androidのネイティブテスト広告ID final String _adUnitId = "ca-app-pub-3940256099942544/2247696110"; @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.white, body: Center( child: _nativeAd != null ? ConstrainedBox( constraints: const BoxConstraints( minWidth: 200, minHeight: 200, maxWidth: 300, maxHeight: 300, ), child: AdWidget(ad: _nativeAd!), ) : const Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text('ネイティブ広告を読み込み中'), SizedBox(height: 15), CircularProgressIndicator( color: Colors.black, ), ], ), ), ); } @override void initState() { super.initState(); //広告を読み込む _loadNativeAd(); } void _loadNativeAd() { NativeAd( adUnitId: _adUnitId, listener: NativeAdListener( onAdLoaded: (ad) { setState(() { //広告が読み込まれたことを通知 _nativeAd = ad as NativeAd; }); }, onAdFailedToLoad: (ad, error) { print('failed'); print(error); ad.dispose(); _nativeAd = null; }, ), request: const AdRequest(), nativeTemplateStyle: NativeTemplateStyle( templateType: TemplateType.medium, mainBackgroundColor: Colors.white, cornerRadius: 10.0, callToActionTextStyle: NativeTemplateTextStyle( textColor: const Color(0xFFECE9F3), backgroundColor: Colors.black, style: NativeTemplateFontStyle.monospace, size: 16.0, ), primaryTextStyle: NativeTemplateTextStyle( textColor: Colors.black, backgroundColor: const Color(0xFFECE9F3), style: NativeTemplateFontStyle.italic, size: 16.0, ), secondaryTextStyle: NativeTemplateTextStyle( textColor: Colors.green, backgroundColor: Colors.black, style: NativeTemplateFontStyle.bold, size: 16.0, ), tertiaryTextStyle: NativeTemplateTextStyle( textColor: Colors.black, backgroundColor: const Color(0xFFECE9F3), style: NativeTemplateFontStyle.normal, size: 16.0, ), ), ).load(); } @override void dispose() { _nativeAd?.dispose(); super.dispose(); } }
コードの説明
_loadNativeAd()でネイティブ広告の読み込みを行っています。
この時_adUnitIdには適切な広告ユニットIDを指定してください。
読み込みが完了したらNativeAdオブジェクトを取得し、AdWidget()で広告を表示しています。nativeTemplateStyle以下では広告のスタイルを指定しています。詳しくは、NativeTemplateStyleをご参照ください。
そしてNativeAdは不要になったら必ずdisposeでリリースしてあげます。
今回極力シンプルにしていますが、広告ユニットIDの管理クラスやエラー処理は適宜追加してください。
以上。