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

如何从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:58:49