gpt4 book ai didi

swift - NSWorkspace.OpenConfiguration 忽略参数,尽管没有被沙箱化

转载 作者:行者123 更新时间:2023-12-04 17:26:34 24 4
gpt4 key购买 nike

我正在尝试使用 open 启动应用程序通过 Swift 工具。我有两个单独的实现,一个是 NSWorkspace.shared.openApplication(at:configuration)适用于 10.15+ 和一个带有 NSWorkspace.shared.launchApplication(at:options:configuration)适用于 10.14 及更低版本。在 10.14 及更低版本上一切正常,但 Catalina 忽略了向它抛出的任何参数。 该应用程序未经过沙盒处理。
10.15+ 的实现:

let appPath = URL(string: "file:///usr/bin/open")!
let configuration = NSWorkspace.OpenConfiguration()
configuration.arguments = [
"-a",
executablePath,
url.absoluteString
]

NSWorkspace.shared.openApplication(at: appPath, configuration: configuration) { (app, error) in
if let error = error {
done(error)
} else {
done(nil)
}
}
运行此命令会打开终端窗口 /usr/bin/open没有参数,然后关闭 session 。
Catalina opening a Terminal executablePath是应用程序可执行文件的字符串,例如 /Application/Safari.app/Contents/MacOS/Safari url是一个包含 http 或 https 链接的 URL 对象
删除 file://来自 appPath 在 10.14 中也能正常工作,但在 10.15 结果 The application “open” could not be launched because a miscellaneous error occurred .
我错过了什么吗?

最佳答案

我以不同的方式解决了这个问题。而不是使用 NSWorkspace.shared.openApplication(at:configuration:)我现在正在调用 Process打开 open .
这也适用于 Catalina 以下的版本,甚至适用 带沙箱 .但是,沙箱有一个问题,请在最后阅读更多内容。
解决方法

let task = Process()

task.arguments = ["-a", executablePath, url.absoluteString]
task.launchPath = "/usr/bin/open"
task.launch()
无需等待该过程,因为 a) open 的返回不是那么有用,并且 b) 无论如何它几乎是立即的。
关于沙盒
苹果表示:

In a sandboxed application, child processes created with the Process class inherit the sandbox of the parent app.


这意味着应用程序使用 Process 打开有相同的沙箱。如果您使用 open像我一样打开一个 URL 很好,因为 open无论如何都会在没有我们沙箱的情况下产生一个新进程。但是,这确实意味着您不能使用此打开的其他常规应用程序,除非此应用程序在您的沙箱中运行良好。

关于swift - NSWorkspace.OpenConfiguration 忽略参数,尽管没有被沙箱化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62897936/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com