iOS的应用程序实现之间的内容分享
前言
我们在iOS的平台上想要实现不同应用之间的内容分享一般有几种常用方式:
- 一种第的英文通过
AirDrop实现不同设备的应用之间文档和数据的分享; - 第二种是给每个应用程序定义一个URL方案,通过访问指定了URL Scheme的一个URL,实现直接访问一个APP;
- 第三种是通过
UIDocumentInteractionController或者是UIActivityViewController这两个个iOS SDK中封装好的类在App之间发送数据,分享数据和操作数据; - 第四种是通过
App Extension,在iOS 8的SDK中提供的扩展新特性实现跨应用的数据操作和分享; - 还有一种集成第三方SDK实现的有限个应用的数据分享,比如社交平台(QQ,微信,新浪微博等)给我们提供的官方SDK,或者是集成了多个社交平台的ShareSDK组件和友盟分享组件等。
关于集成第三方SDK的使用,各大平台官网上都有详细的文档说明,因此我们这系列文章主要是来谈谈苹果原生提供的基于iOS SDK的分享技术,同时推荐俩篇苹果开发者中心的文档:应用间通信和文档交互编程主题为iOS。我们的第一篇文章就谈一下如何通过UTI让我们的应用程序支持分享。
原理
我在“详解苹果提供的UTI(统一类型标识符)”这篇文章中,详细地讲讲了一下UTI(Uniform Type Identifier),一套苹果给我们提供用于在可可和可可触摸应用程序中识别实体内容类型的规范,而关于实现内容关联的技术也正是基于这套规范。在iOS和Mac OS开发中,苹果给我们提供了注册文档类型的接口,而这种注册的文档类型是全局的,系统中所有的应用程序和服务都可以侦测到。因此我们通过这个底层侦测,使用可以可选其他的第三方App来预览我们的App中不请立即获取iTunes的文档,我们而且还可以通过这个接口在我们的App中打开并处理第三方App的文档。
如果我们的应用程序可以处理某些类型的实体内容,我们那么就可以在我们项目中的Info.plist文件中进行注册。关于使用哪种类型和UTI,就要参考我在“详解苹果提供的UTI(统一类型标识符)“这篇文章中的讲解。当一个第三方应用程序通过苹果的底层侦测技术检查有哪些应用程序可以处理它所指定的内容类型时,如果我们的应用程序已经注册了这种类型,那么我们的应用程序图标就会显示在其中,并且作为我们自己的应用程序的一个入口。
主要技术
主要应用到这种底层侦测的技术有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图标的文件名,指定代表某种类型的图标,而图标有具体的尺寸标识:
设备 尺寸 iPad的 64 x 64像素,320 x 320像素 iPhone和iPod touch 22 x 29像素,44 x 58像素(高分辨率)
- LSItemContentTypes(
"Document Content Type UTIs")
数组类型,包含UTI字符串,指定我们的应用程序所有可以识别的类型集合 - LSHandlerRank(
"Handler rank")
字符串类型,包含Owner,Default,Alternate,None四个可选值,指定对于某种类型的优先权级别,而Launcher Service会根据这个优先级别来排列显示的应用程序的顺序。优先级别从高到低依次是Owner,Alternate,Default。None表示不接受这种类型。
了解这些基本属性,我们就需要在注册App可用类型时,指定这些属性,根据每个项目的需求不同,属性值也不同。具体注册请参照我的GitHub上的项目:SeraZheng --- ZSUTITest。下图示例作为一个参照:
而当我们添加完所有属性后,开始运行我们的程序,然后再回到我们的信息界面,看到就会Document types这个列表已经发生了变化,这就证明我们成功的注册好了应用程序可用的类型。
打开第三方应用
我们在上面的步骤中注册好了我们的应用程序可以识别的类型,现在我们可以打开一个使用UIDocumentInteractionController或者是Quick Look框架来展示内容的第三方App,这里以iPhone上的QQ程序为例。
我们在上面的注册步骤中,的注册LSItemContentTypes仅所有游戏了public.image这个UTI。所以我们先从QQ程序应用的我的文件中,打开不同类型的文件进行对比,可以大家看下图产品我的文件列表中所有游戏俩种类型的文件,一种的英文.jpg扩展名的图片文件,的英文一种.pdf扩展名的文档文件。
当我打开一个图片文件进行预览时,点击其他应用打开,就可以在应用程序列表中看到我们的应用程序图标。简单介绍一下这个页面,第一行是苹果在iOS的7给之后我们提供的使用AirDrop在iPhone,iPad或iPod Touch设备之通过间iCloud共享内容的一种方式。第二行是通过文档类型关联技术识别的应用程序的列表。行第三的英文通过文档关联技术识别的Action的列表,Action表示对文档可进行的操作,如复制,打印等。
而如果我打开PDF文件的话,就看不到我们的应用程序图标。
程序回调
当我们通过上面步骤,成功地显示了ZSUTITestDemo的图标之后,点击图标,我们就可以跳转到ZSUTITestDemo应用中,而苹果在iOS SDK中给我们提供的接收回调的方法在iOS 9之后做出了改变,因此我们需要针对不同的设备版本做出改变:
#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
演示示例可以从GitHub项目上参照代码:SeraZheng --- ZSUTITest。当点击ZSUTITestDemo程序图标回到调用代码中,我们可以在这里做各种我们想做的事,如上传图片,预览图片,操作图片等等。我只对图片做了简单的预览显示,然后显示文件的源程序的Bundle Identifier,示例如下图:

