Dart与Swift通过ffigen互调用时创建类失败的问题
解决Flutter macOS端Swift+ffigen无法创建类的问题
核心问题分析
你当前的代码存在两个关键错误:未加载编译好的动态库,以及Swift编译命令参数错误,导致Dart无法找到对应的原生类实现。以下是分步修复方案:
1. 修正Swift编译命令
原来的-c参数只会生成目标文件,不会生成完整的动态库,而且缺少AppKit框架链接。替换为以下命令:
swiftc RunningApplicationsProvider.swift \ -module-name RunningApplicationsModule \ -emit-objc-header-path RunningApplicationsProvider.h \ -dynamiclib -o libRunningApplicationsProvider.dylib \ -framework AppKit
-dynamiclib:明确生成动态库文件-framework AppKit:链接NSWorkspace依赖的AppKit框架,避免运行时符号缺失
2. 修改Dart代码,加载动态库并正确初始化实例
ffigen生成的绑定需要先关联动态库,不能直接调用ApplicationManager.new1()。修改后的测试代码:
import 'dart:ffi'; import 'package:opened_application/src/generated/running_apps_bindings.dart'; void main() { // 替换为你的.dylib实际路径,开发阶段可以用绝对路径,打包后需调整为相对路径 final dylib = DynamicLibrary.open('/Users/yourname/project/ios/native/libRunningApplicationsProvider.dylib'); final bindings = RunningApplicationsModule(dylib); // 通过bindings实例创建ApplicationManager对象 final appManager = bindings.ApplicationManager.new1(); final runningApps = appManager.getRunningApplications(); print(runningApps); }
3. 验证ffigen配置与生成的头文件
- 检查
RunningApplicationsProvider.h是否正确生成了ApplicationManager的Objective-C声明,确保包含:@interface ApplicationManager : NSObject - (instancetype)init; - (NSArray<NSString *> *)getRunningApplications; @end - 确认ffigen配置的
headers.entry-points路径正确指向生成的.h文件,避免路径错误导致绑定不完整
4. 后续获取活动窗口的权限提示(额外补充)
如果后续要实现获取当前活动窗口名称的核心需求,还需要在macOS的Info.plist中添加权限描述:
<key>NSAppleEventsUsageDescription</key> <string>需要访问应用窗口信息以追踪使用情况</string>
并在系统偏好设置→隐私与安全性中,给你的Flutter应用授予“自动化”权限。
内容的提问来源于stack exchange,提问作者LightningHyperBlaze
相关产品推荐
相关产品推荐

