2015-08-20 6 views
0

Я работаю над какао-приложением, которое обнаруживает любое USB-устройство хранения (флеш-диск, смартфон ...), подключенное к Mac, а затем использует его файлы. При создании соответствующего словаря я должен указать некоторые ключи и их значения для только обнаруживают устройства хранения. Я работаю над Mac os x.Какие ключи следует указывать в соответствующем словаре, чтобы обнаруживать только все USB-устройства хранения данных на mac os x?

Вопрос: Какие ключи я должен указывать в соответствующем словаре, чтобы обнаруживать только все USB-устройства хранения данных? и какими должны быть их ценности?

ответ

2

Соответствует ли этот набор входов/выходов или арбитрам дисков?

Для первого, я не думаю, что существует чистый способ сопоставления объекта IOMedia, поскольку для этого потребуется сопоставление с более чем одним уровнем дерева устройств ввода-вывода (с по меньшей мере одним уровнем между ними) , Таким образом, вам нужно сделать пассивное совпадение с объектом IOMedia, а затем изучить поставщика провайдера (поставщика поставщика провайдера ...), чтобы определить, действительно ли соответствовать, например. матч против:

<key>IOProviderClass</key> 
<string>IOMedia</string> 
<key>IOPropertyMatch</key> 
<dict> 
    <key>Whole</key> 
    <true/> 
</dict> 

, а затем перебирать свой путь вверх по дереву, пока вы не найти узел, который содержит «Протокол Характеристики» словарь и изучить его свойства «Физическая Interconnect», чтобы увидеть, если он говорит, что «USB».

Я не уверен на 100%, что нет более простого способа, но я не знаю об этом, если он существует.

Если вы используете рамки Disk арбитражных легко:

CFMutableDictionaryRef matchingDict = 
    CFDictionaryCreateMutable(
     kCFAllocatorDefault, 
     0, 
     &kCFTypeDictionaryKeyCallBacks, 
     &kCFTypeDictionaryValueCallBacks); 
CFDictionaryAddValue(matchingDict, 
    kDADiskDescriptionDeviceProtocolKey, 
    CFSTR(kIOPropertyPhysicalInterconnectTypeUSB)); 

(цитата из программирования Disk арбитражной Guide). Оттуда вы можете получить базовый объект IOMedia, вызвав функцию DADiskCopyIOMedia, что делает этот, вероятно, лучший API, предполагая, что вы не выполняете сопоставление в ядре.

Для других людей, которые могли бы прочитать этот ответ в будущем, если вы выполняете сопоставление в ядре для kext, который необходимо подключить к контуру IOMedia, просто пройдите цепочку поставщиков в методе зонда и верните либо экземпляр вашего класса (чтобы ваш драйвер подключался), либо NULL (чтобы отклонить объект IOMedia). Очевидно, что это не относится к приложению Cocoa. Ваши благословения. :-)

+0

Да, это путь. Я бы рекомендовал Disk Arbitration также для инструментов пользовательского пространства. – pmdj