我有一个问题我想使用函数Process()
但是当我在一个函数中调用它时我得到了
使用未解析的标识符'过程'
但是当我在我的代码中直接调用它时,它可以工作。 有人知道为什么吗?
答案 0 :(得分:0)
由于您既未提及目标平台,也未提供任何代码,因此您需要注意以下事项:
Process()
在Swift 3.0中已重命名为CommandLine()
CommandLine()
不可用,因此您需要执行以下操作:实现此目标的最佳方法,或者至少是我最喜欢的一种方法(也是我没有找到其他方法),是使用custom Objective-C header file创建对象{{1 }}及其所需的一切。
然后,为了在Swift中使用此代码,您需要创建一个Bridging-Header,在其中需要导入NSTask()
才能使其在Swift中公开并被可以在您的Swift代码中使用它。
完成此操作后,只要要运行任务,就在代码中使用以下功能:
NSTask.h
并这样称呼它:
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!
}
这还将返回该值,因此您甚至可以执行以下操作来显示它:
task(launchPath: "/usr/bin/echo", arguments: "Hello World")
将打印:
print(task(launchPath: "/usr/bin/echo", arguments: "Hello, World!"))
要使此功能正常运行并且不抛出~> Hello, World!
,您需要将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等第三方商店,则此方法可以正常工作。