分享系列:

(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、UIActivityViewControllerQuick 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)相关推荐

  1. (0098)iOS开发之应用间的分享系列(3)

    (0096)iOS开发之应用间的分享系列(1) (0097)iOS开发之应用间的分享系列(2) 前两篇都是讲的分别是 将自己的应用添加到系统的分享面板 将图片通过分享面板分享到自己的应用中并显示. 这 ...

  2. (0097)iOS开发之应用间的分享系列(2)

    (0096)iOS开发之应用间的分享系列(1) (0097)iOS开发之应用间的分享系列(3) Share Extension将应用添加到系统分享列表 怎么把自己的应用添加到系统分享面板的列表中,并打 ...

  3. iOS开发之线程间的MachPort通信与子线程中的Notification转发

    如题,今天的博客我们就来记录一下iOS开发中使用MachPort来实现线程间的通信,然后使用该知识点来转发子线程中所发出的Notification.简单的说,MachPort的工作方式其实是将NSMa ...

  4. iOS 开发之几个 Demo 分享网站

    OSChina 前往 OSChina Code4App 前往 Code4App CocoaChina 前往 CocoaChina 码云 前往码云

  5. iOS开发的就业形势怎么样?

    以下是 100offer 整理的关于 iOS 开发就业形势的报告,看完就你知道做 iOS 开发多有"钱"途了. 在创业约等于做APP的互联网市场,几乎每一家互联网公司都需要 iOS ...

  6. ios 开发 微信分享失败_一个失落的孩子如何在失败的情况下从失败变成了iOS开发人员...

    ios 开发 微信分享失败 by Jordan LaGrone 乔丹·拉格隆(Jordan LaGrone) 一个失落的孩子如何在失败的情况下从失败变成了iOS开发人员 (How a lost kid ...

  7. iOS开发常见技术链接分享

    1.iOS中打包成IPA包的四种方法 http://www.jianshu.com/p/dd2b66cbf097 2.斯坦大学公开课iOS http://open.163.com/special/op ...

  8. ios开发学习-手势交互(Gesture)效果源码分享

    qianqianlianmeng ios开发学习-手势交互(Gesture)效果源码分享 All Around Pull View 介绍:实现视图四个方向(上下左右)都能够拖动更新(pull to r ...

  9. [分享]iOS开发-UI篇:CAlayer层的属性

    iOS开发UI篇-CAlayer层的属性 一.position和anchorPoint 1.简单介绍 CALayer有2个非常重要的属性:position和anchorPoint @property ...

最新文章

  1. [zz]Ubuntu10.04源 更新源列表
  2. putty network error:Connection refused 乱码
  3. java属性编辑器,即PropertyEditor
  4. 9行代码AC——1011 A+B 和 C (15分)
  5. 【MFC系列-第32天】控件自绘技术
  6. 比特币、以太坊、瑞波币、万融链和区块链
  7. WindowsApi 解压缩文件
  8. Mac的触控板坏了怎么办?将键盘变成鼠标的方法
  9. Linux分区类型EXT2、EXT3、EXT4详解
  10. 一个珊瑚虫倒下了,千万个珊瑚虫站起来!欢呼吧QQ****下载,不断更新
  11. mysql嵌套查询是从外向内执行的吗_MySQL嵌套查询
  12. php加入语音播报功能_微信收付款怎么设置语音播报
  13. Android本地音乐播放器的制作
  14. w7系统桌面没有计算机图标不见了,win7系统桌面图标不见了怎么办?
  15. 鲲鹏920是计算机CPU吗,鲲鹏920是电脑cpu吗
  16. VMware | Workstation中如何进入恢复模式(Recovery)?
  17. 下班之后,回个毛线的工作消息!
  18. 华为测试岗面试经验(附面试流程)
  19. 【快速技巧】手机拍摄的视频如何旋转并保存?
  20. anaconda创建一个新的虚拟环境

热门文章

  1. 工业物联网为“两化融合”带来巨大推力
  2. log4net按照不同的【LEVEL】级别输出到不同文件
  3. php命名空间划重点
  4. 敏捷开发的艺术读书笔记
  5. 多比矢量图开发手册(六)-Web高级图元编程
  6. IDC简报:3月国外最佳共享虚拟主机提供商Top5
  7. [原创]Zynq SDIO WIFI SotfAP调试
  8. Netty实战七之EventLoop和线程模型
  9. Struts2和SpringMVC的执行流程。
  10. mybatis3:Invalid bound statement (not found)