iOS UTI (Universal Type Identifier) 通用類型標(biāo)識(shí)符

  1. 同一類型標(biāo)識(shí)符(Uniform Type Identifier,UTI)代表IOS信息共享的中心組件??梢园阉闯上乱淮腗IME類型。UTI是標(biāo)識(shí)資源類型(比如圖像和文本)的字符串,他們制定哪些類型的信息將用于公共數(shù)據(jù)對(duì)象,他們不需要依賴于老式的指示符,比如文件擴(kuò)展名,MIME類型,或者文件類型的元數(shù)據(jù)

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

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

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

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

超文本標(biāo)記語言 文本 .html text/html

xml文檔 .xml text/xml

  1. 常見的文件擴(kuò)展名之間的相互轉(zhuǎn)換

首先要添加MobileCoreServices.framework框架,并且在頭文件中添加

#import <MobileCoreServices/MobileCoreServices.h>

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

(1)后綴名字符串轉(zhuǎn)化為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作為第一個(gè)參數(shù),給UITypeCreatePreferredIdentifierForTag(),是MIME類型字符串轉(zhuǎn)化為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字符串轉(zhuǎn)化為后綴擴(kuò)展名

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

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

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

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

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)獲取順應(yīng)性列表

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

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

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

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

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

下面例子主要是返回字典向上通過順應(yīng)性樹來構(gòu)建一個(gè)數(shù)組,表示給定UTI順序的所有項(xiàng)目.例如public.mpeg類型順應(yīng) 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);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容