gpt4 book ai didi

swift - NSUserUnixTask 悄悄忽略脚本

转载 作者:行者123 更新时间:2023-11-28 06:10:47 24 4
gpt4 key购买 nike

我正在使用 Xcode 9 在 macOS High Sierra 上的 Swift 4 中编写一个沙盒应用程序。我的应用程序有一个 shell 脚本文件(例如,myscript)复制到 Bundle.main。安装时的 resourceURL 目录。我想使用 NSUserUnixTask 运行这个 shell 脚本,如下所示:

if let scriptUrl = URL(string: "myscript", relativeTo: Bundle.main.resourceURL) {
do {
let task = try NSUserUnixTask(url: scriptUrl)
task.execute(withArguments: [ "hello" ])
debugPrint("OK")
} catch let error {
debugPrint(error)
}
} else {
debugPrint("Script not found")
}

// output: "OK"

这不会给出任何错误消息,并且会正确显示“OK”。但是myscript 脚本似乎完全被忽略了。当我从 Terminal 运行 myscript 时,它按预期运行。

测试 myscript 文件如下所示:

#!/bin/sh
/usr/bin/osascript -e "tell app \"System Events\" to display dialog \"Message: $1\""

(这只是一个测试脚本;真正的调用emacsclient。)shell脚本文件设置为可执行(权限755)。不仅这个 shell 脚本而且任何其他 shell 脚本似乎都被忽略了。例如,如果将第二行替换为 /usr/bin/printf "\a",则不会发出蜂鸣声。我尝试了许多其他 shell 脚本,但似乎没有任何效果。

我该如何解决这个问题?

编辑:

我很仓促。类文件说“如果应用程序是沙箱,那么脚本必须在 applicationScriptsDirectory 文件夹中。”现在我想知道如何在安装时复制脚本文件。

编辑 2:

我手动复制了myscript~/Library/Applications Scripts/com.mydomain.myApp/然后改了上面Swift代码的第一行(如果让 scriptUrl ...) 到

let scriptFolderUrl = try! FileManager.default.url(for: .applicationScriptsDirectory, 
in: .userDomainMask, appropriateFor: nil, create: true)
if let scriptUrl = URL(string: "myscript", relativeTo: scriptFolderURL) {

https://tutel.me/c/programming/questions/43741325/swift+3++sandbox++how+to+create+applicationscriptsdirectory+if+it+doesn39t+exist

脚本运行。现在我需要弄清楚如何在第一次安装或运行应用程序时将脚本复制到脚本文件夹。

最佳答案

pkamp要求一个正确的答案。 :)

作为class document说,脚本必须在 applicationScriptsDirectory 文件夹中。此文件夹不可由沙盒应用程序写入,如 vadian指出。脚本 (myscript) 必须手动复制到 applicationScriptDirectory 文件夹(例如,~/Library/Applications Scripts/com.mydomain.myApp/ ).

完成此操作后,将第一行更改为以下内容:

// --------------------------------------------------------
let scriptFolderUrl = try! FileManager.default.url(for: .applicationScriptsDirectory,
in: .userDomainMask, appropriateFor: nil, create: true)
if let scriptUrl = URL(string: "myscript", relativeTo: scriptFolderURL) {
// --------------------------------------------------------
// same below
do {
let task = try NSUserUnixTask(url: scriptUrl)
task.execute(withArguments: [ "hello" ])
debugPrint("OK")
} catch let error {
debugPrint(error)
}
} else {
debugPrint("Script not found")
}

我受益于 this link对于第一行。

关于swift - NSUserUnixTask 悄悄忽略脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46752353/

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