Flutter iOS端内购如何查看真机日志或在模拟器中调试?
Flutter iOS端内购(IAP)调试效率优化方案
模拟器调试IAP方案
Xcode 12及以上版本已原生支持iOS模拟器调试内购功能,无需依赖真机即可完成90%以上的内购逻辑开发验证,操作步骤如下:
- 打开Flutter项目ios目录下的
Runner.xcworkspace,进入Xcode开发界面 - 新建StoreKit配置文件:点击顶部菜单栏
File > New > File,搜索并选择StoreKit Configuration File,自定义命名后保存到项目中 - 打开刚创建的配置文件,点击左下角
+号添加内购商品,需保证商品ID、类型、定价等参数和App Store Connect后台的配置完全一致,订阅类商品还可以自定义订阅周期、试用优惠等配置 - 修改运行方案:点击Xcode顶部的Runner运行目标,选择
Edit Scheme,进入Run > Options标签页,在StoreKit Configuration下拉选项中选择刚才创建的配置文件 - 运行项目到iOS模拟器,此时即可直接触发内购流程,所有交易成功、失败、恢复购买等回调都会正常触发,还可以在Xcode的
Debug > StoreKit菜单中手动管理交易状态、模拟退款、订阅过期等场景
额外效率优化方案
如果需要验证真实StoreKit环境的逻辑,还可以通过以下方式减少打包次数、提升调试效率:
- 本地真机直装调试:将iPhone通过数据线连接到Mac,在Xcode中选择真机作为运行目标,直接安装Debug版本应用,支持Flutter热重载/热重启,所有运行日志可以直接在Xcode控制台查看,不需要额外开发日志上报逻辑,单次部署耗时不超过5分钟
- 本地Mock内购逻辑:封装IAP服务抽象层,开发阶段默认走Mock实现,根据调试需要直接返回成功、失败、网络异常等模拟结果,非必要不需要触发真实StoreKit流程
- 补充日志上报兜底逻辑:你当前使用的日志上报代码中异常catch块为空,上报本身出错时会丢失错误信息,建议补充本地日志兜底:
static Future<void> logger(String restLog) async { RestLogModel restLogModel = RestLogModel(); restLogModel.message = restLog; Map jsonMap = restLogModel.toMap(); try { final response = await RestClient.postHttp( "/post/logger/v1/log", jsonMap); if (response.statusCode == 200 && response.data["statusCode"] == "200") { Map channelResult = response.data["result"]; if (channelResult != null) { // Pay attention: channelResult would be null sometimes String jsonContent = JsonEncoder().convert(channelResult); } } else { AppLogHandler.logError(RestApiError('Item failed to fetch.'), JsonEncoder().convert(response)); } } on Exception catch (e) { // 新增本地日志兜底 AppLogHandler.logError(RestApiError('Log upload failed'), e.toString()); } }
- 避免走CI打包验证:本地开发调试阶段直接用Xcode打Release包安装到真机,耗时远低于CI流水线的数小时时长
内容的提问来源于stack exchange,提问作者Dolphin
相关产品推荐
相关产品推荐

