swift 我不能在函数中使用Process

jv4diomz  于 2023-01-12  发布在  Swift
关注(0)|答案(1)|浏览(125)

我遇到了一个问题,我想使用函数Process(),但当我在函数中调用它时,我得到
使用未解析的标识符“Process”
但是当我直接在代码中调用它的时候,它就工作了。有人知道为什么吗?

pexxcrt2

pexxcrt21#

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

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

在iOS上使用NSTask():

实现这一点的最好方法,或者至少是我最喜欢的方法(我也没有找到任何其他方法),是使用custom Objective-C header file,它创建对象NSTask()和它所需要的一切。
然后,为了在Swift中使用此代码,您需要创建一个Bridging-Header,其中您需要导入NSTask.h,以便将其公开给Swift,并能够在Swift代码中使用它。
完成此操作后,只要在代码中使用以下函数就可以运行任务:

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!

要使其工作并且不抛出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,那么这将正常工作。

相关问题