Swift NSUserUnixTask悄悄地忽略脚本

Swift NSUserUnixTask悄悄地忽略脚本,swift,macos,shell,cocoa,appstore-sandbox,Swift,Macos,Shell,Cocoa,Appstore Sandbox,我正在使用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 { le

我正在使用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代码的第一行(
如果让脚本URL…
)更改为

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

请求正确答案。:)

如所述,脚本必须位于
applicationScriptsDirectory
文件夹中。如前所述,沙盒应用程序无法写入此文件夹。脚本(
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")
}

我从第一行中受益。

您不能:。顺便问一下,为什么要使用
osascript
NSUserUnixTask
运行AppleScript,而不是直接使用
NSUserAppleScriptTask
?谢谢。我使用
NSUserUnixTask
运行它,因为我的脚本中有参数,在我真正的应用程序中它不是苹果脚本。我真正想要的是运行
emacsclient
。顺便说一句,如果禁止写入applicationScriptsDirectory,那么拥有该文件夹有什么意义?用户是否应该手动将文件复制到脚本文件夹?如“用户必须在此处手动放置脚本”所述,请将您编辑的内容添加到问题答案中,作为下面的真实答案:)
// --------------------------------------------------------
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")
}