ios 统一类型标识符

macOS SwiftUI 获取本地文件的类型标识符UTType macOS SwiftUI 获取本地文件的类型标识符UTType。URL类型具有与其所关注资源有关的值的集合。对于文件,这些值可以提供类型标识符,创建或修改日期(无论它是否是目录)等等。 立即下载

    统一类型标识符是iOS系统在分享信息时所使用的中心组件,可以将他们看成是新一代的MIME类型。UTI是一种字符串,能够表示诸如图像及文本等资源类型。UTI指明了程序之间将要共用的数据对象是何类型。他们并不依赖于原有的各种指示符,比如文件扩展名、MIME类型或是OSType等与文件类型有关的元数据。UTI用一种更新颖、更灵活的技术取代了原有的那些技术。

    UTI的命名遵循反向域名样式。由苹果公司所定义的那些常用标识符,遵循public.html及public.jpeg这样的格式。前者表示HTML原文本,后者表示JPEG图像,这两种UTI都对应于特定类型的信息。

    继承在UTI中扮演了重要角色。UTI使用了与面向对象类似的继承体系,其中的子UTI与上级UTI之间有is-a的关系。子UTI继承了上级UTI的全部属性,此外还添加了一些更为具体的属性,用以体现它所代表的特定信息类型。之所以要这样设计,是因为对于每一个UTI来说,既有比它更通用的UTI,又有比它更具体的UTI。我们以表示JPEG图像的UTI为例来说明。JPEG图像(public.jpeg)是一种图像(public.image),而图像又是一种数据(public.data)。数据是一种用户可以看到或听到的内容(public.content),而内容又表示了一个条目(public.item)。public.item是UTI体系中的通用基础类型。整套体系叫作遵循体系,其中的子UTI”遵循“它的上级UTI。比方说,更为具体的jpeg型UTI就遵循更加通用的image型或data型UTI。

    苹果公司的基本遵循树。树中位置较低的UTI,必须遵循其上级UTI的全部数据属性。如果声明了某个上级UTI,那就表示要支持它的全部子UTI。比方说,如果某程序宣传自己能打开public.data类型的数据,那它就必须能处理文本、电影以及图像文件等内容才行。


    UTI可以多重继承。某个条目可以遵循不止一个上级UTI。所以,我们可以宣传它同时遵循public.text及public.image,这样就能指定一种既能容纳文本又能容纳图像的数据类型了。

    虽说每个UTI都应该遵循命名规范,但却没有统一的UTI注册机构。public域用来表示iOS专用的类型,大部分应用程序都可以共用这些类型。苹果公司生成了一份由public UTI所构成的完整体系图表。

1、根据文件扩展名来决定UTI

    Mobile Core Services模块提供了一些工具,可以根据文件扩展名来获取UTI信息。在使用这些基本C语言的函数之前,必须先引入相关模块。下面这个函数会根据传入的ext字符串参数来返回首选的UTI。返回的这个UTI是一个代表标识符的字符串:

NSString *preferredUTIForExtension(NSString *ext)
{
    NSString *theUTI = (__bridge_transfer NSString *)UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (__bridge CFStringRef)ext, NULL);
    return  theUTI;
}

    开发者也可以不传入文件扩展名,而是传入MIME类型,此时UTTypeCreatePreferredIdentifierForTag()的第一个参数应该改为kUTTagClassMiMeType。下面这个函数可以根据给定的MIME类型返回首选的UTI:

NSString *preferredUTIForMIMEType(NSString *mime)
{
    NSString *theUTI = (__bridge_transfer NSString *)UTTypeCreatePreferredIdentifierForTag(kUTTagClassMIMEType, (__bridge CFStringRef)mime, NULL);
    return  theUTI;
}

    开发者可以用上面的这两个函数,把文件名及MIME类型转换成访问文件时经常会用到的UTI类型。


