Системная функция в Swift Xcode 10.1

#ios #swift #system #jailbreak

#iOS #swift #система #джейлбрейк

Вопрос:

Я пытаюсь создать приложение для перезапуска и перезагрузить мое взломанное устройство нажатием кнопки. Я знаю, что команда перезагрузки — это просто «reboot», а команда повторного запуска — «killall backboardd», но в Swift 4 я не могу использовать функцию «system» из-за этого -> ‘system’ недоступен в Swift: вместо этого используйте posix_spawn API или 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. Я думаю, что вы затеняете существующую system функцию

2. @Alexander нет, я пытался переименовать функцию, но проблема не в этом, проблема в let task = CommandLine() , но я не понимаю, почему

3. Откуда CommandLine берется?

4. Я так не думаю. developer.apple.com/documentation/swift/commandline

5. если я использую Process , я получаю это -> Использование неразрешенного идентификатора «Процесс»; вы имели в виду «Прогресс»?

Ответ №1:

Отказ от ответственности: Это было протестировано и работает на моем 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 и т.д., И такие вещи, как звездочки (*), будут расширены.

Комментарии:

1. … как сделать джейлбрейк моего телефона для тестирования?

2. unc0ver (вы должны быть на 12.0-12.1.2) кстати, это не работает: (

3. ty. Помогло ли вам вышеупомянутое решение? Если да, пожалуйста, отметьте как принято. Если нет, пожалуйста, дайте мне знать.

4. «кстати, это не работает: (» было для решения, которое вы написали: ( unc0ver jb работает!»

5. Что происходит при запуске? … и что вы используете для запуска команды?