IOS UTI统一类型标识符:判断文件类型通过后缀
今天在學(xué)習(xí)文檔和數(shù)據(jù)共享中,首先講的處理統(tǒng)一類型標(biāo)識(shí)符UTI。第一次見,所以記下來(lái)以備之用,首先了解UTI和MIME的概念
1.同一類型標(biāo)識(shí)符(Uniform Type Identifier,UTI)代表IOS信息共享的中心組件。可以把它看成下一代的MIME類型。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等
?
2.MIME的了解可以去百度百科上有定義:http://baike.baidu.com/link?url=TQx8NxQPb8m5bsMWVR6p7NIFemdxyPh6RH_uG01FTKNIg7-iy4-TLiUXVIOxj-BavNOWugJCixMEywo7vJrdPq
MIME的定義類型如下 如text/xml就是后綴.xml的MIME類型。
? ? ? ? ? ? ? ? ? ?常見的MIME類型(通用型):?
超文本標(biāo)記語(yǔ)言文本 .html text/html xml文檔 .xml text/xml 3.常見的文件擴(kuò)展名之間的相互轉(zhuǎn)換 首先要添加MobileCoreServices.framework框架,并且在頭文件中添加#import <MobileCoreServices/MobileCoreServices.h>
以下都用的是C語(yǔ)言編寫的
(1)后綴名字符串轉(zhuǎn)化為UTI字符串
-(NSString *)preferredUTIForExtention:(NSString *)ext {//Request the UTI via the file extensionNSString *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 extentionNSString *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è)示例,說(shuō)明如何順應(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)的字典。
?下面例子主要是返回字典向上通過(guò)順應(yīng)性樹來(lái)構(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 conformanceif (!conforms) return results;// Single conformanceif ([conforms isKindOfClass:[NSString class]]){[results addObjectsFromArray:conformanceArray(conforms)];return uniqueArray(results);}// Iterate through multiple conformanceif ([conforms isKindOfClass:[NSArray class]]){for (NSString *eachUTI in (NSArray *) conforms)[results addObjectsFromArray:conformanceArray(eachUTI)];return uniqueArray(results);}// Just return the one-item arrayreturn 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); }?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/haibosoft/p/4180587.html
總結(jié)
以上是生活随笔為你收集整理的IOS UTI统一类型标识符:判断文件类型通过后缀的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 这个行业一半人月薪超过8千!
- 下一篇: 奥利给!搞定JVM就靠它了!不看感觉错过