在可可应用中运行终端命令

时间:2019-06-29 00:08:12

标签: swift macos cocoa

在可可应用程序上运行代码以运行某些命令行脚本时遇到问题

使用命令行工具时,此功能运行平稳,但是当使用带有某些“开/关” UI的完整可可应用时,则根本无法工作

enter image description here 我的脚本应打开/关闭http&https代理

enter image description here

这是我的职能:

    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类:

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)
    }

}

知道为什么我的功能没有在可可应用程序中触发吗?

1 个答案:

答案 0 :(得分:1)

通过在Cocoa应用程序中禁用“应用程序沙箱”(位于“项目”应用程序目标>“功能”选项卡>“应用程序沙箱”开关下)可以找到简单的答案。您会发现自己被沙箱异常阻止。禁用沙箱应该可以解决您的问题。

如果您过滤应用程序名称或沙盒进程,则也可以在Console.app中看到此内容。启用沙箱功能后,您可能会有一个这样的条目:

  

错误00:21:57.502273 +0000沙盒沙箱:sh(17363)deny(1)文件读取数据/ dev / ttys003