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类型(通用型):
#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);
}
IOS UTI统一类型标识符:判断文件类型通过后缀的更多相关文章
- iOS UTI(统一类型标识)
同一类型标识符(Uniform Type Identifier,UTI)代表IOS信息共享的中心组件.可以把它看成下一代的MIME类型.UTI是标识资源类型(比如图像和文本)的字符串,他们制定哪些类型 ...
- JavaScript根据文件名判断文件类型
//JavaScript根据文件名判断文件类型 var imgExt = new Array(".png",".jpg",".jpeg",& ...
- 利用PHP取二进制文件头判断文件类型
<?php $files = array('D:\no.jpg', 'D:\no.png','D:\no2.JPEG','D:\no.BMP'); $fileTypes = array( 779 ...
- Linux中用st_mode判断文件类型
Linux中用st_mode判断文件类型 2012-12-11 12:41 14214人阅读 评论(4) 收藏 举报 分类: Linux(8) C/C++(20) 版权声明:本文为博主原创文章, ...
- php 读取文件头判断文件类型的实现代码
php代码实现读取文件头判断文件类型,支持图片.rar.exe等后缀. 例子: <?php $filename = "11.jpg"; //为图片的路径可以用d:/uploa ...
- PHP取二进制文件头快速判断文件类型的实现代码
通过读取文件头信息来识别文件的真实类型. 一般我们都是按照文件扩展名来判断文件类型,但是这个很不靠谱,轻易就通过修改扩展名来躲避了,一般必须要读取文件信息来识别,PHP扩展中提供了类似 exif_im ...
- PHP取二进制文件头快速判断文件类型
<?php /*文件扩展名说明 *7173 gif *255216 jpg *13780 png *6677 bmp *239187 txt,aspx,asp,sql *208207 xls.d ...
- PHP读取文件头(2字节)判断文件类型(转)
看到此标题或许你会说是否是多此一举,直接判断扩展名不就知道文件类型了吗,但是扩展名很容易伪造,这样就绕过了判断.大部分的文件都会将一个特殊的数字或字符存放在文件的特定位置里(开始处的2个字节) /** ...
- 用java流方式判断文件类型
这个方法只能在有限的范围内有效.并不是万金油 比如 图片类型判断,音频文件格式判断,视频文件格式判断等这种肯定是2进制且专业性很强的文件类型判断. 下面给出完整版代码 首先是文件类型枚取 packag ...
随机推荐
- vb.net常用函数
当然,这些都可以从MSDN查到,但是有时候打开帮助老慢的,所以先放到这里放一放,查个函数什么的比较快一点.都是从网上搜来的.Abs(number) 取得数值的绝对值. Asc(String) 取得字符 ...
- 使用EXTEND方式来分段处理大表的搬数据
创建一个表: 记录rowid的分区段并作为处理的日志表: DROP TABLE DEAL_TABLE_EXTENT; CREATE TABLE DEAL_TABLE_EXTENT(seq ...
- C++中指针和引用的选择
何时使用引用和指针 1. 尽可能使用引用传递参数 2. 尽可能的使用const来保护引用和指针 3. 在可以使用引用的时候不要使用指针 4. 不要试图给引用重新 ...
- Eclipse 完全 设置UTF-8 环境
当开始一个新的Java项目时,最好将整个环境设置为UTF-8 一般通过如下几步来设置: 1: 设置工作空间的编码格式:Window -> Preferences -> General -& ...
- node 的 异步 数据库 调用 处理
相信很多人在使用node 的时候, 一方面会觉得他强大的异步性感到很方便. 但是有时候我们却非要程序能按我们自己的想法 去串行的执行我们的思路. 同样我在编写的过程中也遇到类似的问题,比如for 和 ...
- 【翻译】MVC Music Store 教程-概述(三)
Controller 与传统的Web框架,将传入的URL通常映射到磁盘上的文件.例如:一个URL请求“/Products.aspx" 或"/Products.php”是处理一个Pr ...
- Oracle EBS-SQL (SYS-6):sys_在线用户职责查询.sql
/*线用户查询-1*/ SELECT FSAV.USER_NAME,FU.DESCRIPTION,FSAV.RESPONSIBILITY_NAME,FSAV.USER_FORM_NAME,FSAV.L ...
- 解密电子书之二:EPD控制芯片
EPD控制芯片大致上相当于计算机的显卡,没了它,所有电子书都变白板.类似显卡中的ATI与NVIDIA,EPD控制芯片中也是两家:Surf(泰信科)和EPSON(爱普生),其中爱普生是最早推出电子纸显示 ...
- Adobe Acrobat 9 Pro 简体中文正式版(免激活)
软件语言:简体中文版本性质:官方正式版(免激活,非破解) Mac & PC [SN]: 1118-4018-6583-4956-2486-7805 修改 Abcpy.ini 可实现免序列号免激 ...
- 解析nodejs微信开发-2获取ticket
获取ticket是需要拼接url,url中需要获得的tocken 1.先判断有无tocken:若有则拼接url: 2.请求url: a.处理回调数据,注意时间戳和签名处理方式,此两项并未存到ticke ...