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?