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
2
const channel = MethodChannel('app/native');
final result = await channel.invokeMethod('methodName');

iOS 侧注册处理:

1
2
3
4
let channel = FlutterMethodChannel(
name: "app/native",
binaryMessenger: controller.binaryMessenger
)

这种方式适合调用一次性原生能力,例如获取某个系统状态、打开原生页面、调用原生 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。

这篇先记录这些,后面遇到具体问题再继续补。