2、把UTI转换成扩展名或MIME类型

    UTTypeCopyPreferredTagWithClass()函数可以把UTI转换成首选扩展名或MIME类型。如果给下面这两个函数传入public.jpeg,那么它们就会分别返回jpeg和image/jpeg:

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

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

    使用这两个函数的时候,必须传入树状结构最低端的UTI,也就是与具体的扩展名直接对应的UTI开发者不能只给出上级UTI的类型。扩展名声明在属性列表中,像文件扩展名及默认图标等特征信息,都是在属性列表里描述的。举例来说,开发者如果给extensionForUTI函数传入public.text或public.movie,那么函数会返回nil,但如果传入的是public.plain-text和public.mpeg,则会分别返回txt和mpg。

    前面给出的public.text及public.movie这两个UTI,在整个树状结构中所处的位置太高了,extentsionForUTI函数需要开发者提供更加具体的类型,而不是这种比较抽象的类型。目前并没有API函数能够在抽象的UTI上面找到应用程序中继承自该UTI的所有自条目。读者可以访问bugreport.apple.com,向苹果公司提交这一改进建议。更定有某个地方注册了所有的扩展名和MIME类型,不然的话,UTTypeCopyPreferredTagWithClass()函数怎么能执行转换。

3、判断两个UTI之间是否有依从关系

    UTTypeConformsTo()函数可以判断UTI之间的依从关系。此函数接收两个参数,一个表示待比较的源UTI,另一个表示用于参照的UTI。如果前者遵循后者,那么函数就返回true。通过这个函数,我们可以判断出某个具体的UTI是否遵循另一个宽泛的UTI。UTTypeEqual()函数则可以判断两个UTI是否相等。下面这段范例代码演示了如何判断某个文件路径是否指向图像资源:

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"));
}

4、获取依从关系列表

    在iOS的API中,UTTypeCopyDeclaration()可以算是最为通用也最为有用的UTI函数了。它所返回的字典中包含下列键:

    1、kUTTypeIdentifierKey——表示调用者传给函数的UTI名称。

    2、kUTTypeConformsToKey——表示该类型所遵循的上级类型。

    3、kUTTypeDescriptionKey——如果UTI名称还有一种易于理解的描述方式,那么该键所对应的值就是那种描述方式。

    4、kUTTypeTagSpecificationKey——该键对应于一份字典,字典里含有与调用者所传入的UTI等效的OSType、文件扩展名及MIME类型。

    除了上述常用的键之外,还有一些键用于指明导入和导出的UTI声明(kUTImportedTypeDeclarationsKey与kUTExportedTypeDeclarationsKey)、同UTI相关联的图标资源(kUTTypeIconFileKye)、指向该类型描述页面的URL(kUTTypeReferenceURLKey),以及该UTI的版本字符串(kUTTypeVersionKey)。

    开发者可以在UTTypeCopyDeclaration()所返回的字典上面,沿着依从关系树进行遍历,从而构建出一份数组,并且令这份数组能够包含该UTI所遵循的全部上级UTI。比方说,public.mpeg类型的UTI遵循public.movie、public.audiovisualcontent、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 objectForKey:(__bridge NSString *)kUTTypeConformsToKey];
    if (!conforms) {
        return results;
    }
    
    if ([conforms isKindOfClass:[NSString class]]) {
        [results addObjectsFromArray:conformanceArray(conforms)];
        return uniqueArray(results);
    }
    
    if ([conforms isKindOfClass:[NSArray class ]]) {
        for (NSString *eachUTI in conformanceArray(eachUTI)) {
            [results addObjectsFromArray:conformanceArray(eachUTI)];
            
        }
        return uniqueArray(results);
    }
    
    
    return  results;
}


PCB工艺-SI9000-模型选择 本文介绍了PCB设计中常用的阻抗计算模型,主要包括外层、内层和嵌入式三类共12种计算模型,涵盖单端/差分、共面等不同场景。针对阻抗计算中的关键参数,文章提供了经验值参考:表层走线厚度0.035mm(1.4mil),内层0.0152mm(0.6mil);并列出常见PP材料的介电常数(3.8-4.5)和成品厚度(3-7.5mil)。作者建议90%的设计问题可通过上述模型解决,层叠参数建议咨询PCB厂家获取。 阅读详情