iOS的应用程序实现之间的内容分享的更多相关文章
- Android 应用程序之间内容分享详解(一)
一个Andoird应用程序的重要的地方是他们有相互沟通和整合的能力,一个应用程序可以和另一个应用程序交互,接下来我们来看看Android应用之间的内容分享 当你构建Intent的时候,必须要指定Int ...
- Android 应用程序之间内容分享详解(二)
转载请注明出处:http://blog.csdn.net/xiaanming/article/details/9428613 Android 应用程序之间内容分享详解(一) 之前给大家分享了你开发的应 ...
- iOS开发人员程序许可协议
请细致阅读以下的许可协议条款和条件之前下载或使用苹果软件. 这些条款和条件构成你和苹果之间的法律协议. iOS开发人员程序许可协议 目的 你想使用苹果软件(例如以下定义)来开发一个或多个应 ...
- fir.im Weekly - iOS/Android 应用程序架构解析
假如问你一个iOS or Android app的架构,你会从哪些方面来说呢? 本期 fir.im Weekly 收集了关于 iOS/Android 开发资源,也加入了一些关于 Web 前端方面的分 ...
- iOS-马上着手开发iOS应用应用程序-第二部分构建应用程序
第二部分构建应用程序 1,应用程序开发过程 2,设计用户界面 3,定义交互 4,教程:串联图 1,应用程序开发过程 定义概念 设计用户界面 定义交互 实现行为整合数据 对象是应用程序的基石 类是对象的 ...
- iOS开发拓展篇—应用之间的跳转和数据传递
iOS开发拓展篇—应用之间的跳转和数据传 说明:本文介绍app如何打开另一个app,并且传递数据. 一.简单说明 新建两个应用,分别为应用A和应用B. 实现要求:在appA的页面中点击对应的按钮,能够 ...
- 如何:在 DHTML 代码和客户端应用程序代码之间实现双向通信
https://msdn.microsoft.com/zh-cn/library/a0746166 可以使用 WebBrowser 控件向 Windows 窗体客户端应用程序添加现有的动态 HTML ...
- Android学习--跨程序共享数据之内容提供其探究
什么是内容提供器? 跨程序共享数据之内容提供器,这是个什么功能?看到这个名称的时候最能给我们提供信息的应该是“跨程序”这个词了,是的重点就是这个词,这个内容提供器的作用主要是用于在不同的引用程序之间实 ...
- 高大上的微信小程序中渲染html内容—技术分享
大部分Web应用的富文本内容都是以HTML字符串的形式存储的,通过HTML文档去展示HTML内容自然没有问题.但是,在微信小程序(下文简称为「小程序」)中,应当如何渲染这部分内容呢? 解决方案 wxP ...
随机推荐
- MySql中引擎
1. InnoDB 引擎 MySQL 5.5 及以后版本中的默认存储引擎,它的优点如下:灾难恢复性好,支持事务,使用行级锁,支持外键关联,支持热备份. InnoDB引擎中的表,其数据的物理组织形式是簇 ...
- 初涉二维数点问题&&bzoj1935: [Shoi2007]Tree 园丁的烦恼
离线好评 Description 很久很久以前,在遥远的大陆上有一个美丽的国家.统治着这个美丽国家的国王是一个园艺爱好者,在他的皇家花园里种植着各种奇花异草.有一天国王漫步在花园里,若有所思,他问一个 ...
- Linux中的定时任务简单操作实例
今天,我怀着一颗感恩的心,写了一个小小的定时任务,细想还是写个简单的例子吧,希望能帮到你! 首先我在/usr/local/文件夹下创建了一个文件,hah.sh文件 在hah.sh里面编写shell脚本 ...
- SVM 支持向量机算法介绍
转自:https://zhuanlan.zhihu.com/p/21932911?refer=baina 参考:http://www.cnblogs.com/LeftNotEasy/archive/2 ...
- PowerShell-第2章 管道
2.1 过滤列表项或命令输出项 列出所有正在运行进程名称中包含"search"的进程,对进程名字属性使用-like操作符来比较进程的Name属性 Get-Process | Whe ...
- Ubuntu新装系统要装软件
1. 在虚拟机中新安装系统的时候,通常因为时间过了很长,软件有更新之后,安装vim的时候会出错,因此,装完系统先要做的: cd /var/lib/dpkg/updates/ ls sudo apt-g ...
- js--如何判别 null undefined
收集资料如下判断: 1.判断undefined: ? 1 2 3 4 var tmp = undefined; if (typeof(tmp) == "undefined"){ a ...
- pycharm中脚本执行的3种模式(unittest框架、pytest框架、普通模式)
背景知识,某次使用HTMLTestRunner的时候,发现一直都无法导出报告,后来查询资料发现了一些坑,现在整理一下来龙去脉. 一:pycharm默认的是pytest框架去执行unittest框架的测 ...
- nginx报错504
Nginx 504错误(Gateway time-out 网关超时)的含义是所请求的网关没有请求到,简单来说就是没有请求到可以执行的PHP-CGI. 一般看来, 这种情况可能是由于nginx默认的f ...
- [USACO08DEC]Trick or Treat on the Farm (拓扑排序,DP)
题目描述 每年万圣节,威斯康星的奶牛们都要打扮一番,出门在农场的N个牛棚里转 悠,来采集糖果.她们每走到一个未曾经过的牛棚,就会采集这个棚里的1颗糖果. 农场不大,所以约翰要想尽法子让奶牛们得到快乐. ...