Swift Xcode 10.1实现越狱设备重启/注销遇CommandLine初始化问题求助
Hey there! Let's sort out this problem you're having with executing reboot/respring commands in Swift 4.
Why Your Current Code Fails
The error 'CommandLine' cannot be constructed because it has no accessible initializers happens because CommandLine isn't meant to run external system commands — it's actually a utility class for reading command-line arguments passed to your own app. You're using the wrong tool here!
The Correct Approach: Use Process
In Swift, the right class to launch external processes (like running killall or reboot) is Process (formerly NSTask in Objective-C). Here's a working implementation tailored to your jailbreak app needs:
Step 1: Create a Reusable Command Execution Function
This function will handle splitting your command into the executable path and arguments, then run it safely:
import Foundation func runSystemCommand(_ commandString: String) { let task = Process() let pipe = Pipe() // Split the command into executable and arguments let commandComponents = commandString.components(separatedBy: " ") guard let executable = commandComponents.first else { print("Invalid command string") return } let arguments = Array(commandComponents.dropFirst()) // Use absolute paths for reliability (critical on jailbroken devices) guard let executableURL = URL(string: executable) ?? URL(fileURLWithPath: executable) else { print("Could not resolve executable path") return } task.executableURL = executableURL task.arguments = arguments // Optional: Capture output/errors (remove if you don't need logs) task.standardOutput = pipe task.standardError = pipe do { try task.run() task.waitUntilExit() // If you want to read the output, uncomment this: // let data = pipe.fileHandleForReading.readDataToEndOfFile() // let output = String(data: data, encoding: .utf8) // print(output ?? "") } catch { print("Failed to run command: \(error.localizedDescription)") } }
Step 2: Update Your Button Actions
Use absolute paths for commands (this avoids issues with environment variables on jailbroken devices) and call the function:
@IBAction func respringAction(_ sender: Any) { // Use the full path to killall for reliability runSystemCommand("/usr/bin/killall backboardd") } @IBAction func rebootAction(_ sender: Any) { // Full path to reboot command runSystemCommand("/sbin/reboot") }
Key Notes for Jailbroken Devices
- Permissions: Rebooting and respringing require elevated (root) privileges. Ensure your app is granted root access (common practice for jailbreak tweaks/apps).
- Absolute Paths: Jailbroken environments often have modified
PATHvariables, so using full paths to executables (/usr/bin/killall,/sbin/reboot) ensures your command is found every time. - Deprecation: Avoid the old
launch()method forProcess—run()is the modern, recommended approach in Swift 3+.
内容的提问来源于stack exchange,提问作者Lil Pump

