您的位置:首页 > 移动开发 > IOS开发

iOS8 SDK新特性之扩展详解

2015-07-26 00:14 483 查看
(一)扩展介绍      

       扩展(Extension)是iOS8中引入的一个非常重要的新特性。扩展让App之间的数据交互成为可能。用户可以在App中使用其他应用提供的功能,而无需离开当前的应用。

       在iOS8系统之前,每一个App在物理上都是彼此独立的,App之间不能互访彼此的私有数据。

       而在引入扩展之后,其他App可以与扩展进行数据交换。基于安全和性能的考虑,每一个扩展运行在一个单独的进程中,他拥有自己的 bundle,bundle后缀名是.appex.扩展bundle必须包含在一个普通应用的bundle的内部。

       iOS8系统有6个支持的扩展的系统区域,分别是Today,Share,Action,Photo Editing,Storage Provider,Custom Keyboard.支持扩展的系统区域也被称为扩展点。

注意:Finder扩展点只支持OS X,Today,Share,Action这三个扩展点同时支持iOS和OS X,而Photo Editing,Storage Provider,Custom Keyboard这三个扩展点只支持iOS系统。

(1)Today/Widget

对于赛事比分,股票,天气,快递这类需要实时获取的信息,可以在下拉的通知中心的“Today视图”中创建一个Widget实现。Today扩展又称为Widget。

(2) Share

在iOS8之前,用户只有Facebook,Twitter,Flickr,Vimeo,新浪微博,腾讯微博有限的6个分享选项可以选择。如果希望将内容分享到Pinterest,开发者需要一些额外的努力。在iOS8中,开发者可以创建自定义的分享选项。

(3)Action

Action在所有支持的扩展点中扩展性最强的一个。它可以实现转换另一个App上下文中的内容。苹果在WWDC大会上演示了一个Bing翻译动作扩展,它可以将在Safari中选中的文本翻译成不同的语言。

(4)Photo Editing

在iOS8之前,如果你想为你的照片添加一个特殊的滤镜,你需要进入第三方App中,这个过程是相当繁琐的。在IOS8中,你可以直接在Photos中使用第三方App,如Instagram,VSCOcam,Avlary提供的Photo Editing扩展完成对图片的编辑,而无需离开当前的App。

(5)Storage Provider

Storage Provider让跨多个文件存储服务之间的管理变的更简单,类似Dropbox,Google Drive,等存储提供商通过在iOS8中提供一个Storage Provider扩展,App直接可以使用这些扩展检索和存储文件而不再需要创建不必要的拷贝。

(6) Custom Keyboard

苹果公司在2007年率先推出了触摸屏键盘,但一直没多大改进。在这一方面,Android则将键盘权限开放给第三方开发者,所以出现了许多像Swype,SwiftKey等优秀的键盘输入法。在iOS8中,苹果终于将键盘权限开放给第三方开发者,自定义键盘输入法可以让用户在整个系统范围内使用。

      (二)创建扩展与发布扩展

        在创建扩展之前,你需要创建一个用来包含扩展的常规的App项目。这个包含扩展的App被称为containing app.在创建好containing app之后,选择File-->New-->Target菜单,从弹出的对话框中选择一个适当的扩展目标模板。每一个扩展目标模板都包含了与扩展点相关的文件和设置。一个containing app可以包含多个不同类型的扩展。

       每一个扩展目标模板包含一个头文件和实现文件,一个Info.plist文件,以及一个storyboard文件。Info.plist文件包含了对扩展的配置信息,其中对重要的键是  NSExtension.

(1)NSExtensionActivationRule定义了当前的扩展支持的数据类型及数据项个数,例如当前的设置只支持图片格式和视频格式的数据,并且最多不超过10张图片和1个视频。

(2)NSExtenionJavaScriptPreprocessingFile用于配置与脚本交互的JS脚本文件的名字。

(3)NSExtensionMainStoryboard配置扩展的Storyboard文件名。

(4)NSExtensionPointIdentifier用于表示扩展点,每一个扩展点拥有一个唯一的名字。

(5)NSExtensionPrincipalClass配置当扩展启动时,扩展点首先要实例化类。

为了将扩展提交苹果商店你需要提交你的containing app。并且需要注意,除了扩展必须包含功能以外,同时containing app还需要提供一些功能,而针对OS X平台的扩展则无此限制。当用户安装 你的containing app,containing app中包含的扩展也会一同被安装。

        注意64位的架构:一个应用程序在Architectures设置中必须要包含arm64的架构,否则在上传App Store时会被拒绝。创建完一个应用扩展后,你可以在Xcode的“Standard architectures”设置选项中设置arm64架构。如果你的包含扩展的应用程序使用了一些潜入框架,那么你的应用程序也必须要包含arm64架构,否则上传App Store也会被拒绝。关于64位架构开发环境的更多信息,请根据你的target平台参阅64-bit Transition Guide
for Cocoa Touch或者64-Bit Transiton Guide for Cocoa.

        在大多数情况下,你可以通过在System Preferences或Setting中启用应用扩展或者授予权限来测试默认的应用扩展,然后可以通过其他应用来访问它。比如你可以在OS X系统中通过Safari中打开一个页面来测试分享扩展,点击分享按钮,然后选择你要测试的扩展即可。

(三)理解扩展如何运作

       在安装扩展之后,扩展并不会自动运行,用户必须执行特定的操作来启用扩展。如果是Today扩展,用户可以在通知中心的Today视图中编辑启用扩展。如果是自费定义键盘扩展,用户需要在系统设置的通用选项下的键盘选项中启用自定义键盘扩展。而如果是Share扩展,用户只需要点击系统提供的分享按钮,即可在分享列表中找到分享扩展。

      一个扩展并不是一个App,他的生命周期和运行环境不同于普通App。在生命周期方面,扩展的生命周期从用户在另一个App中选择了扩展开始,一直到扩展完成了用户的请求,生命周期结束。在运行环境方面,扩展的限制要比普通的App更为严格,扩展的可用内存上限以及可用的API都比普通App要少。严格限制扩展的内存是因为在同一时间可能会有多个扩展同时运行,如Widget扩展。如果API声明包含NS_EXTENSION_UNAVAILABLE宏,则此API在扩展中将不可用,常见的API如:

+(UIApplication *)sharedApplication NS_EXTENSION_UNAVAILABLE_IOS("Use view controller based solution where appropriate instead.");

      调用扩展的应用称为host app,对于Widget扩展,host app就是Today。host app会在扩展的有效生命周期内定义一个扩展上下文。通过扩展上下文,host app可以和扩展互传数据。注意,扩展只和host app直接通信,扩展与containing app 以及containing app与host app之间不存在通信关系,如果扩展需要打开containing app,则通过自定义URL scheme方式实现,而不是直接向containing app发送消息。三者的关系见下图:




      扩展是一个单独的个体。扩展拥有独立的target,独立的bundle文件,独立的运行进程,独立的地址空间这意味着即使你的containing app不在运行,系统也可以启动扩展。或者你的containing app处于挂起状态,同样不会影响扩展的运行。所以系统可以单独对扩展执行优化。扩展与containing app的关系:




注:本文参考极客学院视频课程《iOS8 SDK 新特性系列课程》,非常感谢。

github主页:https://github.com/chenyufeng1991  。欢迎大家访问!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: