前言

我们在iOS的平台上想要实现不同应用之间的内容分享一般有几种常用方式:

  1. 一种第的英文通过AirDrop实现不同设备的应用之间文档和数据的分享;
  2. 第二种是给每个应用程序定义一个URL方案,通过访问指定了URL Scheme的一个URL,实现直接访问一个APP;
  3. 第三种是通过UIDocumentInteractionController或者是UIActivityViewController这两个个iOS SDK中封装好的类在App之间发送数据,分享数据和操作数据;
  4. 第四种是通过App Extension,在iOS 8的SDK中提供的扩展新特性实现跨应用的数据操作和分享;
  5. 还有一种集成第三方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中给我们提供的UIDocumentInteractionControllerUIActivityViewControllerQuick Look 框架。此外,在iOS 8中,苹果还给开发者提供了App Extension,一种更高大上的方式在App之间的实现分享内容。关于UIDocumentInteractionControllerUIActivityViewControllerQuick 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"
    字符串类型,包含OwnerDefaultAlternateNone四个可选值,指定对于某种类型的优先权级别,而Launcher Service会根据这个优先级别来排列显示的应用程序的顺序。优先级别从高到低依次是OwnerAlternateDefaultNone表示不接受这种类型。

了解这些基本属性,我们就需要在注册App可用类型时,指定这些属性,根据每个项目的需求不同,属性值也不同。具体注册请参照我的GitHub上的项目:SeraZheng --- ZSUTITest。下图示例作为一个参照:

在信息中添加文档类型

而当我们添加完所有属性后,开始运行我们的程序,然后再回到我们的信息界面,看到就会Document types这个列表已经发生了变化,这就证明我们成功的注册好了应用程序可用的类型。

注册成功,运行程序显示的结果

打开第三方应用

我们在上面的步骤中注册好了我们的应用程序可以识别的类型,现在我们可以打开一个使用UIDocumentInteractionController或者是Quick Look框架来展示内容的第三方App,这里以iPhone上的QQ程序为例。

我们在上面的注册步骤中,的注册LSItemContentTypes仅所有游戏了public.image这个UTI。所以我们先从QQ程序应用的我的文件中,打开不同类型的文件进行对比,可以大家看下图产品我的文件列表中所有游戏俩种类型的文件,一种的英文.jpg扩展名的图片文件,的英文一种.pdf扩展名的文档文件。

我的文件列表

当我打开一个图片文件进行预览时,点击其他应用打开,就可以在应用程序列表中看到我们的应用程序图标。简单介绍一下这个页面,第一行是苹果在iOS的7给之后我们提供的使用AirDropiPhoneiPadiPod Touch设备之通过间iCloud共享内容的一种方式。第二行是通过文档类型关联技术识别的应用程序的列表。行第三的英文通过文档关联技术识别的Action的列表,Action表示对文档可进行的操作,如复制,打印等。

打开图片,显示ZSUTITestDemo App图标

而如果我打开PDF文件的话,就看不到我们的应用程序图标。

打开PDF文件,看不到ZSUTITestDemo App图标

程序回调

当我们通过上面步骤,成功地显示了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的应用程序实现之间的内容分享的更多相关文章

  1. Android 应用程序之间内容分享详解(一)

    一个Andoird应用程序的重要的地方是他们有相互沟通和整合的能力,一个应用程序可以和另一个应用程序交互,接下来我们来看看Android应用之间的内容分享 当你构建Intent的时候,必须要指定Int ...

  2. Android 应用程序之间内容分享详解(二)

    转载请注明出处:http://blog.csdn.net/xiaanming/article/details/9428613 Android 应用程序之间内容分享详解(一) 之前给大家分享了你开发的应 ...

  3. iOS开发人员程序许可协议

    请细致阅读以下的许可协议条款和条件之前下载或使用苹果软件.   这些条款和条件构成你和苹果之间的法律协议.   iOS开发人员程序许可协议   目的 你想使用苹果软件(例如以下定义)来开发一个或多个应 ...

  4. fir.im Weekly - iOS/Android 应用程序架构解析

    假如问你一个iOS or Android app的架构,你会从哪些方面来说呢? 本期 fir.im Weekly 收集了关于  iOS/Android 开发资源,也加入了一些关于 Web 前端方面的分 ...

  5. iOS-马上着手开发iOS应用应用程序-第二部分构建应用程序

    第二部分构建应用程序 1,应用程序开发过程 2,设计用户界面 3,定义交互 4,教程:串联图 1,应用程序开发过程 定义概念 设计用户界面 定义交互 实现行为整合数据 对象是应用程序的基石 类是对象的 ...

  6. iOS开发拓展篇—应用之间的跳转和数据传递

    iOS开发拓展篇—应用之间的跳转和数据传 说明:本文介绍app如何打开另一个app,并且传递数据. 一.简单说明 新建两个应用,分别为应用A和应用B. 实现要求:在appA的页面中点击对应的按钮,能够 ...

  7. 如何:在 DHTML 代码和客户端应用程序代码之间实现双向通信

    https://msdn.microsoft.com/zh-cn/library/a0746166 可以使用 WebBrowser 控件向 Windows 窗体客户端应用程序添加现有的动态 HTML ...

  8. Android学习--跨程序共享数据之内容提供其探究

    什么是内容提供器? 跨程序共享数据之内容提供器,这是个什么功能?看到这个名称的时候最能给我们提供信息的应该是“跨程序”这个词了,是的重点就是这个词,这个内容提供器的作用主要是用于在不同的引用程序之间实 ...

  9. 高大上的微信小程序中渲染html内容—技术分享

    大部分Web应用的富文本内容都是以HTML字符串的形式存储的,通过HTML文档去展示HTML内容自然没有问题.但是,在微信小程序(下文简称为「小程序」)中,应当如何渲染这部分内容呢? 解决方案 wxP ...

随机推荐

  1. RN踩坑

    使用夜神 使用夜神作为模拟器,这个模拟器启动就会监听62001端口. 开发工具与模拟器的通信都是通过adb.夜神模拟器的安装目录/bin下有一个adb.exe,android sdk tools下也有 ...

  2. perl学习之HERE文档

    Perl的here文档机制是从UNIX shell中的here文档机制派生而来的. 和在shell中一样,Perl中的here文档也是面向行的引用表单,要求提供<<运算符,其后跟随一个初始 ...

  3. C盘清理小技巧

    步骤/方法 1 1  关闭休眠功能,在开始菜单的运行里输入powercfg -h off 指令,关闭休眠,此文件实际大小和物理内存是一样的,大约可以为C盘释放1-3G的空间. 2 2  设置虚拟内存: ...

  4. loj2145 「SHOI2017」分手是祝愿

    记 \(f_i\) 是从要做 \(i\) 步好操作变成要做 \(i-1\) 步好操作的期望操作次数. 显然 \(f_i=i/n \times 1 + (1-i/n) \times (1 + f_{i+ ...

  5. Java web 服务启动时Xss溢出异常处理笔记

    本文来自网易云社区 作者:王飞 错误日志 错误日志要仔细看,第一行不一定就是关键点,这个错误出现的时候,比较靠后,其中关键行就是下面这句. Caused by: java.lang.IllegalSt ...

  6. jquery插件编写【转载】

    如今做web开发,jquery 几乎是必不可少的,就连vs神器在2010版本开始将Jquery 及ui 内置web项目里了.至于使用jquery好处这里就不再赘述了,用过的都知道.今天我们来讨论下jq ...

  7. 大数据学习——sql练习

    1. 现有如下的建表语句和数据: 建表语句 create table student(Sno int,Sname string,Sex string,Sage int,Sdept string)row ...

  8. 第四章 vim 可视模式

    第四章  vim 可视模式 vim的可视模式允许我们选中一块文本区域并进行操作 3种不同的可视模式  分为 操作字符文本      行文本 块文本 .命令用来重复执行可视模式中的命令   只有在操作面 ...

  9. Centos7 安装配置优化mysql(mariadb分支)

    1.说明 由于在centos7的yum仓库中没有mysql,centos7用mariadb替代了mysql. mariadb是mysql源代码的一个分支, mysql被ORACLE闭源,而mariad ...

  10. 【Kubernetes】Deployment控制器模型

    在Kubernetes中,Deployment是最基本的控制器对象 apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deploym ...