Flutter iOS
最近项目里又碰到一些 Flutter 和 iOS 原生相关的问题,先简单记录一下。Flutter 写久了以后,有些问题还是绕不开原生层,特别是打包、权限、插件和一些系统能力。
iOS 目录
Flutter 项目里的 ios 目录本质上就是一个普通 iOS 工程。
常见会改到的地方:
Info.plist:权限、URL Scheme、ATS 等配置。Podfile:插件依赖、iOS 最低版本、一些编译参数。Runner/AppDelegate:启动逻辑、插件注册、原生 SDK 初始化。Runner.xcworkspace:真正用 Xcode 打开的工程。
平时如果只是 Dart 层开发,很少需要进这些文件。但一旦涉及推送、相册、定位、第三方登录、支付之类的能力,基本都要回到 iOS 工程里看。
Flutter 和原生通信
Flutter 和 iOS 原生通信最常见的是 MethodChannel。
Dart 侧发起调用:
1 | const channel = MethodChannel('app/native'); |
iOS 侧注册处理:
1 | let channel = FlutterMethodChannel( |
这种方式适合调用一次性原生能力,例如获取某个系统状态、打开原生页面、调用原生 SDK。
如果是连续事件,例如监听状态变化,就更适合用 EventChannel。
调试时容易忘的点
Flutter iOS 问题很多时候不是 Dart 代码本身,而是原生配置没对上。
常见检查点:
pod install是否执行过。- Xcode 打开的是否是
.xcworkspace,不是.xcodeproj。 Info.plist权限描述是否加了。- iOS Deployment Target 是否和插件要求一致。
- Debug 和 Release 的配置是否一致。
- 真机和模拟器是否有架构差异。
有些问题在 Android 正常,在 iOS 上就不行,一般先从权限和 Pod 配置开始查。
小结
Flutter 虽然大部分业务可以写在 Dart 层,但 iOS 原生工程不能完全不管。尤其是插件、权限、打包这些问题,最后还是要回到 Xcode 和 CocoaPods。
这篇先记录这些,后面遇到具体问题再继续补。