IOS UTI統一類型標識符:判斷文件類型通過后綴


今天在學習文檔和數據共享中,首先講的處理統一類型標識符UTI。第一次見,所以記下來以備之用,首先了解UTI和MIME的概念

1.同一類型標識符(Uniform Type Identifier,UTI)代表IOS信息共享的中心組件。可以把它看成下一代的MIME類型。UTI是標識資源類型(比如圖像和文本)的字符串,他們制定哪些類型的信息將用於公共數據對象,他們不需要依賴於老式的指示符,比如文件擴展名,MIME類型,或者文件類型的元數據

如圖,顯示了Apple的基本順應樹的一部分。這個樹上位於較低位置的任何項目都必須順應其所有父數據屬性。聲明一個父UTI意味着支持他的所有子UTI。因此,可以打開public.data的應用必須能打開文本,電影,圖像文件等。其UTI的名稱類型就是public.data等

 

2.MIME的了解可以去百度百科上有定義:http://baike.baidu.com/link?url=TQx8NxQPb8m5bsMWVR6p7NIFemdxyPh6RH_uG01FTKNIg7-iy4-TLiUXVIOxj-BavNOWugJCixMEywo7vJrdPq

MIME的定義類型如下 如text/xml就是后綴.xml的MIME類型。

                   常見的MIME類型(通用型): 

                    超文本標記語言文本 .html text/html
                    xml文檔 .xml text/xml
 
3.常見的文件擴展名之間的相互轉換
 
首先要添加MobileCoreServices.framework框架,並且在頭文件中添加

#import <MobileCoreServices/MobileCoreServices.h>

以下都用的是C語言編寫的

(1)后綴名字符串轉化為UTI字符串

-(NSString *)preferredUTIForExtention:(NSString *)ext
{
    //Request the UTI via the file extension
    NSString *theUTI = (__bridge_transfer NSString *)UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (__bridge CFStringRef)(ext), NULL);
    return theUTI;
}

(2)使用kUITagClassMIMEType作為第一個參數,給UITypeCreatePreferredIdentifierForTag(),是MIME類型字符串轉化為UTI字符串

NSString *preferredUTIForMIMEType(NSString *mime)
{
    //request the UTI via the file extention
    NSString *theUTI = (__bridge_transfer NSString *)UTTypeCreatePreferredIdentifierForTag(kUTTagClassMIMEType,(__bridge CFStringRef)mime, NULL);
    return theUTI;
}

(3)使用UITypeCopyPreferredTagWithClass(),是UTI字符串轉化為后綴擴展名

NSString *extensionForUTI(NSString *aUTI)
{
    CFStringRef theUTI = (__bridge CFStringRef)aUTI;
    CFStringRef results = UTTypeCopyPreferredTagWithClass(theUTI, kUTTagClassFilenameExtension);
    return (__bridge_transfer NSString *)results;
}

(4)UTI字符串轉化為MIME類型

NSString *mimeTypeForUTI(NSString *aUTI)
{
    CFStringRef theUTI = (__bridge CFStringRef) aUTI;
    CFStringRef results = UTTypeCopyPreferredTagWithClass(theUTI, kUTTagClassMIMEType);
    return (__bridge_transfer NSString *)results;
}

(5)測試順應性,使用UITypeConformsTo()函數測試順應性。該函數接受兩個參數:一個源UTI和一個要比較的UTI,如果第一個UTI順應第二個UTI,就返回True。相等性測試則使用UITypeEqual(),下面顯示了一個示例,說明如何順應性測試,確定文件路徑是否可能指向圖像資源。

BOOL pathPointsToLikelyUTIMatch(NSString *path, CFStringRef theUTI)
{
    NSString *extension = path.pathExtension;
    NSString *preferredUTI = preferredUTIForExtension(extension);
    return (UTTypeConformsTo((__bridge CFStringRef) preferredUTI, theUTI));
}

BOOL pathPointsToLikelyImage(NSString *path)
{
    return pathPointsToLikelyUTIMatch(path, CFSTR("public.image"));
}

BOOL pathPointsToLikelyAudio(NSString *path)
{
    return pathPointsToLikelyUTIMatch(path, CFSTR("public.audio"));
}

