在可可应用中运行终端命令 [英] Running terminal commands in in cocoa app
问题描述
在可可应用程序上运行代码以运行某些命令行脚本时,我遇到了问题
I facing a problem when running my code on cocoa app to run some command line scripts
使用命令行工具时,此功能运行平稳,但是当使用带有某些开/关" UI的完整可可应用时,则根本无法工作
This function run smoothly when using Command line tool but when using full cocoa app with some On Off UI it not working at all
我的脚本应该打开/关闭http&https代理
My script should turn on/off the http & https proxy
这是我的职能:
private func runTask(_ cmd: String) {
// Create a Task instance
let task = Process()
// Set the task parameters
task.launchPath = "/bin/sh"
task.arguments = ["-c", String(format:"%@", cmd)]
// Create a Pipe and make the task
// put all the output there
let pipe = Pipe()
task.standardOutput = pipe
// Launch the task
task.launch()
// Get the data
let data = pipe.fileHandleForReading.readDataToEndOfFile()
guard let output = NSString(data: data, encoding: String.Encoding.utf8.rawValue) else { return }
print(output)
}
这是我完整的ViewController类:
And here is my full ViewController class:
import Cocoa
class ViewController: NSViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
@IBAction func onButtonTapped(_ sender: NSButton) {
print("onButtonTapped")
let selected: Switch = .on
let listOfNetworkCommands: String = [
#"networksetup -setwebproxystate "Wi-fi" \#(selected)"#, // switch http proxy
#"networksetup -setsecurewebproxystate "Wi-fi" \#(selected)"#, // switch https proxy
#"networksetup -setpassiveftp "Wi-fi" \#(selected)"# // switch passive ftp
].joined(separator: " && ")
runTask(listOfNetworkCommands)
}
@IBAction func offButtonTapped(_ sender: NSButton) {
print("onButtonTapped")
let selected: Switch = .off
let listOfNetworkCommands: String = [
#"networksetup -setwebproxystate "Wi-fi" \#(selected)"#, // switch http proxy
#"networksetup -setsecurewebproxystate "Wi-fi" \#(selected)"#, // switch https proxy
#"networksetup -setpassiveftp "Wi-fi" \#(selected)"# // switch passive ftp
].joined(separator: " && ")
runTask(listOfNetworkCommands)
}
enum Switch: String {
case on, off
}
private func runTask(_ cmd: String) {
// Create a Task instance
let task = Process()
// Set the task parameters
task.launchPath = "/bin/sh"
task.arguments = ["-c", String(format:"%@", cmd)]
// Create a Pipe and make the task
// put all the output there
let pipe = Pipe()
task.standardOutput = pipe
// Launch the task
task.launch()
// Get the data
let data = pipe.fileHandleForReading.readDataToEndOfFile()
guard let output = NSString(data: data, encoding: String.Encoding.utf8.rawValue) else { return }
print(output)
}
}
知道为什么我的功能没有在可可应用程序中触发吗?
Any idea why my function not triggered in the cocoa app?
推荐答案
通过在Cocoa应用程序中禁用应用程序沙箱"(位于项目"应用程序目标>功能"选项卡>应用程序沙箱"开关下),可以找到简单的答案.您会发现自己被沙箱异常阻止.禁用沙箱应该可以解决您的问题.
Simple answer is found by disabling App Sandbox in your Cocoa Application (found under your Project app target > Capabilities tab > App Sandbox switch). You'll find that you're being blocked by a sandbox exception. Disabling sandboxing should fix your issue.
如果您为应用程序名称或沙盒进程进行过滤,也可以在Console.app中看到此内容.启用沙箱功能后,您可能会有一个这样的条目:
You can also see this in Console.app if you filter for your app name or the sandboxd process. You'll likely have an entry like this when sandboxing is enabled:
错误00:21:57.502273 +0000沙盒沙盒:sh(17363)deny(1)文件读取数据/dev/ttys003
error 00:21:57.502273 +0000 sandboxd Sandbox: sh(17363) deny(1) file-read-data /dev/ttys003
这篇关于在可可应用中运行终端命令的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!