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

如何在iOS Xcode的扩展Target中接入Flutter?

解决方案:关联主Flutter目录到iOS扩展Target

可以直接关联主Flutter目录到你的iOS扩展Target,无需单独导入编译好的ios-framework模块,以下是具体实现步骤:

1. 调整CocoaPods配置(解决依赖冲突核心)

修改项目根目录的Podfile,让扩展Target复用主App的Flutter依赖,避免重复引入:

# 主App Target配置
target 'YourMainApp' do
  use_frameworks!
  flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
end

# 扩展Target配置
target 'YourExtension' do
  use_frameworks!
  # 复用主项目的Flutter Pods,消除冗余依赖
  flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
  # 若仍有冲突,可直接指定主Flutter目录路径
  pod 'Flutter', :path => File.join('..', 'Flutter')
end

修改完成后执行pod install,CocoaPods会自动为扩展Target链接主项目的Flutter框架,不会产生重复依赖。

2. 对齐Xcode Target构建配置

打开Xcode,选中你的扩展Target,进入Build Settings,调整以下配置和主App Target保持一致:

  • Framework Search Paths:添加$(SRCROOT)/Flutter,设置为recursive
  • Other Linker Flags:添加-framework Flutter
  • Enable Bitcode:设置为No(Flutter默认禁用Bitcode,扩展需保持一致)

3. 在扩展中使用Flutter API

完成配置后,就可以在扩展代码中直接import Flutter,初始化FlutterEngine和MethodChannel,和主App的用法一致:

import Flutter
import UIKit

class TodayViewController: UIViewController, NCWidgetProviding {
    private var flutterEngine: FlutterEngine?
    private var methodChannel: FlutterMethodChannel?

    override func viewDidLoad() {
        super.viewDidLoad()
        // 初始化独立的FlutterEngine(建议和主App引擎名称区分)
        flutterEngine = FlutterEngine(name: "ExtensionFlutterEngine")
        flutterEngine?.run()
        
        // 创建MethodChannel并监听消息
        methodChannel = FlutterMethodChannel(name: "com.example.extension_channel", binaryMessenger: flutterEngine!.binaryMessenger)
        methodChannel?.setMethodCallHandler { call, result in
            switch call.method {
            case "fetchExtensionInfo":
                result("iOS扩展侧返回的数据")
            default:
                result(FlutterMethodNotImplemented)
            }
        }
        
        // 将Flutter视图嵌入扩展界面
        let flutterVC = FlutterViewController(engine: flutterEngine!, nibName: nil, bundle: nil)
        addChild(flutterVC)
        flutterVC.view.frame = self.view.bounds
        self.view.addSubview(flutterVC.view)
        flutterVC.didMove(toParent: self)
    }

    // 扩展生命周期方法...
}

注意事项

  • 扩展的内存限制比主App严格,FlutterEngine初始化会占用一定内存,建议在扩展进入后台时销毁引擎以优化资源占用
  • 确保主App和扩展Target使用完全相同的Flutter版本,避免版本兼容性问题
  • 不要同时为扩展Target导入编译好的ios-framework模块,否则仍会出现冗余依赖冲突

内容的提问来源于stack exchange,提问作者aloys-c

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 14:05:21