相关推荐

GD32F470实战:如何用EXMC+SDRAM为LVGL打造超大内存池(附完整配置代码)

本文详细介绍了如何利用GD32F470的EXMC接口与SDRAM深度整合,为LVGL构建高性能内存解决方案。通过硬件架构设计、EXMC接口配置、高级内存管理策略及LVGL性能优化技巧,开发者可以突破微控制器内存限制,实现高分辨率显示和复杂动画效果。附完整配置代码,助力嵌入式GUI开发。

rrr55的博客 546

iOS 统一类型标识符概述

最近公司的活比较少,空闲时间十分多,遍寻思着写一款APP。在这个过程中便有使用到统一类型标识符,于是翻译了这个文档。原文地址目前写的这个是本地阅读软件,后续会把在写这个APP用到的技术以及遇到的问题都整理出来,通过博客的形式分享给大家。奇迹读书地址应用程序开发人员面临的挑战之一是用于识别数据类型的方法的激增。例如,一些文本文件可能被分配为“TEXT”文件类型(最初为Mac OS 9及更早版本设计),而其他文本文件可能只是有一个.txt扩展名。有些可能使用.text扩展名。

jiuchabaikaishui的专栏 929

从Si3N4到SiNx:一文搞懂芯片制造中氮化硅的化学式玄机(附工艺参数影响)

本文深入探讨了芯片制造中氮化硅(SiNx)化学式的调控艺术,揭示了从Si3N4到SiNx的转变如何影响材料性能。通过分析PECVD和PVD工艺参数对x值的精确调控,以及x值对电学和机械性能的影响,为半导体制造提供了实用的工艺优化策略。

weixin_30776273的博客 191

IOS UTI

转自:http://blog.youkuaiyun.com/heroguo_jp/article/details/51134308 前言  最近项目中有个需求,在iOS设备上使用ios系统提供的内容分享功能,从第三方App应用直接分享实体内容到我们的应用中。其大概的原理是这样的,首先为我们的iOS应用注册可以打开document types(文档类型),然后在第三方应用中,如果

dongtinghong的专栏 769

别再用RIDE了!VSCode+RobotFramework插件打造现代化测试开发环境

本文介绍了如何利用VSCode和RobotFramework插件构建现代化的测试开发环境,替代老旧的RIDE工具。详细讲解了环境配置、插件安装、智能代码补全、测试运行与调试等核心功能,帮助开发者提升自动化测试效率。文章还提供了高级技巧、最佳实践和常见问题解决方案,助力团队实现平滑迁移。

weixin_28829629的博客 480

ADS实战指南:负载牵引(Loadpull)在射频功放设计中的关键应用

本文深入解析了负载牵引(Loadpull)技术在射频功率放大器设计中的核心作用与实战方法。通过生动的比喻和详细的ADS软件操作指南,阐述了如何通过系统扫描负载阻抗,在史密斯圆图上绘制等功率线与等效率线,从而精准找到最优阻抗点,以平衡输出功率与效率,是应对5G等现代通信系统严苛要求的必备技能。

weixin_29198045的博客 601

iOS导入应用外文件

之前需求提出想要像安卓一样从手机的文件夹获取文档 安卓那种肯定做不到,只能用像QQ、微信之类的外部app传入文档。在网上看了一些资料,总结如下: 1、拷贝文档方式,如图 这是从QQ上打开的word文档,然后点击用其他应用打开,图中第二行,可以找到很多其他app,问题是如何让自己的app处于其中。 方法如下: 其实只需要在info.plist注册文件类型,就可以在其他app中找到...

郎lang郎的博客 2417

QML实现ListView的拖动排序

