Flutter RewardedAds开发出现Strict Secure Cookie政策错误如何解决?
Flutter RewardedAds 报错解决方案
首先你遇到的两类报错原因和对应修复方案如下:
报错1:Strict Secure Cookie policy 安全策略报错
该报错是Android 11(API 30及以上)系统对非HTTPS请求的安全限制导致,Google Ads旧版本SDK内部请求用到了HTTP域名触发了Cookie规则,修复步骤如下:
- 第一步:修改Android清单文件配置
打开android/app/src/main/AndroidManifest.xml,在<application>标签中添加允许明文流量的属性:<application android:name="io.flutter.app.FlutterApplication" android:label="admobdemo" <!-- 新增下面这行配置 --> android:usesCleartextTraffic="true" android:icon="@mipmap/ic_launcher"> - 第二步:单独配置广告域名的安全规则(上一步不生效时补充)
在android/app/src/main/res目录下新建xml文件夹,创建network_security_config.xml文件,内容如下:
回到AndroidManifest.xml的<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config cleartextTrafficPermitted="true"> <domain includeSubdomains="true">googleads.g.doubleclick.net</domain> <domain includeSubdomains="true">doubleclick.net</domain> </domain-config> </network-security-config><application>标签,额外添加属性关联配置文件:android:networkSecurityConfig="@xml/network_security_config" - 第三步:升级Google Ads SDK
旧版本google_mobile_ads依赖本身存在Cookie适配问题,升级到最新版本即可修复绝大多数场景的该报错,修改pubspec.yaml依赖:dependencies: google_mobile_ads: ^2.3.0 # 替换为pub.dev上的最新稳定版即可
报错2:Ad failed to load : 3
该错误是Admob官方定义的「无广告填充」错误,你当前用的是官方测试ID,出现该问题大多是测试环境配置问题,修复步骤如下:
- 检查当前网络环境可以正常访问Google服务,国内网络需要特殊网络配置才能正常加载测试广告
- 确认你的测试设备已经添加到Admob后台的测试设备列表,使用测试ID时可以打开手机开发者选项,开启「允许模拟位置」权限
- 调整广告加载逻辑,添加失败重试机制,修改
admob_controller.dart的createRewardAd方法:void createRewardAd({int retryCount = 0}) { RewardedAd.load( adUnitId: AdHelper.rewardedAdUnitId, request: AdRequest(), rewardedAdLoadCallback: RewardedAdLoadCallback( onAdLoaded: (RewardedAd ad) { print('$ad loaded.'); this._rewardedAd = ad; }, onAdFailedToLoad: (LoadAdError error) { print('RewardedAd failed to load: $error'); // 加载失败最多重试3次,每次间隔2秒 if(retryCount < 3) { Future.delayed(const Duration(seconds: 2), () { createRewardAd(retryCount: retryCount + 1); }); } }, )); } - 修复广告展示逻辑的时序问题:你当前的代码是先调用
show再设置回调,会导致回调不触发,修改showRewardAd方法如下:void showRewardAd() { // 先判断广告是否加载完成,避免空指针崩溃 if(_rewardedAd == null) { print("广告未加载完成,请先点击加载按钮"); return; } // 先设置回调再调用show方法 _rewardedAd.fullScreenContentCallback = FullScreenContentCallback( onAdShowedFullScreenContent: (RewardedAd ad) => print('$ad onAdShowedFullScreenContent.'), onAdDismissedFullScreenContent: (RewardedAd ad) { print('$ad onAdDismissedFullScreenContent.'); ad.dispose(); // 广告关闭后预加载下一条广告 createRewardAd(); }, onAdFailedToShowFullScreenContent: (RewardedAd ad, AdError error) { print('$ad onAdFailedToShowFullScreenContent: $error'); ad.dispose(); }, onAdImpression: (RewardedAd ad) => print('$ad impression occurred.'), ); _rewardedAd.show( onUserEarnedReward: (RewardedAd ad, RewardItem rewardItem) { print("广告奖励为 ${rewardItem.amount}"); }); }
内容的提问来源于stack exchange,提问作者Rajesh Shiyal
相关产品推荐
相关产品推荐

