Умный способ извлечь разрешенные типы файлов из plist - PullRequest
9 голосов
/ 27 сентября 2011

Сценарий:

Мне нравится определять разрешенные типы файлов (типы контента) в файле Info.plist моего приложения Какао. Поэтому я добавил их, как показано в следующем примере.

# Extract from Info.plist
[...]
<key>CFBundleDocumentTypes</key>
<array>
    <dict>
        <key>CFBundleTypeName</key>
        <string>public.png</string>
        <key>CFBundleTypeIconFile</key>
        <string>png.icns</string>
        <key>CFBundleTypeRole</key>
        <string>Viewer</string>
        <key>LSIsAppleDefaultForType</key>
        <true/>
        <key>LSItemContentTypes</key>
        <array>
            <string>public.png</string>
        </array>
    </dict>
[...]

Далее, мое приложение позволяет открывать файлы, используя NSOpenPanel. Панель позволяет устанавливать разрешенные типы файлов с помощью следующего селектора: setAllowedFileTypes:. Документация гласит, что UTI может использоваться .

Тип файла может быть общим расширением файла или UTI.


Индивидуальное решение:

Я написал следующий вспомогательный метод для извлечения UTI из файла Info.plist.

/**
    Returns a collection of uniform type identifiers as defined in the plist file.
    @returns A collection of UTI strings.
 */
+ (NSArray*)uniformTypeIdentifiers {
    static NSArray* contentTypes = nil;
    if (!contentTypes) {
        NSArray* documentTypes = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleDocumentTypes"];
        NSMutableArray* contentTypesCollection = [NSMutableArray arrayWithCapacity:[documentTypes count]];
        for (NSDictionary* documentType in documentTypes) {
            [contentTypesCollection addObjectsFromArray:[documentType objectForKey:@"LSItemContentTypes"]];
        }
        contentTypes = [NSArray arrayWithArray:contentTypesCollection];
        contentTypesCollection = nil;
    }
    return contentTypes;
}

Вместо [NSBundle mainBundle] также можно использовать CFBundleGetInfoDictionary(CFBundleGetMainBundle()).


Вопросы:

  1. Знаете ли вы более разумный способ извлечения информации о типе контента из файла Info.plist? Есть ли встроенная функция Какао?
  2. Как вы справляетесь с определением папок, которые могут содержать там, например public.folder

Примечание:
В ходе моего исследования я нашел эту статью довольно информативной: Упрощение обработки данных с помощью унифицированных идентификаторов типов .

1 Ответ

1 голос
/ 05 ноября 2011

Вот как я читаю информацию из plist (это может быть info.plist или любой другой plist, который есть в вашем проекте, если вы указали правильный путь)

NSString *resourcePath = [[NSBundle mainBundle] resourcePath];
NSString *fullPath = [NSString stringWithFormat:@"%@/path/to/your/plist/my.plist", resourcePath];
NSData *plistData = [NSData dataWithContentsOfFile:fullPath];
NSDictionary *plistDictionary = [NSPropertyListSerialization propertyListFromData:plistData mutabilityOption:NSPropertyListImmutable format:0 errorDescription:nil];
NSArray *fileTypes = [plistDictionary objectForKey:@"CFBundleDocumentTypes"];
...