Flutter应用内购移除Admob插屏与激励广告技术问询
解决方案:内购后禁用Admob插屏与激励广告
我来帮你搞定这个问题——核心思路就是在加载和展示广告前,先检查用户是否已经购买了移除广告的内购套餐。我们需要先把内购状态持久化存到本地,然后在广告相关的代码里加判断逻辑,只要用户已购买,就跳过广告的加载和展示流程。
1. 先持久化存储内购状态
当用户完成移除广告的内购后,把这个购买状态保存到本地(这里用常用的SharedPreferences举例):
import 'package:shared_preferences/shared_preferences.dart'; // 保存用户是否已购买无广告套餐的状态 Future<void> setAdRemovedStatus(bool isPurchased) async { final prefs = await SharedPreferences.getInstance(); await prefs.setBool('has_removed_ads', isPurchased); } // 获取用户是否已购买无广告套餐 Future<bool> getAdRemovedStatus() async { final prefs = await SharedPreferences.getInstance(); // 默认返回false,即未购买 return prefs.getBool('has_removed_ads') ?? false; }
2. 修改插屏广告代码
在加载和显示插屏广告前,先判断用户的购买状态,已购买就不执行广告逻辑:
// 先获取内购状态 bool hasRemovedAds = await getAdRemovedStatus(); if (!hasRemovedAds) { InterstitialAd myInterstitial = InterstitialAd( adUnitId: Platform.isIOS ? ios_ads : android_ads, listener: (MobileAdEvent event) { print("InterstitialAd event is $event"); }, ); myInterstitial ..load() ..show( anchorType: AnchorType.bottom, anchorOffset: 0.0, ); }
3. 修改激励广告代码
同样给激励广告加上判断逻辑,已购买则跳过:
bool hasRemovedAds = await getAdRemovedStatus(); if (!hasRemovedAds) { RewardedVideoAd.instance.listener = (RewardedVideoAdEvent event, {String rewardType, int rewardAmount}) { if (event == RewardedVideoAdEvent.rewarded) { // 这里保留你原有的奖励触发逻辑 } }; RewardedVideoAd.instance.load( adUnitId: Platform.isIOS ? ios_ads : android_ads, targetingInfo: targetingInfo ).then((v){ print("log "+v.toString()); if(v){ RewardedVideoAd.instance.show(); } }); }
额外提醒
- 记得在用户完成内购(并且验证通过后,如果有服务器验证的话),立即调用
setAdRemovedStatus(true)更新状态,这样下次打开APP时广告也会自动禁用。 - 如果你的内购需要服务器端验证,一定要在验证通过后再标记购买状态,防止被本地破解绕过。
内容的提问来源于stack exchange,提问作者Sagar Shende
相关产品推荐
相关产品推荐

