如何在Swift中获取应用的"has scripting terminology"属性
Swift 获取应用
has scripting terminology 属性的实现方案 方案1:直接执行AppleScript代码(最快捷无额外依赖)
直接复用现有AppleScript逻辑,通过Swift内置的NSAppleScript类执行即可,代码如下:
import Foundation func hasScriptingTerminology(for appName: String) -> Bool? { let appleScriptCode = """ tell application "System Events" to tell process "\(appName)" to get has scripting terminology """ guard let script = NSAppleScript(source: appleScriptCode) else { return nil } var error: NSDictionary? let result = script.executeAndReturnError(&error) guard error == nil else { return nil } return result.booleanValue } // 调用示例:获取Safari的对应属性 if let result = hasScriptingTerminology(for: "Safari") { print("Safari的has scripting terminology属性为:\(result)") }
注意:使用该功能需要给应用开启「辅助功能权限」,可在系统设置「隐私与安全性」-「辅助功能」中添加你的应用并开启权限。如果你的应用开启了沙盒模式,还需要在Info.plist中添加com.apple.security.temporary-exception.apple-events权限,对应值添加com.apple.systemevents
方案2:通过ScriptingBridge原生调用(无字符串硬编码)
如果不想使用AppleScript字符串,可以通过ScriptingBridge桥接System Events的原生接口调用:
- 首先在终端执行命令生成System Events的Swift桥接头文件:
sdef /System/Library/CoreServices/System\ Events.app | sdp -fh --basename SystemEvents - 将生成的
SystemEvents.h导入项目,配置好Objective-C到Swift的桥接文件后,就可以直接调用原生API:
import ScriptingBridge func hasScriptingTerminologySB(for appName: String) -> Bool? { guard let systemEvents = SBApplication(bundleIdentifier: "com.apple.systemevents") as? SystemEventsApplication else { return nil } guard let processes = systemEvents.processes?().filter({ ($0 as? SystemEventsProcess)?.name == appName }) as? [SystemEventsProcess], let targetProcess = processes.first else { return nil } return targetProcess.hasScriptingTerminology }
内容的提问来源于stack exchange,提问作者a_kira
相关产品推荐
相关产品推荐

