Cocoa NSTask 输出提取
Posted
技术标签:
【中文标题】Cocoa NSTask 输出提取【英文标题】:Cocoa NSTask ouput extraction 【发布时间】:2018-11-02 10:47:20 【问题描述】:我想在我的 Cocoa 应用程序中运行此命令 system_profiler -xml SPUSBDataType
。在NSTask
的帮助下完成后,我通过将fileHandle
输出编码为NSString
得到以下输出。但我不能提取特定键的值。我尝试使用SWXMLHash
将其转换为xml,并使用jsonSerializer
转换为JSON。但它变得更加复杂。
有什么办法吗?
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
<dict>
<key>_SPCommandLineArguments</key>
<array>
<string>/usr/sbin/system_profiler</string>
<string>-nospawn</string>
<string>-xml</string>
<string>SPCameraDataType</string>
<string>-detailLevel</string>
<string>full</string>
</array>
<key>_SPCompletionInterval</key>
<real>0.13360595703125</real>
<key>_SPResponseTime</key>
<real>0.22787702083587646</real>
<key>_dataType</key>
<string>SPCameraDataType</string>
<key>_detailLevel</key>
<integer>-1</integer>
<key>_items</key>
<array>
<dict>
<key>_name</key>
<string>FaceTime HD Camera</string>
<key>spcamera_model-id</key>
<string>Apple Camera VendorID_0x106B ProductID_0x1570</string>
<key>spcamera_unique-id</key>
<string>CC89657KQR6GDV4AQ</string>
</dict>
</array>
</dict>
</array>
</plist>
【问题讨论】:
您在下面得到了一些很好的答案。如果它们还不足以让你越过这个障碍,那么下一步就是提取这部分代码并做一个简单的例子来完成这部分(调用 NSTask 获取输出,转换为属性列表)并查看如果你仍然无法让它工作。如果你不能,那么你至少可以在这里分享一些更简单的独立代码,以便我们可以进一步帮助你。 【参考方案1】:您应该能够使用PropertyListSerialization
直接解析此输出。查看documentation。
我建议您改用 IOKit。处理它可能是一个令人生畏的 API,但它提供了强大的功能。我过去曾将它用于 USB 设备信息和连接/断开连接通知,并且效果非常好。我认为您会发现它比解析命令行实用程序的输出更强大。
【讨论】:
我试图这样做。但是由于数据格式无效,数据我得到了错误。以下代码行用于从文件句柄中获取数据。let readHandle : FileHandle = privilegedTask.outputFileHandle() let outputData: Data = readHandle.readDataToEndOfFile()
.
您能否更具体地说明您遇到的具体错误?以下对我来说很好,我相信这证明这是一个有效的 plist system_profiler -xml SPUSBDataType | plutil -p -
【参考方案2】:
您可以使用类似下面的方法来获取包含 Dictionary 的数组。
let url = Bundle.main.url(forResource: "data", withExtension: "plist")!
let plistData = try! Data(contentsOf: url)
if let array = try! PropertyListSerialization.propertyList(from: plistData, options: [], format: nil) as? [[String:Any]]
print(array)
【讨论】:
以上是关于Cocoa NSTask 输出提取的主要内容,如果未能解决你的问题,请参考以下文章
Cocoa 应用程序无法开始循环 python 脚本。通过 xcode 构建/运行时工作
Cocoa/iPhone:如何防止凳子在 xib 文件中输出不可本地化的字符串?