概要
サンドボックス下のアプリからNSUserScriptTask
を用いてスクリプトを実行するとき、記述言語がJXAである場合に限り、doShellScript
やrunScript
といった、外部プロセスを起動する命令を実行するとエラーが発生する。
CotEditorのユーザースクリプトなどがこのような環境に該当する。
コード
ViewController.swift
import Cocoa
class ViewController: NSViewController {
override func viewDidLoad() {
super.viewDidLoad()
let scriptsPath = try! FileManager.default.url(for: .applicationScriptsDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
let jxaTask = try! NSUserAppleScriptTask(url: scriptsPath.appendingPathComponent("doshellscript_jxa.scpt"))
jxaTask.execute(withAppleEvent: nil) { (result, error) in
print(error!.localizedDescription)
}
}
}
doshellscript.scpt
var app = Application.currentApplication()
app.includeStandardAdditions = true
app.doShellScript('ls')
結果
execution error: Error on line 3: Error: A privilege violation occurred. (-10004)
ワークアラウンド
外部プロセス呼び出しをAppleScriptで記述し、Library
関数で呼び出す。
main.scpt
var ExternalProcess = Library('ExternalProcess')
ExternalProcess.doShellScript('ls')
ExternalProcess.scpt
on doShellScript(theCommand)
do shell script theCommand
end doShellScript