Rust 调用 Object-C 的API

title: Rust 调用 Object-C 的API id: 34e18f5df00ad62ed0d1e67beca4849c tags: [] date: 2000/01/01 00:00:00 updated: 2023/03/10 11:09:43 isPublic: true --#|[分隔]|#--

Rust 调用 Object-C 的API

使用Tauri开发了一个Mac系统使用的快捷工具,其中有一个功能,需要得到当前处于最前台的软件的名称。

实在没有找到包含此功能的Rust库,自己使用 Applescript 这个苹果系统的脚本实现了这个功能,但执行很慢,需要300毫秒左右,延迟感人。

没办法,必须调用 Mac 系统开发Api了,也就是调用 Mac 原生的 Object-C 的 API。

需要调用的那个Api的文档:https://developer.apple.com/documentation/appkit/nsworkspace/1532097-frontmostapplication?language=objc

需要下面几步:

  • 先引入 AppKit 这个Mac 的模块

  • 先取 NSWorkspace 这个类

  • 从上面的类中获取 sharedWorkspace 这个对象

  • 调用上面的对象中的 frontmostApplication,得到当前处于前台的那个软件的运行时信息,也就是上面文档中的那个对象。

  • 从软件对象中获取 bundleURL,得到这个软件的安装路径,是一个NSURL对象。

  • 把 NSURL 对象转为 NSString 对象。

  • 把 Objc 的 NSString 返回给 Rust,实际返回的貌似是个「内存地址」,这是我的知识盲区了(这里如果 Objc 返回的是数子、bool值之类的数据类型,貌似Rust可以直接得到值,但复杂的类似 NSString 这种,还需要进一步操作)。

  • 使用 Rust 把读取内存地址,得到 Rust 的 String 数据,到这里算是大功告成了。

执行这段代码,最终只需要话费 4 毫秒左右,我又被深深感动了。

需要使用cargo安装的依赖:

  • objc:必须

  • percent_encoding(非必须,我用来转码url用的)

Last updated

Was this helpful?