Flutter中仅为iOS集成内购且避免Android包包含计费相关内容的实现方案咨询
嗨,我来帮你解决这个问题!你的核心需求很明确:只给iOS版本做内购,Android端完全不沾任何计费相关的权限和依赖,这个是完全可以实现的,咱们一步步来拆解:
首先解答你最关心的问题:只用in_app_purchase_storekit和in_app_purchase_platform_interface是可行的,但不能再用主包in_app_purchase里的InAppPurchase.instance了——这就是你之前代码报错的原因,因为这个类是主包提供的统一抽象层,而你现在要直接用iOS专属的StoreKit实现,绕开主包的跨平台封装。
接下来是具体的实现步骤:
1. 依赖配置(关键!)
在你的pubspec.yaml里,只添加in_app_purchase_storekit依赖就够了,不用加in_app_purchase主包,也不用单独加in_app_purchase_platform_interface——因为in_app_purchase_storekit已经默认依赖了这个接口包:
dependencies: flutter: sdk: flutter # 只加这一个,主包in_app_purchase不要加! in_app_purchase_storekit: ^x.x.x # 替换成最新版本号
这样Android端的构建就不会引入任何Google Play计费相关的库,自然也不会自动添加com.android.vending.BILLING权限。
2. 代码层面的平台隔离
所有内购相关的代码都要用Platform.isIOS做条件判断,确保Android端完全不会执行这些逻辑,也不会加载相关类:
import 'dart:io'; import 'package:in_app_purchase_storekit/in_app_purchase_storekit.dart'; import 'package:in_app_purchase_storekit/store_kit_wrappers.dart'; // 初始化iOS内购 void initIosInAppPurchase() { if (!Platform.isIOS) return; // 直接使用StoreKit的封装类,比如SKPaymentQueueWrapper final paymentQueue = SKPaymentQueueWrapper(); // 监听支付队列更新 paymentQueue.setTransactionObserver(YourTransactionObserver()); // 后续的商品查询、发起购买等操作,都用storekit包里的API // 比如查询商品: final request = SKProductsRequestWrapper( productIdentifiers: {'your_product_id'}, ); request.start(); }
这里要注意,所有和内购相关的导入、变量、方法都要放在iOS条件分支里,避免Android编译时触发不必要的依赖检查。
3. 验证Android端的纯净性
构建完Android的APK或App Bundle后,你可以通过以下方式确认没有引入计费内容:
- 用Android Studio打开生成的App Bundle,查看
AndroidManifest.xml,确认没有com.android.vending.BILLING权限; - 用
aapt命令查看APK的权限:aapt dump permissions your_app.apk,检查输出里有没有上述权限; - 查看构建日志,确认没有下载Google Play Billing Library相关的依赖。
额外提醒
如果你之前已经添加过in_app_purchase主包,记得先把它从pubspec.yaml里移除,然后执行flutter clean清理缓存,再重新构建,避免残留的依赖影响结果。
这样操作下来,你的Android包就完全不会带有任何计费相关的内容,而iOS端则可以正常实现内购功能啦。
备注:内容来源于stack exchange,提问作者coolman

