1 flutter 调用 iOS原生
使用FlutterMethodChannel
swift:
let CHANNEL_NAME = "hunter/configure"
class Configure:NSObject {
/// 获取CFUUID
func GUID() -> String {
let identifier = CFUUIDCreate(nil)
let identifierString:NSString? = CFUUIDCreateString(nil, identifier)
let guid = identifierString?.replacingOccurrences(of: "-", with: "")
return guid ?? ""
}
}
extension Configure:FlutterPlugin {
static func register(with registrar: FlutterPluginRegistrar) {
let chanel = FlutterMethodChannel(name: CHANNEL_NAME, binaryMessenger: registrar.messenger())
let configure = Configure();
registrar.addMethodCallDelegate(configure, channel: chanel)
}
func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
// var flutter_tag: String?
// if let args = call.arguments as? Dictionary<String, Any?> {
// flutter_tag = args["call"] as? String
// }
if call.method == "GUID" {
result(Configure().GUID())
}else {
result(FlutterMethodNotImplemented)
}
}
}
@main
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
GeneratedPluginRegistrant.register(with: self)
if let registra = self.registrar(forPlugin: "Configure") {
Configure.register(with: registra)
}
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
}
dart
static const MethodChannel _channel = MethodChannel("hunter/configure");
final Map<String, dynamic>? params = null;
Global.ios_GUID = await _channel.invokeMethod('GUID', params);
2 iOS原生调用flutter
使用FlutterViewController
// 如果 project 传为 nil,Flutter 会自动使用默认的 FlutterDartProject 配置,即加载 主工程的 main.dart 入口和默认资源。
// initialRoute:用于指定 Flutter 启动时加载的页面路由(即 Flutter 端 MaterialApp 的 routes 或 onGenerateRoute 里的路由名)。
//MaterialApp(
// initialRoute: '/',
// routes: {
// '/': (context) => HomePage(),
// '/profile': (context) => ProfilePage(),
// },
)
- (instancetype)initWithProject:(nullable FlutterDartProject*)project
initialRoute:(nullable NSString*)initialRoute
nibName:(nullable NSString*)nibName
bundle:(nullable NSBundle*)nibBundle;
- (instancetype)initWithEngine:(FlutterEngine*)engine
nibName:(nullable NSString*)nibName
bundle:(nullable NSBundle*)nibBundle
2.1. FlutterEngine(engine)
作用:FlutterEngine 代表一个正在运行的 Flutter 实例(包含 Dart VM、插件、Dart isolate 等)。
用途:可以多个页面/模块共享同一个 FlutterEngine,实现 Flutter 和原生之间的高效通信、页面无缝切换、预热等。
典型场景:需要多个 Flutter 页面共享状态、提前预热 Flutter、提升启动速度时,推荐先创建并持有一个 FlutterEngine,然后用它初始化 FlutterViewController
2.2. FlutterDartProject(project)
作用:FlutterDartProject 代表一个 Dart 项目的配置信息(入口文件、资源等),用于创建新的 FlutterEngine。
用途:每次用 project 初始化 FlutterViewController,都会新建一个 FlutterEngine,并用指定的 Dart 项目启动。
典型场景:不需要共享 FlutterEngine,或者需要启动不同 Dart 入口时使用。
3 如何将flutter打包成xcframework供iOS原生使用呢????
xcframework 是 Apple 在 Xcode 11(2019年WWDC发布) 推出的新一代跨平台二进制库分发格式。
用于替代传统的 .framework,支持多平台和多架构的统一打包。
主要特点
- 多平台支持:可以同时包含 iOS、macOS、watchOS、tvOS 等不同平台的二进制文件。
- 多架构支持:可以同时包含真机(arm64)、模拟器(x86_64/arm64)等不同架构的二进制。
- 易于集成:开发者只需集成一个 .xcframework 包,无需区分平台和架构,Xcode 会自动选择合适的版本。
flutter build ios-framework --release --output=./build/ios/frameworks/

截屏2025-09-22 20.08.59.png
一般是来说时间较长,耐心等待。

截屏2025-09-22 20.13.40.png
App.xcframework: 你的 Flutter Dart 代码编译后的产物。
Flutter.xcframework: Flutter 引擎。
你用到的各个插件的 .xcframework(如 FlutterPluginRegistrant.xcframework, path_provider.xcframework 等