Какао NSTask выходной экстракции - PullRequest
0 голосов
/ 02 ноября 2018

Я хочу запустить эту команду system_profiler -xml SPUSBDataType в моем приложении Какао . После этого с помощью NSTask я получаю следующий вывод, кодируя вывод fileHandle в NSString. Но я не могу сделать извлечение значения конкретного ключа. Я попытался преобразовать его в xml, используя SWXMLHash и преобразовав в JSON , используя jsonSerializer. Но это стало сложнее.

Есть ли способ сделать это?

 <?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>

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Вы можете использовать что-то вроде ниже, чтобы получить массив с содержащим словарь.

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)
}
0 голосов
/ 02 ноября 2018

Вы должны иметь возможность анализировать этот вывод напрямую, используя PropertyListSerialization . Ознакомьтесь с документацией .

Я бы рекомендовал, возможно, взглянуть на использование IOKit. Это может быть немного сложным API, чтобы справиться с ним, но он предоставляет массу возможностей. В прошлом я использовал его для получения информации об устройстве USB и для уведомлений о подключении / отключении, и он прекрасно работал. Я думаю, вы найдете его гораздо более надежным, чем анализ выходных данных утилиты командной строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...