我不能在函数中使用Process

时间:2017-09-13 10:09:05

标签: swift process

我有一个问题我想使用函数Process()但是当我在一个函数中调用它时我得到了

  

使用未解析的标识符'过程'

但是当我在我的代码中直接调用它时,它可以工作。 有人知道为什么吗?

1 个答案:

答案 0 :(得分:0)

由于您既未提及目标平台,也未提供任何代码,因此您需要注意以下事项:

  1. Process()在Swift 3.0中已重命名为CommandLine()
  2. 如果您定位到iOS,则CommandLine()不可用,因此您需要执行以下操作:

在iOS上使用NSTask():

实现此目标的最佳方法,或者至少是我最喜欢的一种方法(也是我没有找到其他方法),是使用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等第三方商店,则此方法可以正常工作。