App间的数据的发送和接收服务(一)

拟这个题目很久了,在公司项目中有时会涉及到文件的相关处理,但又因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的苹果官方文档:

https://developer.apple.com/library/content/documentation/Miscellaneous/Reference/UTIRef/Articles/System-DeclaredUniformTypeIdentifiers.html#//apple_ref/doc/uid/TP40009259-SW1

大家可在苹果开发者中心自行搜索到这份文档

这里写图片描述

  • 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间的数据的发送端的博客。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值