Умный способ получения разрешенных типов файлов из plist

Сценарий:

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

# Extract from Info.plist
[...]
CFBundleDocumentTypes

    
        CFBundleTypeName
        public.png
        CFBundleTypeIconFile
        png.icns
        CFBundleTypeRole
        Viewer
        LSIsAppleDefaultForType
        
        LSItemContentTypes
        
            public.png
        
    
[...]

Далее, мое приложение позволяет открывать файлы с помощью 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? Есть ли встроенная в Cocoa функция?
  2. Как вы поступаете с определением папок, которые могут содержаться например, public.folder?

Примечание:
В ходе моего исследования я нашел эту статью весьма информативной: Simplifying Data Handling with Uniform Type Identifiers.

9
задан JJD 8 October 2011 в 15:55
поделиться