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

如何在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的原生接口调用:

  1. 首先在终端执行命令生成System Events的Swift桥接头文件:
    sdef /System/Library/CoreServices/System\ Events.app | sdp -fh --basename SystemEvents
  2. 将生成的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 02:45:01