拟这个题目很久了,在公司项目中有时会涉及到文件的相关处理,但又因iOS的沙盒机制(sandbox)而感到畏首畏尾,写这篇博客意在打破苹果对文件的一些限制,当然是用的是正规的手段。
先来回顾一下iOS的沙盒机制:
- 每个应用程序都有自己的存储空间。
- 每个应用程序都不可以翻过自己的围墙去访问别的存储空间的内容。(已经越狱的除外)
- 在访问别人沙盒内的数据时需要访问权限。
本篇我们将以UTI的方式建立对app内的文件进行发送和接收服务。
UTI(统一类型标识符)
定义:一套苹果给我们提供用来在基于Cocoa和Cocoa Touch应用程序中识别实体内容类型的规范,而关于实现内容关联的技术也是基于这套规范。在iOS和Mac OS开发中,苹果给我们提供了注册文档类型的接口,而这种注册的文档类型是全局的,系统中所有的应用程序和服务都可以侦测到。
作用:我们通过这个底层侦测,可以使用其他可选的第三方App来预览我们的App中的文档,而且我们还可以通过这个接口在我们的App中打开并处理第三方App的文档。
苹果为什么要出这样一套规范呢,我们可以举个例子:
'jpg'、'JPG'、'jpeg'、'JPEG'、'image/jpeg'其实是同一个类型的image格式,要是能有一个类型能够完全替代他们就好了
于是便有了UTI。
我贴出UTI的苹果官方文档:
大家可在苹果开发者中心自行搜索到这份文档
- Identifier
UTI标识的id,采用反域名规则,Apple给我们提供了在iOS和Mac应用中通用的UTI字符串集合,比如,’public.data’、’public.image’、‘com.apple.bundle’等。
- Conforms to
UTI中的内容形式的继承结构中的父级,同等于Identifier是一种UTI标识id。
这个层级结构可以这样看:
- ‘public.jpeg’的父级是’public.image’
- ‘public.image’的父级是’public.data’
也就是说,app的底层数据接收服务可针对UTI进行精准的侦测,
public.jpeg可识别.jpeg的图片;
public.image可识别image类型(‘.jpeg’、‘.png’、‘gif’等)的图片;
public.data可识别data类型(image、word、excel、pdf、text等)的数据;
...
注册可用类型
在info.plist文件中,添加一个新的key属性Document types,这是一个Array类型的属性,意思就是我们可以同时注册多个类型。
Document Type Name
指定某种类型的别名,一般为了保持唯一性,我们可以使用UTI来标识。Handler rank
包含Owner、Default、Alternate、None四个可选值,指定对于某种类型的优先权级别,分享服务会根据这个优先级别来排列显示的App的顺序。优先级别从高到低依次。Document Content Type UTIs
填写UTI,系统中所有的应用程序中的服务的侦测标识。
一般公司的项目文件,多以word、excel、pdf为主,我们将已public.data类型,搭建起接收文件的服务。
接收方式采用application openURL的方式进行Document的接收方式(注意进行iOS9的函数区分)。
#if __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_9_0
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(nullable NSString *)sourceApplication annotation:(id)annotation {
LBPreviewViewController *vc = [[LBPreviewViewController alloc] init];
vc.url = url;
[[UIApplication getCurrentViewController].navigationController pushViewController:vc animated:YES];
return YES;
}
#else
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(nonnull NSDictionary<NSString *,id> *)options {
LBPreviewViewController *vc = [[LBPreviewViewController alloc] init];
vc.url = url;
[[UIApplication getCurrentViewController].navigationController pushViewController:vc animated:YES];
return YES;
}
#endif
url
文件位于手机设备中的沙盒地址,用于文件预览的绝对路径。options
附带的参数值,包括document source(UIApplicationOpenURLOptionsSourceApplicationKey文件来源);
使用时是否会copy(UIApplicationOpenURLOptionsOpenInPlaceKey分享过来的是一个沙盒地址的绝对路径);
项目附带的注释(UIApplicationOpenURLOptionsAnnotationKey,附带的注释值)
可使用QQ建立起文件的发送服务,发送一个word.docx文档
接收到之后,可使用QuickLook对文件进行预览或者做进一步的发送操作。有空我再来写一篇关于App间的数据的发送端的博客。
…