#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. Что происходит при запуске? … и что вы используете для запуска команды?