(6)獲取順應性列表

   UTTypeCopyDeclaration()是IOS API中的所有UTI函數中最一般(並且最有用)的函數,它返回包含以下鍵的字典。

    》kUTTypeIdentifierKey:UTI名稱,他將被傳遞給函數(例如.public.mpeg)

    》kUTTypeConformsToKey:類型順應的任何父項目(例如 public.mpeg順應public.movie)

    》kUTTypeDescriptionKey:正在考慮的類型(如果存在的話)的現實描述 (例如 “MPEG movie”)

    》kUTTypeTagSpecificationKey:給定UTI的等價OSType(例如MPG和MPEG)、文件擴展名( mpg、mpeg、mpe、m75和m15)和MIME類型(視頻/mpeg、視頻/mpg、視頻/x-mpeg和視頻/x-mpg)的字典。

 下面例子主要是返回字典向上通過順應性樹來構建一個數組,表示給定UTI順序的所有項目.例如public.mpeg類型順應public.movie public.audiovisual-content public.data public.item 和public.content,代碼如下:

NSDictionary *utiDictionary(NSString *aUTI)
{
    NSDictionary *dictionary = (__bridge_transfer NSDictionary *)UTTypeCopyDeclaration((__bridge CFStringRef) aUTI);
    return dictionary;
}

NSArray *uniqueArray(NSArray *anArray)
{
    NSMutableArray *copiedArray = [NSMutableArray arrayWithArray:anArray];
    for (id object in anArray)
    {
        [copiedArray removeObjectIdenticalTo:object];
        [copiedArray addObject:object];
    }
    
    return copiedArray;
}

NSArray *conformanceArray(NSString *aUTI)
{
    NSMutableArray *results = [NSMutableArray arrayWithObject:aUTI];
    NSDictionary *dictionary = utiDictionary(aUTI);
    id conforms = dictionary[(__bridge NSString *)kUTTypeConformsToKey];
    
    // No conformance
    if (!conforms) return results;
    
    // Single conformance
    if ([conforms isKindOfClass:[NSString class]])
    {
        [results addObjectsFromArray:conformanceArray(conforms)];
        return uniqueArray(results);
    }
    
    // Iterate through multiple conformance
    if ([conforms isKindOfClass:[NSArray class]])
    {
        for (NSString *eachUTI in (NSArray *) conforms)
            [results addObjectsFromArray:conformanceArray(eachUTI)];
        return uniqueArray(results);
    }
    
    // Just return the one-item array
    return results;
}

NSArray *allExtensions(NSString *aUTI)
{
    NSMutableArray *results = [NSMutableArray array];
    NSArray *conformance = conformanceArray(aUTI);
    for (NSString *eachUTI in conformance)
    {
        NSDictionary *dictionary = utiDictionary(eachUTI);
        NSDictionary *extensions = dictionary[(__bridge NSString *)kUTTypeTagSpecificationKey];
        id fileTypes = extensions[(__bridge NSString *)kUTTagClassFilenameExtension];
        
        if ([fileTypes isKindOfClass:[NSArray class]])
            [results addObjectsFromArray:(NSArray *) fileTypes];
        else if ([fileTypes isKindOfClass:[NSString class]])
            [results addObject:(NSString *) fileTypes];
    }
    
    return uniqueArray(results);
}

NSArray *allMIMETypes(NSString *aUTI)
{
    NSMutableArray *results = [NSMutableArray array];
    NSArray *conformance = conformanceArray(aUTI);
    for (NSString *eachUTI in conformance)
    {
        NSDictionary *dictionary = utiDictionary(eachUTI);
        NSDictionary *extensions = dictionary[(__bridge NSString *)kUTTypeTagSpecificationKey];
        id fileTypes = extensions[(__bridge NSString *)kUTTagClassMIMEType];
        
        if ([fileTypes isKindOfClass:[NSArray class]])
            [results addObjectsFromArray:(NSArray *) fileTypes];
        else if ([fileTypes isKindOfClass:[NSString class]])
            [results addObject:(NSString *) fileTypes];
    }
    
    return uniqueArray(results);
}

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM