如何从Bash脚本调用macOS Swift 3已运行应用的函数?
在macOS上通过Bash调用Swift 3应用的已运行实例函数
当然有可行方案!你猜的没错,借助osascript向应用发送Apple事件,再在Swift应用内监听并处理该事件,是实现这个需求的标准方式。下面我给你拆解具体步骤:
第一步:编写Bash脚本触发事件
你可以直接用osascript命令向已运行的应用发送AppleScript命令,或者自定义Apple事件。举个简单的例子:
#!/bin/bash # 替换成你的应用名称或Bundle ID APP_NAME="MySwiftApp" # 发送调用命令 osascript -e "tell application \"$APP_NAME\" to runTargetFunction"
这里的runTargetFunction是你后续要在Swift应用里定义的、可被AppleScript识别的方法标识。
第二步:在Swift 3应用内处理Apple事件
接下来需要让你的Swift应用能接收并响应这个事件,核心是用NSAppleEventManager注册事件监听器。
1. 开启应用的AppleScript支持
先在Xcode项目的Info.plist里添加一个键:
- 键名:
NSAppleScriptEnabled - 类型:布尔值(Boolean)
- 值:
YES
这一步是让系统知道你的应用可以接收Apple事件。
2. 编写事件处理代码
在AppDelegate.swift里添加事件监听和处理逻辑:
import Cocoa @NSApplicationMain class AppDelegate: NSObject, NSApplicationDelegate { func applicationDidFinishLaunching(_ aNotification: Notification) { // 获取系统Apple事件管理器 let eventManager = NSAppleEventManager.shared() // 注册事件处理器:监听AppleScript的子程序调用事件 eventManager.setEventHandler( self, andSelector: #selector(handleTargetFunctionCall(_:withReplyEvent:)), forEventClass: AEEventClass(kASAppleScriptSuite), andEventID: AEEventID(kASSubroutineEvent) ) } // 事件处理方法:必须用@objc标记,才能被Objective-C runtime识别 @objc func handleTargetFunctionCall(_ event: NSAppleEventDescriptor, withReplyEvent replyEvent: NSAppleEventDescriptor) { // 提取调用的子程序名称 if let subroutineName = event.paramDescriptor(forKeyword: keyASSubroutineName)?.stringValue { if subroutineName == "runTargetFunction" { // 调用你的目标函数 executeMyTargetFunction() // 可选:给Bash脚本返回执行结果 replyEvent.setDescriptor( NSAppleEventDescriptor(string: "目标函数执行成功"), forKeyword: keyDirectObject ) } } } // 你的目标业务函数 func executeMyTargetFunction() { print("已触发目标函数!") // 这里写你要执行的具体逻辑 } }
额外说明:自定义事件(可选)
如果不想用AppleScript的标准事件,你也可以定义自己的事件类和事件ID(用四个字符的代码,比如myap和doit),然后在Bash里用osascript发送自定义事件,Swift端对应监听即可,这种方式更灵活,避免和系统事件冲突。
注意事项
- 如果你的应用开启了沙箱,需要在Xcode的“Signing & Capabilities”里开启“Apple Events”权限,并添加允许接收事件的应用(或者设置为“Allow incoming connections from any application”)。
- 确保Bash脚本里的应用名称或Bundle ID和你的应用一致,否则会找不到已运行的实例。
内容的提问来源于stack exchange,提问作者Nisba
相关产品推荐
相关产品推荐

