You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否用Flutter创建可用于原生iOS应用的.xcframework库?

可以实现,操作指南如下

你的核心问题是用了flutter build ios-framework生成的App.xcframework——这是针对完整Flutter应用的打包产物,并非可复用的功能库,所以无法直接访问自定义Dart方法。正确的方案是通过Flutter Plugin模板构建可被Swift调用的XCFramework,具体步骤:

1. 创建Flutter Plugin项目

打开终端运行:

flutter create --template=plugin --platforms=ios my_flutter_library

这个模板会自动生成Dart与iOS原生的桥接代码结构,省去手动配置MethodChannel的麻烦。

2. 在Dart层实现功能并暴露给原生

修改lib/my_flutter_library.dart,实现你的TestClass并通过MethodChannel暴露方法:

import 'package:flutter/services.dart';

class TestClass {
  // 通道名必须和原生端保持一致
  static const _channel = MethodChannel('my_flutter_library_channel');

  static Future<void> printTestString() async {
    // 执行Dart逻辑
    print("Hello from Dart TestClass");
    // 如果需要给原生返回结果,可添加返回值
    await _channel.invokeMethod('printTestString');
  }
}

3. 配置iOS原生桥接代码

打开项目ios目录下的Runner.xcworkspace,找到自动生成的SwiftMyFlutterLibraryPlugin.swift,修改为以下内容,实现原生与Dart的通信:

import Flutter
import UIKit

public class SwiftMyFlutterLibraryPlugin: NSObject, FlutterPlugin {
  // 注册插件到Flutter引擎
  public static func register(with registrar: FlutterPluginRegistrar) {
    let channel = FlutterMethodChannel(name: "my_flutter_library_channel", binaryMessenger: registrar.messenger())
    let instance = SwiftMyFlutterLibraryPlugin()
    registrar.addMethodCallDelegate(instance, channel: channel)
  }

  // 处理Dart端的方法调用
  public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
    switch call.method {
    case "printTestString":
      // 触发Dart逻辑,这里可以添加原生侧的处理逻辑
      result(nil)
    default:
      result(FlutterMethodNotImplemented)
    }
  }

  // 暴露给Swift项目的调用入口
  public static func callPrintTestString() {
    // 初始化Flutter引擎(建议全局只初始化一次)
    let flutterEngine = FlutterEngine(name: "my_flutter_engine")
    flutterEngine.run()
    // 注册插件
    register(with: flutterEngine.pluginRegistry())
    // 通过MethodChannel调用Dart方法
    let channel = FlutterMethodChannel(name: "my_flutter_library_channel", binaryMessenger: flutterEngine.binaryMessenger)
    channel.invokeMethod("printTestString", arguments: nil)
  }
}

4. 构建XCFramework

回到终端,进入插件项目根目录,运行以下命令生成XCFramework:

flutter build ios-framework --cocoapods --output=./framework_output

生成的产物会在framework_output/Release目录下,包含Flutter.xcframework和MyFlutterLibrary.xcframework(这才是你需要的功能库)。

5. 导入到Swift项目并使用

  1. 将上述两个XCFramework拖入你的Xcode Swift项目,在弹出的窗口中勾选“Copy items if needed”,并确保Target已选中。
  2. 在Xcode的项目设置中,找到这两个框架,将“Embed & Sign”设置为“Embed & Sign”。
  3. 在Swift代码中调用Dart方法:
import UIKit
import MyFlutterLibrary

class ViewController: UIViewController {
  override func viewDidLoad() {
    super.viewDidLoad()
    // 调用Flutter库中的方法
    SwiftMyFlutterLibraryPlugin.callPrintTestString()
  }
}

关键注意点

  • 通道名一致:Dart和Swift代码中的MethodChannel名称必须完全相同,否则无法通信。
  • Flutter引擎初始化:建议在App启动时全局初始化一次Flutter引擎,避免重复初始化导致性能问题。
  • 参数传递:如果需要在Swift和Dart之间传递数据,可在invokeMethod的arguments参数中传入,在对应端解析即可。

内容的提问来源于stack exchange,提问作者Joshua Visayan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 09:25:32