zoukankan      html  css  js  c++  java
  • 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);
    }
  • 相关阅读:
    leetcode面试准备:Kth Largest Element in an Array
    leetcode面试准备:Minimum Size Subarray Sum
    leetcode面试准备:Valid Anagram
    leetcode面试准备:Divide Two Integers
    leetcode面试准备:Container With Most Water
    面试:归并排序和分治法
    leetcode面试准备:Lowest Common Ancestor of a Binary Search Tree & Binary Tree
    Leetcode解题思想总结篇:双指针
    leetcode面试准备: CountPrimes
    RF中BDD编写
  • 原文地址:https://www.cnblogs.com/haibosoft/p/4180587.html
Copyright © 2011-2022 走看看