cocoaアプリでターミナルコマンドを実行する

cs4alhaider

いくつかのコマンドラインスクリプトを実行するためにcocoaアプリでコードを実行するときに問題に直面しています

この機能は、コマンドラインツールを使用するとスムーズに実行されますが、一部のオンオフUIを備えたフルココアアプリを使用すると、まったく機能しません

ここに画像の説明を入力してください スクリプトでhttp&httpsプロキシをオン/オフにする必要があります

ここに画像の説明を入力してください

これが私の機能です:

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

}

私の関数がココアアプリでトリガーされない理由は何ですか?

ルーカス・デラウ

簡単な答えは、Cocoaアプリケーションでアプリサンドボックスを無効にすることで見つかります(プロジェクトアプリのターゲット> [機能]タブ> [アプリサンドボックス]スイッチの下にあります)。サンドボックスの例外によってブロックされていることがわかります。サンドボックスを無効にすると、問題が解決するはずです。

アプリ名またはサンドボックス化されたプロセスでフィルタリングすると、Console.appでもこれを確認できます。サンドボックスが有効になっていると、次のようなエントリが表示される可能性があります。

エラー00:21:57.502273 +0000 sandboxdサンドボックス:sh(17363)deny(1)file-read-data / dev / ttys003

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Cocoaアプリからターミナルコマンドを実行する

分類Dev

Androidアプリケーションでターミナルコマンドを実行する方法

分類Dev

Jupyterでforループのターミナルコマンドを実行する

分類Dev

AndroidStudioでターミナルコマンドを実行する

分類Dev

アプリケーションを無限に実行するためのターミナルコマンド

分類Dev

SwiftXcodeを使用してMacアプリでターミナルコマンドを実行します

分類Dev

pythonコマンドなしでターミナルでpythonスクリプトを実行する

分類Dev

bashスクリプトとターミナルでコマンドを実行すると出力が異なる

分類Dev

Pythonスクリプト内でターミナルコマンドを実行する方法は?

分類Dev

すべてのユーザーからターミナルでコマンドを使用してアプリケーションを実行する方法

分類Dev

迅速なメニューバーアプリでターミナルコマンドを実行するにはどうすればよいですか?

分類Dev

Javaでターミナルアプリのコマンドを作成する

分類Dev

C#Linuxでターミナルコマンドを実行する

分類Dev

JavaからターミナルでLinuxコマンドを実行する

分類Dev

ターミナルからtmuxでコマンドを実行する

分類Dev

swiftでターミナルコマンドを実行するには?

分類Dev

macosコマンドターミナルでtestngを実行する方法

分類Dev

Linuxのターミナルで実行可能なコマンドをループする方法は?

分類Dev

スクリプトを実行してターミナルでコマンドを呼び出す

分類Dev

プログラムでWindowsターミナルでWSLを起動し、コマンドを実行する方法

分類Dev

Pythonスクリプトはターミナルでコマンドを実行します

分類Dev

Pythonスクリプトのターミナルで$ Pathコマンドを実行します

分類Dev

cmakeスクリプトからターミナルコマンドを実行する

分類Dev

ターミナルのコマンドから実行するアプリケーションを作成する方法

分類Dev

ターミナルを開き、コマンドを実行し、ターミナルを開いたままにするスクリプト

分類Dev

ターミナルを開き、コマンドを実行し、ターミナルを開いたままにするスクリプト

分類Dev

Pythonのターミナルから引数を取るターミナルコマンドを実行します2.6スクリプト

分類Dev

bashスクリプトの新しいターミナルインスタンスでコマンドを実行する

分類Dev

ターミナルコンマを実行し、ターミナル上で結果を提供するphpスクリプト

Related 関連記事

  1. 1

    Cocoaアプリからターミナルコマンドを実行する

  2. 2

    Androidアプリケーションでターミナルコマンドを実行する方法

  3. 3

    Jupyterでforループのターミナルコマンドを実行する

  4. 4

    AndroidStudioでターミナルコマンドを実行する

  5. 5

    アプリケーションを無限に実行するためのターミナルコマンド

  6. 6

    SwiftXcodeを使用してMacアプリでターミナルコマンドを実行します

  7. 7

    pythonコマンドなしでターミナルでpythonスクリプトを実行する

  8. 8

    bashスクリプトとターミナルでコマンドを実行すると出力が異なる

  9. 9

    Pythonスクリプト内でターミナルコマンドを実行する方法は?

  10. 10

    すべてのユーザーからターミナルでコマンドを使用してアプリケーションを実行する方法

  11. 11

    迅速なメニューバーアプリでターミナルコマンドを実行するにはどうすればよいですか?

  12. 12

    Javaでターミナルアプリのコマンドを作成する

  13. 13

    C#Linuxでターミナルコマンドを実行する

  14. 14

    JavaからターミナルでLinuxコマンドを実行する

  15. 15

    ターミナルからtmuxでコマンドを実行する

  16. 16

    swiftでターミナルコマンドを実行するには?

  17. 17

    macosコマンドターミナルでtestngを実行する方法

  18. 18

    Linuxのターミナルで実行可能なコマンドをループする方法は?

  19. 19

    スクリプトを実行してターミナルでコマンドを呼び出す

  20. 20

    プログラムでWindowsターミナルでWSLを起動し、コマンドを実行する方法

  21. 21

    Pythonスクリプトはターミナルでコマンドを実行します

  22. 22

    Pythonスクリプトのターミナルで$ Pathコマンドを実行します

  23. 23

    cmakeスクリプトからターミナルコマンドを実行する

  24. 24

    ターミナルのコマンドから実行するアプリケーションを作成する方法

  25. 25

    ターミナルを開き、コマンドを実行し、ターミナルを開いたままにするスクリプト

  26. 26

    ターミナルを開き、コマンドを実行し、ターミナルを開いたままにするスクリプト

  27. 27

    Pythonのターミナルから引数を取るターミナルコマンドを実行します2.6スクリプト

  28. 28

    bashスクリプトの新しいターミナルインスタンスでコマンドを実行する

  29. 29

    ターミナルコンマを実行し、ターミナル上で結果を提供するphpスクリプト

ホットタグ

アーカイブ