现有一种需求,就是用鼠标拖动某项,动态去改变某一项在ListView中显示的顺序位置,经过研究及实践实战,实现方式的核心代码如下: import QtQuick 2.4 import QtQuick.Controls 1.3 import QtQuick.Window 2.2 import QtQuick.Dialogs 1.2 Rectangle { width: 800 ...

草上爬的博客 7563

iphone开发必知点之--文件路径

1.开发平台路径: /Developer/Platforms 此路径下一般有三个目录,分别是mac电脑、模拟器、iphone真机 MacOSX.platform iPhoneSimulator.platformiPhoneOS.platform 每个目录下都有一个/Developer/usr/bin目录,放置开发中需要的程序 总的目录比如:/Develop...

aa631555244的博客 339

使用abagen工具箱获取基于脑区的基因表达矩阵

脑区模板定义了您感兴趣的脑区的空间位置。abagen提供了一些预定义的脑区模板,您可以选择使用,也可以使用自定义的脑区模板。它提供了一种简便的方式来获取基于脑区的基因表达矩阵。abagen需要使用Allen脑图谱数据来获取基因表达矩阵。您可以使用abagen内置的下载功能来获取这些数据。这就是使用abagen工具箱获取基于脑区的基因表达矩阵的详细步骤。通过按照上述步骤操作,您可以轻松获取并使用Allen脑图谱数据中的基因表达信息。一旦您加载了脑区模板,您可以使用abagen来获取基于脑区的基因表达矩阵。

web_bug407的博客 1326

利用requests库下载bilibili字幕文件

文章目录1. 前言2. 程序下载大法好2.1 挖掘思路2.2 核心知识点2.3 汇总代码 1. 前言   之前的博客介绍了使用工具下载B站视频,但美中不足的是无法下载字幕。为了提高效率,将下载字幕的工作用程序自动化处理。 2. 程序下载大法好 2.1 挖掘思路   在谷歌浏览器中按下F12,打开谷歌开发者工具。搜索subtitle,则会得到一个json文件,如下图所示:   在网页中空白位置点击查看网页源代码,然后通过搜索(Ctrl+f)查找subtitle,则会发现在subtitle_url中包含了对应

herosunly的博客 4万+

IOS UTI统一类型标识符:判断文件类型通过后缀

今天在学习文档和数据共享中,首先讲的处理统一类型标识符UTI。第一次见,所以记下来以备之用,首先了解UTI和MIME的概念 1.同一类型标识符(Uniform Type Identifier,UTI)代表IOS信息共享的中心组件。可以把它看成下一代的MIME类型。UTI是标识资源类型(比如图像和文本)的字符串,他们制定哪些类型的信息将用于公共数据对象,他们不需要依赖于老式的指示符,比如文件扩展名...

weixin_33958585的博客 1042

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

《iOS 6高级开发手册(第4版)》——2.1节秘诀:处理统一类型标识符

本节书摘来自异步社区《iOS 6高级开发手册(第4版)》一书中的第2章,第2.1节秘诀:处理统一类型标识符,作者 【美】Erica Sadun,更多章节内容可以访问云栖社区“异步社区”公众号查看 2.1 秘诀:处理统一类型标识符iOS 6高级开发手册(第4版)统一类型标识符(Uniform Type Identifier,UTI)代表iOS信息共享的中心...

weixin_34112181的博客 219

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

IOS UTI(统一类型标识符) 根据文件后缀打开APP

苹果UTI 统一类型标识符,通过文件后缀打开对应APP

HiroGuo 的博客 9734

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

iOS给应用添加支持的文件类型/根据文件类型打开应用

iOS给应用添加支持的文件类型/根据文件类型打开应用 之前写过类似的文章 IOS UTI(统一类型标识符) 根据文件后缀打开APP 和 自定义UTI 注册你的APP所支持的文件类型 这里 再次总结说明。 已经存在的UTL类型 苹果官方文档提供了常见情况下,所支持的UTL类型 【链接】 如何添加已经存在的类型 在Xcode中选择TARGES----> Info 添加 Document type...

HiroGuo 的博客 5189

(0096)iOS开发之应用间的分享系列(1)

UTI(统一类型标识符) iOS系统中为了更好的进行类型标识,而提供的一套通用的规范,“Uniform Type Identifier(UTI)”,我把它翻译成“统一类型标识符”。 一套苹果给我们提供用来基于Cocoa和Cocoa Touch应用程序中识别实体内容类型的规范,而关于实现内容关联的技术也正是基于这套规范。在iOS和Mac OS开发中,苹果给我们提供了注册文档类型的接口,而这种注册文档...

沐雨07的专栏 736

UTI 唯一类型标识

本文转载至http://blog.youkuaiyun.com/zaitianaoxiang/article/details/6657231 applicationdocumentationtypessystemstringlist Adopting Uniform Type Identifiers采用统一类型标识符Introduction to Uniform Type ...

a1311010193的博客 157

TrollStore技术说明:Info.plist配置类型说明

TrollStore作为一款革命性的iOS应用永久签名工具,其核心功能依赖于对Info.plist文件的深度操作和技术实现。本文详细解析TrollStore在Info.plist文件中声明的各类配置类型及其技术实现原理,为安全研究人员和开发者提供专业的技术参考。 ## Info.plist关键技术配置类型 ### 1. URL Scheme配置 TrollStore通过声明系统级别的URL ...

gitblog_00353的博客 1107

iOS 打开第三方 APP 配置 参数

iOS 打开第三方 APP 配置 参数 https://developer.apple.com/library/mac/documentation/Miscellaneous/Reference/UTIRef/Articles/System-DeclaredUniformTypeIdentifiers.html System-Declared Uniform Type Identifi

jeffasd的专栏 2399

《iOS 6高级开发手册(第4版)》——导读

本节书摘来自异步社区《iOS 6高级开发手册(第4版)》一书中的目录,作者 【美】Erica Sadun,更多章节内容可以访问云栖社区“异步社区”公众号查看 目 录 第 1 章 特定于设备的开发 1.1 访问基本的设备信息 1.2 添加设备能力限制 1.3 秘诀:检查设备接近度和电池状态 1.4 秘诀:取回额外的设备信息 1.5 秘诀:使用加速...

weixin_33805992的博客 123

OC_实现在其他APP中打开与UTI

简述 在打开一些文件时,经常可以看到有在XXXAPP中打开,例如使用照片查看器查看图片,或者是通过QQ、微信分享之类的功能。那么这个功能是怎么实现的呢,其实非常简单,只需要在 Info.plist 文件中进行相关的配置即可在文件分享页面看到自己APP的图标了。 UTI 首先我们要先了解一下UTI,因为网上可以搜到的资源实在是比较少,怕自己忘记还是先记录一下。 UTI是苹果公司提供的统一类型标识符,...

weixin_34319374的博客 329

UTI iPhone支持依文件后缀名打开应用

本文转载至http://blog.youkuaiyun.com/zaitianaoxiang/article/details/6658492 iphoneapplicationprocessingfileurltypes File type handling is new with iPhone OS 3.2, and is different than t...

a1311010193的博客 173

Xamarin.ios 使文件以自己应用程序方式打开 open in



天高任鸟飞 852

ios保存gif到相册_iOS相册中的GIF图片的读取与保存

大家都知道iOS的系统相册是不支持gif图片预览的。但是,这并不代表系统相册不能保存和读取gif图片。通过Safari长按gif图片,选择保存到相册,这时保存到相册里的图片就是gif的,虽然它不会动。下面将介绍如何对系统相册进行gif的读取与保存。什么是 UTIiOS系统相册是根据 UTI 来区分资源类型的。那什么是 UTI呢。UTI字面意思是:Uniform Type Identifiers(统...

weixin_42494796的博客 1066
上一篇: ios 定制UICollectionViewFlowLayout类实现网格布局
下一篇: ios 剪贴板
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值