开发应用时,经常需要思考:怎样自然地展示广告,又不损害
用户体验
?激励广告让用户自愿参与,并获得对应奖励,是一种很有用的形式。
本文介绍如何在Flutter应用中接入Google AdMob的
激励插屏广告(Rewarded Interstitial Ad)
,重点说明点击按钮展示广告,以及根据观看结果处理业务逻辑。
首先在Google AdMob申请广告ID,并安装Flutter依赖。
进入Google AdMob↗ ,注册应用。
创建广告单元ID,本例选择激励插屏广告
。
在Flutter项目中添加google_mobile_ads。
flutter pub add google_mobile_ads
添加Android与iOS所需配置。
Android需要在AndroidManifest.xml中加入以下权限与元数据。
<!-- AndroidManifest.xml -->
< manifest >
< application >
< meta-data
android:name = "com.google.android.gms.ads.APPLICATION_ID"
android:value = "ca-app-pub-xxxxxxxxxxxxxxxx~yyyyyyyyyy" />
</ application >
</ manifest >
< key >GADApplicationIdentifier</ key >
< string >ca-app-pub-xxxxxxxxxxxxxxxx~yyyyyyyyyy</ string >
应用启动时,初始化AdMob SDK。
main.dart import 'dart:developer' ;
import 'package:flutter/material.dart' ;
import 'package:google_mobile_ads/google_mobile_ads.dart' ;
class RewardedInterstitialAdExample extends StatefulWidget {
const RewardedInterstitialAdExample ({ super .key});
@override
RewardedInterstitialAdExampleState createState () =>
RewardedInterstitialAdExampleState ();
}
class RewardedInterstitialAdExampleState
extends State < RewardedInterstitialAdExample > {
RewardedInterstitialAd ? _rewardedInterstitialAd;
bool _isAdLoaded = false ;
void _loadAd () {
RewardedInterstitialAd . load (
adUnitId : 'ca-app-pub-3940256099942544/5354046379' , // 테스트 ID
request : const AdRequest (),
rewardedInterstitialAdLoadCallback : RewardedInterstitialAdLoadCallback (
onAdLoaded : (ad) {
log ( 'onAdLoaded: 광고 로드 완료' );
setState (() {
_rewardedInterstitialAd = ad;
_isAdLoaded = true ;
});
},
onAdFailedToLoad : (error) {
log ( 'onAdFailedToLoad: 광고 로드 실패: $ error ' );
},
),
);
}
void _showAd () {
if (_isAdLoaded && _rewardedInterstitialAd != null ) {
_rewardedInterstitialAd ! .fullScreenContentCallback =
FullScreenContentCallback (
onAdDismissedFullScreenContent : (ad) {
log ( 'onAdDismissedFullScreenContent: 광고가 닫혔습니다.' );
ad. dispose ();
},
onAdFailedToShowFullScreenContent : (ad, error) {
log ( 'onAdFailedToShowFullScreenContent: 광고 표시 실패: $ error ' );
},
);
_rewardedInterstitialAd ! . show (onUserEarnedReward : (ad, reward) {
log ( 'onUserEarnedReward: 사용자가 보상을 획득했습니다: ${ reward . amount } ${ reward . type } ' );
// 보상 로직 처리
});
_rewardedInterstitialAd = null ;
_isAdLoaded = false ;
} else {
log ( 'onAdFailedToShowFullScreenContent: 광고가 아직 준비되지 않았습니다.' );
}
}
@override
void initState () {
super . initState ();
_loadAd ();
}
@override
Widget build ( BuildContext context) {
return Scaffold (
appBar : AppBar (title : const Text ( '보상형 전면 광고 예제' )),
body : Center (
child : ElevatedButton (
onPressed : _showAd,
child : const Text ( '광고 보기' ),
),
),
);
}
}
在示例中,广告准备好后,通过按钮展示。用户完整观看后,会触发
奖励事件onUserEarnedReward
,此时可以发放奖励。
显示测试广告
合理管理广告状态,可以改善用户体验。例如,广告结束后重新加载下一条广告,或在没有广告时禁用按钮。
可以通过
_isAdLoaded控制按钮是否可用,也应监听加载失败和关闭事件,让应用流程保持自然。
广告生命周期管理
可以通过以下回调实现:
onAdLoaded:广告加载完成时调用。
onAdFailedToLoad:加载失败时调用。
onAdDismissedFullScreenContent:观看结束、关闭后重新加载时调用。
onAdFailedToShowFullScreenContent:展示失败时调用。
onUserEarnedReward:用户获得奖励时调用。
正常运行时的日志
AdGuard广告拦截运行时的日志
onAdFailedToLoad: 광고 로드 실패: LoadAdError(code: 0, domain: com.google.android.gms.ads, message: Error while connecting to ad server: Unable to resolve host "googleads.g.doubleclick.net": No address associated with hostname, responseInfo: ResponseInfo(responseId: null, mediationAdapterClassName: , adapterResponses: [], loadedAdapterResponseInfo: null), responseExtras: {})
合理监听这些事件,设计好广告流程,还可以实现服务器日志记录等功能。
激励插屏广告能够自然地引导用户参与,并为应用创造收入。Flutter通过
google_mobile_ads可以方便地接入,再结合事件监听和状态管理,形成流畅的广告体验。
本文覆盖了AdMob配置、Flutter代码和事件监听的整体流程。请先使用测试广告练习,确认正常后再替换为正式广告ID。