flutter和iOS原生通信

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 等

注意 --release -模式下不支持x86_64,若需要模拟器支持需要:flutter build ios-framework --debug --output=./build/ios/frameworks/
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容