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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 22:12:41