iOS UTI (Universal Type Identifier) 通用类型标识符

  1. 同一类型标识符(Uniform Type Identifier,UTI)代表IOS信息共享的中心组件。可以把它看成下一代的MIME类型。UTI是标识资源类型(比如图像和文本)的字符串,他们制定哪些类型的信息将用于公共数据对象,他们不需要依赖于老式的指示符,比如文件扩展名,MIME类型,或者文件类型的元数据

如图,显示了Apple的基本顺应树的一部分。这个树上位于较低位置的任何项目都必须顺应其所有父数据属性。声明一个父UTI意味着支持他的所有子 UTI。因此,可以打开public.data的应用必须能打开文本,电影,图像文件等。其UTI的名称类型就是public.data等

  1. MIME的了解可以去百度百科上有定义:

MIME的定义类型如下 如text/xml就是后缀.xml的MIME类型。

常见的MIME类型(通用型):

超文本标记语言 文本 .html text/html

xml文档 .xml text/xml

  1. 常见的文件扩展名之间的相互转换

首先要添加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);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容