(0096)iOS开发之应用间的分享系列(1)
分享系列:
(1)应用间的分享概要
(2) Share Extension将应用添加到系统分享列表
(3) 在自己的应用中调起系统分享面板分享到面板上的其他应用中
(0097)iOS开发之应用间的分享系列(2)
(0097)iOS开发之应用间的分享系列(3)
应用间的分享概要
iOS 系统分享面板功能的知识介绍,明确需求,确定主题。
UTI(统一类型标识符)
iOS系统中为了更好的进行类型标识,而提供的一套通用的规范,“Uniform Type Identifier(UTI)”,我把它翻译成“统一类型标识符”。
一套苹果给我们提供用来基于Cocoa和Cocoa Touch应用程序中识别实体内容类型的规范,而关于实现内容关联的技术也正是基于这套规范。在iOS和Mac OS开发中,苹果给我们提供了注册文档类型的接口,而这种注册文档类型是全局的,系统中所有应用程序和服务都可以侦测到。《因此我们通过这个底层侦测,A:可以使用其他可选的第三方App来预览我们的App中不支持的文档,B:而且我们还可以通过这个接口在我们的App中打开并处理第三方App的文档。》
需求
使用iOS系统提供的内容分享功能,把第三方App应用中的(PDF、doc、jpg、txt等文件)直接分享到我们的应用中。
原理
要为我们的iOS应用注册可以打开document types(文档类型),然后在第三方应用中,如果它们使用iOS系统提供的内容分享功能,那么就会看到我们的应用程序,点击进行分享。
说白了就是,配置你的应用支持的预览的文件类型。就可以在iOS系统提供的内容分享面板中显示你的应用。
主要技术
主要应用到这种底层侦测的技术有iOS SDK中给我们提供的UIDocumentInteractionController、UIActivityViewController
和Quick Look
框架。此外,在iOS 8中,苹果又给开发者提供了App Extension
,一种更高大上的方式在App之间的实现分享内容。关于UIDocumentInteractionController、UIActivityViewController、Quick Look
框架以及App Extension
的细节,我计划在后面的文章中详细讲解。这篇文章,我们主要是来谈谈如何注册我们App可用的文档类型
以及简单使用我们的App来处理第三方App分享的内容
。
注册可用类型
我们需要在info.plist文件中,添加一个新的属性CFBundleDocumentTypes
(实际上输入的是"Document types"
),这是一个数组类型的属性,意思就是我们可以同时注册多个类型。而针对数组中的每一个元素,都有许多属性可以指定,详细的属性列表我们可以从官方文档上找到: Core Foundation Keys ---- CFBundleDocumentTypes。这里列举我们在做iOS开发时常用的属性:
- CFBundleTypeName(“Icon File Name”)
字符串类型,指定某种类型的别名,也就是用来指代我们规定的类型的别称,一般为了保持唯一性,我们使用UTI来标识。 - CFBundleTypeIconFiles
数组类型,包含指定的png图标的文件名,指定代表某种类型的图标,而图标有具体的尺寸标识:
Device | Sizes |
---|---|
iPad | 64 x 64 pixels, 320 x 320 pixels |
iPhone and iPod touch | 22 x 29 pixels, 44 x 58 pixels (high resolution) |
- LSItemContentTypes(“Document Content Type UTIs”)
数组类型,包含UTI字符串,指定我们的应用程序所有可以识别的类型集合 - LSHandlerRank(“Handler rank”)
字符串类型,指定对于某种类型的优先权级别,而Launcher Service会根据这个优先级别来排列显示的App的顺序。优先级别从高到低依次是Owner、Alternate、Default、None
表示不接受这种类型。
下面示例注册支持文档预览类型
而当我们添加完所有属性后,开始运行我们的程序,然后再回到我们的Info界面,就会看到Document types这个列表已经发生了变化,这就证明我们成功的注册好了App可用的类型。
从QQ 中的我的文件中分享一个图片到,我们的应用中,并拿到分享的图片,显示到我们的应用中。
打开第三方应用
我们在上面的步骤中注册好了我们的App可以识别的类型,现在我们可以打开一个使用UIDocumentInteractionController或者是Quick Look框架来展示内容的第三方App,这里以iPhone 上的QQ程序为例。
在上面的注册步骤中,注册的LSItemContentTypes仅包含了public.image这个UTI。所以我们先从QQ应用程序的我的文件中,打开不同类型的文件进行对比,大家可以看下图我的文件列表中包含俩种类型的文件,一种是.jpg扩展名的图片文件,一种是.pdf扩展名的文档文件。
当我打开一个图片文件进行预览时,点击其他应用打开,就可以在App列表中看到我们的App图标。而如果我打开PDF文件的话,就看不到我们的App图标。
在我们的程序中拿到分享的图片并显示出来
#if __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_9_0
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(nullable NSString *)sourceApplication annotation:(id)annotation
{UINavigationController *navigation = (UINavigationController *)application.keyWindow.rootViewController;ViewController *displayController = (ViewController *)navigation.topViewController;[displayController.imageView setImage:[UIImage imageWithData:[NSData dataWithContentsOfURL:url]]];[displayController.label setText:sourceApplication];return YES;
}#else
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(nonnull NSDictionary<NSString *,id> *)options
{UINavigationController *navigation = (UINavigationController *)application.keyWindow.rootViewController;ViewController *displayController = (ViewController *)navigation.topViewController;[displayController.imageView setImage:[UIImage imageWithData:[NSData dataWithContentsOfURL:url]]];[displayController.label setText:[options objectForKey:UIApplicationOpenURLOptionsSourceApplicationKey]];return YES;
}
#endif
Demo示例可以从GitHub项目上参照代码:SeraZheng—ZSUTITest。当点击ZSUTITestDemo
程序图标回到调用代码中,我们可以在这里做各种我们想做的事,如上传图片、预览图片、操作图片等等。我只对图片做了简单的预览显示,然后显示文件的源程序的Bundle Identifier
,示例如下图:
问题:这种方式对于非iOS 系统应用的文件分享很简单、方便,但是对于系统相册图片分享却找不到我们的应用。解决办法使用 iOS 8以后的 App Extension可以解决。下一篇文章会详细介绍。
参看
iOS实现App之间的内容分享
(0096)iOS开发之应用间的分享系列(1)相关推荐
- (0098)iOS开发之应用间的分享系列(3)
(0096)iOS开发之应用间的分享系列(1) (0097)iOS开发之应用间的分享系列(2) 前两篇都是讲的分别是 将自己的应用添加到系统的分享面板 将图片通过分享面板分享到自己的应用中并显示. 这 ...
- (0097)iOS开发之应用间的分享系列(2)
(0096)iOS开发之应用间的分享系列(1) (0097)iOS开发之应用间的分享系列(3) Share Extension将应用添加到系统分享列表 怎么把自己的应用添加到系统分享面板的列表中,并打 ...
- iOS开发之线程间的MachPort通信与子线程中的Notification转发
如题,今天的博客我们就来记录一下iOS开发中使用MachPort来实现线程间的通信,然后使用该知识点来转发子线程中所发出的Notification.简单的说,MachPort的工作方式其实是将NSMa ...
- iOS 开发之几个 Demo 分享网站
OSChina 前往 OSChina Code4App 前往 Code4App CocoaChina 前往 CocoaChina 码云 前往码云
- iOS开发的就业形势怎么样?
以下是 100offer 整理的关于 iOS 开发就业形势的报告,看完就你知道做 iOS 开发多有"钱"途了. 在创业约等于做APP的互联网市场,几乎每一家互联网公司都需要 iOS ...
- ios 开发 微信分享失败_一个失落的孩子如何在失败的情况下从失败变成了iOS开发人员...
ios 开发 微信分享失败 by Jordan LaGrone 乔丹·拉格隆(Jordan LaGrone) 一个失落的孩子如何在失败的情况下从失败变成了iOS开发人员 (How a lost kid ...
- iOS开发常见技术链接分享
1.iOS中打包成IPA包的四种方法 http://www.jianshu.com/p/dd2b66cbf097 2.斯坦大学公开课iOS http://open.163.com/special/op ...
- ios开发学习-手势交互(Gesture)效果源码分享
qianqianlianmeng ios开发学习-手势交互(Gesture)效果源码分享 All Around Pull View 介绍:实现视图四个方向(上下左右)都能够拖动更新(pull to r ...
- [分享]iOS开发-UI篇:CAlayer层的属性
iOS开发UI篇-CAlayer层的属性 一.position和anchorPoint 1.简单介绍 CALayer有2个非常重要的属性:position和anchorPoint @property ...
最新文章
- [zz]Ubuntu10.04源 更新源列表
- putty network error:Connection refused 乱码
- java属性编辑器,即PropertyEditor
- 9行代码AC——1011 A+B 和 C (15分)
- 【MFC系列-第32天】控件自绘技术
- 比特币、以太坊、瑞波币、万融链和区块链
- WindowsApi 解压缩文件
- Mac的触控板坏了怎么办?将键盘变成鼠标的方法
- Linux分区类型EXT2、EXT3、EXT4详解
- 一个珊瑚虫倒下了,千万个珊瑚虫站起来!欢呼吧QQ****下载,不断更新
- mysql嵌套查询是从外向内执行的吗_MySQL嵌套查询
- php加入语音播报功能_微信收付款怎么设置语音播报
- Android本地音乐播放器的制作
- w7系统桌面没有计算机图标不见了,win7系统桌面图标不见了怎么办?
- 鲲鹏920是计算机CPU吗,鲲鹏920是电脑cpu吗
- VMware | Workstation中如何进入恢复模式(Recovery)?
- 下班之后,回个毛线的工作消息!
- 华为测试岗面试经验(附面试流程)
- 【快速技巧】手机拍摄的视频如何旋转并保存?
- anaconda创建一个新的虚拟环境