func task(launchPath: String, arguments: String...) -> NSString {
let task = NSTask.init()
task?.setLaunchPath(launchPath)
task?.arguments = arguments
// Create a Pipe and make the task
// put all the output there
let pipe = Pipe()
task?.standardOutput = pipe
// Launch the task
task?.launch()
task?.waitUntilExit()
// Get the data
let data = pipe.fileHandleForReading.readDataToEndOfFile()
let output = NSString(data: data, encoding: String.Encoding.utf8.rawValue)
return output!
}
1条答案
按热度按时间pexxcrt21#
由于您既未提及目标平台,也未提供任何类型的代码,因此您需要注意以下事项:
Process()
在Swift 3.0中已重命名为CommandLine()
1.如果您的目标是iOS,则
CommandLine()
不可用,因此您需要执行以下操作:在iOS上使用NSTask():
实现这一点的最好方法,或者至少是我最喜欢的方法(我也没有找到任何其他方法),是使用custom Objective-C header file,它创建对象
NSTask()
和它所需要的一切。然后,为了在Swift中使用此代码,您需要创建一个Bridging-Header,其中您需要导入
NSTask.h
,以便将其公开给Swift,并能够在Swift代码中使用它。完成此操作后,只要在代码中使用以下函数就可以运行任务:
就像这样称呼它:
这也将返回值,因此您甚至可以通过执行以下操作来显示它:
将打印:
要使其工作并且不抛出
NSInternalInconsistencyException
,您需要将launchPath设置为可执行文件的完整路径,而不是仅设置为包含它的目录。您还需要设置所有用***逗号分隔的命令参数。
在iPad Mini 2(*iOS 12.1 ~〉越狱 *)和iPhone Xr(*iOS 12.2 ~〉未越狱 *)上进行了测试。
注意:尽管这在未越狱和越狱的设备上都有效,但您的应用将在AppStore上被拒绝,正如@ClausJørgensen所说:
你使用的是私有API,所以在App Store上会被拒绝。另外,Xcode 11有一些新功能,在使用某些私有API时会触发构建失败。
我只建议那些不会上传到App Store的应用程序使用这个功能,否则,试着在不使用命令的情况下实现你想要的,肯定会有其他方法来做到这一点。
如果你的应用程序是针对越狱的iOS设备,并将上传到第三方商店,如Cydia,Zebra,Thunderbolt或Sileo,那么这将正常工作。