在iOS应用程序或游乐场中是否始终无法解决此过程?
在iOS应用程序中,我想使用一个文件,该文件使用Process具有以下功能:在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() } } 然后,即使我应用了可用性条件,并且没有调用此函数,我还是得到了一个空闲错误: 使用未解
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!