Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/110.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在iOS应用程序或游乐场中是否始终无法解决此过程?_Ios_Swift_Swift4_Platform - Fatal编程技术网

在iOS应用程序或游乐场中是否始终无法解决此过程?

在iOS应用程序或游乐场中是否始终无法解决此过程?,ios,swift,swift4,platform,Ios,Swift,Swift4,Platform,在iOS应用程序中,我想使用一个文件,该文件使用Process具有以下功能: public func system(_ body: String) throws { if #available(macOS 10.0, *) { let process = Process() ... } else { fatalError() } } 然后,即使我应用了可用性条件,并且没有调用此函数,我还是得到了一个空闲错误: 使用未解

在iOS应用程序中,我想使用一个文件,该文件使用Process具有以下功能:

public func system(_ body: String) throws {
    if #available(macOS 10.0, *) {
        let process = Process()

        ...

    } else {
        fatalError()
    }
}
然后,即使我应用了可用性条件,并且没有调用此函数,我还是得到了一个空闲错误: 使用未解析的标识符“进程”

我在操场上尝试了一个类似的代码,但我得到了同样的错误

我通过这个问题了解到,我们无法在iOS应用程序中以常规方式使用流程:,我有一个解决方案,即我将这些代码与每个使用平台的文件分开。但是如果可以的话,我想使用这个文件

请为我的理想提供另一种解决方案。

if#available()
对操作系统版本进行运行时检查

if #available(macOS 10.0, *)
如果代码在macOS 10.0或更高版本上运行,则计算结果为
true
, 或者在iOS/tvOS/watchOS上,操作系统至少是最低部署目标

您需要的是条件编译,具体取决于平台:

#if os(macOS)
let process = Process()
#else
// ...
#endif

尽管您已经解决了这个问题,但我想告诉您,实际上,
Process()
(或Swift 3.0或更高版本中的
CommandLine()
)可用于iOS,但您需要使用一个,以及它所需要的一切

然后,为了在Swift中使用此代码,您需要创建一个,在其中您需要导入
NSTask.h
文件,以便将其公开给Swift并能够在Swift代码中使用它

完成此操作后,请使用
NSTask()
而不是
Process()

或者只要在代码中使用以下函数即可运行任务:

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!
}
如您所见,在本例中,
NSTask()
相当于
Process()

这样称呼它:

task(launchPath: "/usr/bin/echo", arguments: "Hello World")
这也将返回值,因此您甚至可以通过执行以下操作来显示该值:

print(task(launchPath: "/usr/bin/echo", arguments: "Hello, World!"))
将打印:

~> Hello, World!
要使其正常工作且不引发
nsinternalinconsistenceexception
,您需要将启动路径设置为可执行文件的完整路径,而不是仅设置为包含它的目录

您还需要设置所有由逗号分隔的命令参数

在iPad Mini 2(iOS 12.1~>越狱)和iPhone Xr(iOS 12.2~>非越狱)上测试

注意:尽管这在非越狱和越狱设备上都有效,但您的应用程序将在AppStore上被拒绝,如下所述:

您正在使用私有API,因此它将在应用商店中被拒绝。另外,Xcode 11有一些新功能,在使用某些专用API时会触发构建失败。 如果您的应用程序针对越狱iOS设备,并将上载到Cydia、Zebra、Thunderbolt或Sileo等第三方商店,那么这将正常工作


希望这对您有所帮助。

非常感谢您的解决方案。我很惊讶Swift中存在预处理器宏。我想掌握这些宏,你能告诉我应该读什么文档吗?@MatsumotoHarutaka:这是一个“编译指令”,而不是一个预处理器宏。你会在里面找到它的。
~> Hello, World!