Системная функция в Swift Xcode 10.1 - PullRequest
1 голос
/ 09 марта 2019

Я пытаюсь создать приложение для восстановления и перезагрузки моего джейлбрейкнутого устройства, нажав кнопку.Я знаю, что команда reboot - это просто «reboot», а команда respring - «killall backboardd», но в Swift 4 я не могу использовать функцию «system», потому что это -> «system» недоступна в Swift: используйте posix_spawnAPI или NSTask вместо.

Я пытался с этим.

func system(_ command: String) {
    var args = command.components(separatedBy: " ")
    let path = args.first
    args.remove(at: 0)
    let task = CommandLine()
    task.launchPath = path
    task.arguments = args
    task.launch()
    task.waitUntilExit()
}

@IBAction func respringAction(_ sender: Any) {
    system("killall backboardd");
}

, но выдает мне эту ошибку -> 'CommandLine' не может быть создан, потому что у него нет доступных инициализаторов.

Что я могуделать?

1 Ответ

0 голосов
/ 10 марта 2019

Отказ от ответственности: это было протестировано и работает на моем Mac, но у меня нет джейлбрейкнутых iOS-устройств, и поэтому у меня нет возможности там протестировать.

Вот оно,все убрано:

func system(_ command: String) {
    let argsArray = command.split(separator: " ").map { (substr) -> String in
        return String(substr)
    }
    guard argsArray.count != 0 else { return  }

    let command = strdup(argsArray.first!)
    let args = argsArray.map { strdup($0) } + [nil]
    posix_spawn(nil, command, nil, nil, args, nil)
    return
}

system("/bin/echo you are cool man")
system("/bin/ls -l /")

У меня нет взломанного iPhone, но я знаю, что это работает на моем Mac.Для этого вам потребуется знать полный путь к команде, которую вы хотите выполнить, например / bin / ls в приведенном выше примере.

Если вы хотите бытьв состоянии передать командную строку, которая интерпретируется оболочкой, что вы могли бы использовать эту альтернативную версию:

func shellInterpretedSystem(_ command: String) {
    let argsArray = [
        "/bin/sh",
        "-c",
        command
        ].map { (substr) -> String in
            return String(substr)
    }
    guard argsArray.count != 0 else { return  }

    let command = strdup(argsArray.first!)
    let args = argsArray.map { strdup($0) } + [nil]
    posix_spawn(nil, command, nil, nil, args, nil)
    return
}

shellInterpretedSystem("ls -l /Users")

В этом случае ваша переменная PATH и т. д. будут приняты во внимание, и такие вещи, как звездочки (*) будет расширен.

...