iOS8扩展插件开发配置
一.iOS8扩展插件概述
WWDC14除了发布了OS X v10.10和switf外,iOS8.0也开始变得更加开放了。说到开放,当然要数应用扩展(App Extension)了。顾名思义,应用扩展允许开发者扩展应用的自定义功能和内容,能够让用户在使用其他应用程序时使用该项功能,从而实现各个应用程序间的功能和资源共享。可以将扩展理解为一个轻量级(nimble and lightweight)的分身。
以下为常见的三类插件:
Target Type
Extension point identifier
Scenarios
Today Extension
com.apple.widget-extension
系统通知栏下拉显示
Share Extension
com.apple.share-services
Host App(照片、Safari、邮件、语音等)分享菜单第一行
Action Extension(UI)
com.apple.ui-services
Host App(照片、Safari、邮件、语音等)分享菜单第二行
下图为iPhone/iOS8中的【照片】分享:
例如【微信】最多支持分享9张(NSExtensionActivationSupportsImageWithMaxCount=9)照片给好友或到朋友圈。
二.插件工作机制
1.插件只能与Host App通过上下文直接通信
2.插件可通过共享资源区与Containing App间接通信
3.Host App-Extension-Containing App工作流程
- Host App通过点击系统分享菜单中的插件图标调起扩展程序——Share/ActionExtension (*.appex)。
- iOS系统(Host App)通过扩展上下文(NSExtensionContext)向Share/ActionExtension传递欲分享的数据。
- Share/Action Extension提取数据并序列化到以AppGroup ID标识的共享资源区NSUserDefaults/AppGroup Container(containerURLForSecurityApplicationGroupIdentifier)中。
- Share/Action Extension通过URL Scheme呼起ContainingApp,同时插件通过上下文向iOS系统(HostApp)发出request completion通知,以便返回到Host App(iOS系统会dismiss插件UIViewController)。
- Containing App通过App Group ID从NSUserDefaults/containerURL中读取分享过来的数据,并对分享数据进行后续处理。
由此可见,扩展插件将Host App与Containing App勾搭起来,而App Group Container则架起了数据交互的鹊桥。
这里需要注意的是,在iOS 8.0中,只有Today Extension才支持直接调用NSExtensionContext的openURL:completionHandler:打开URL链接;Share/Action Extension要想实现URL Scheme,只能创建一个Sink UIWebVew对URL进行loadRequest实现曲线救国(所谓“Sink”是指隐而不显,例如frame=CGRectZero)。
4.插件的UI形态
插件在UI上以UIViewController模式存在,被parentViewController(Host App)以模态窗口形式弹出(present as modal viewController)。
插件工程在Info.plist的NSExtension中通过NSExtensionMainStoryboard指定UI视图入口。当然,如果不想使用storyboard,也可以使用NSExtensionPrincipalClass指定自定义UIViewController子类名(也可以封装到UINavigationController)。
注意:
- 新建Extension Target后(Deployment Target≥8.0),需在Build Settings|Architectures|Valid Architectures中增加arm64!
- 初始安装Containing App时,扩展插件并未使能,需要到【更多】中打开开关。
三.插件的局限性
以下文字节选自《App Extension Programming Guide》,主要列举了插件的局限性,以知其可为不可为。
--------------------------------------------------------------------------------
1.Design a Streamlined UI
- An extension`s UI should be simple, restrained, and focused on facilitating a single task.
- To improve performance and the user`s experience, avoid including extraneous UI that doesn`t support your extension`s main task.
2.Optimize Efficiency and Performance
(1)App extensions should feel nimble and lightweight to users.
- Design your app extension to launch quickly, aiming for well under one second.
- An extension that launches too slowly is terminated by the system.
(2)Memory limits for running app extensions are significantly lower than the memory limits imposed on a foreground app.
- On both platforms, the system may aggressively terminate extensions because users want to return to their main goal in the host app.
- Some extensions may have lower memory limits than others.
(3)Your app extension doesn`t own the main run loop, so it`s crucial that you follow the established rules for good behavior in main runloops.
- For example, if your extension blocks the main runloop, it can create a bad user experience in another extension or app.
(4)Keep in mind that theGPU is a shared resource in the system.
- App extensions do not get top priority for shared resources; for example, a Today widget that runs a graphics-intensive game might give users a bad experience. The system is likely to terminate such an extension because of memory pressure.
- Functionality that makes heavy use of system resources is appropriate for an app, not an app extension.
--------------------------------------------------------------------------------
由此可见,iOS系统对插件要求简洁至上:UI启动要快、内存消耗要少、runloop执行耗时要短。
iOS系统对插件的限制决定了开发的插件必须轻量,发点Twitter/微博分享、小图片文件分享、URL跳转还是可以的;奢望丰富绚丽的UI或者用来传大文件等大动作是不合适的。
当然,如果希望扩展(即使退出)执行长时间任务(比如上传/下载),可以使用NSURLSession来创建一个上传/下载session,并初始化一个后台上传/下载任务。
注意:
Apple也限制了扩展在API使用方面的权限,在扩展中禁用的API原型声明被标上了NS_EXTENSION_UNAVAILABLE宏。例如:
+ (UIApplication*)sharedApplication NS_EXTENSION_UNAVAILABLE_IOS;
对sharedApplication的限制实际上就是不让插件直接获取访问宿主应用(Host App的UIApplication)对象。
四.Share/Action扩展插件支持的媒体类型配置
Info.plist中的NSExtension|NSExtensionAttributes|NSExtensionActivationRule Dictionary可以配置插件支持的媒体类型及数量:
iOS扩展插件支持媒体类型配置键
描述
配置
说明
NSExtensionActivationSupportsAttachmentsWithMaxCount
附件最多限制
20
附件包括下面的File、Image和Movie三大类,单一、混选总量不超过20
NSExtensionActivationSupportsAttachmentsWithMinCount
附件最少限制
上面非零时,default=1
默认至少选择1个附件,【分享】中才显示扩展插件图标
NSExtensionActivationSupportsFileWithMaxCount
文件最多限制
20
文件泛指除Image/Movie之外的附件,例如【邮件】附件、【语音备忘录】等。
单一、混选均不超过20。
NSExtensionActivationSupportsImageWithMaxCount
图片最多限制
20
单一、混选均不超过20
NSExtensionActivationSupportsMovieWithMaxCount
视频最多限制
20
单一、混选均不超过20
NSExtensionActivationSupportsText
文本类型
default=0
默认不支持文本分享,例如【备忘录】
NSExtensionActivationSupportsWebURLWithMaxCount
Web链接最多限制
default=0
默认不支持分享超链接,例如【Safari】
NSExtensionActivationSupportsWebPageWithMaxCount
Web页面最多限制
default=0
默认不支持Web页面分享,例如【Safari】
宿主应用(Host App)提供一个上下文(NSExtensionContext)向扩展(appex)传递数据,包含了待处理的数据(inputItems)。其传递的数据是一组NSExtensionItem对象,其中要分享的图片、视频、URL等附件就保存在NSExtensionItem的attachments数组中。
关于UTIs,参考UniformType Identifiers Reference | System-Declared Uniform Type Identifiers。
媒体类型
文件UTI
图片(public.image)
kUTTypeImage
kUTTypeJPEG
kUTTypePNG
kUTTypeGIF
kUTTypeTIFF
kUTTypeBMP
kUTTypeICO
视频(public.movie)
kUTTypeMovie
kUTTypeQuickTimeMovie
kUTTypeMPEG
kUTTypeMPEG4
kUTTypeAVIMovie
@"public.3gpp"
@"com.real.realmedia"
@"com.microsoft.windows-media-wmv"
@"com.microsoft.advanced-systems-format"
音频(public.audio)
kUTTypeAudio
kUTTypeMP3
kUTTypeMPEG4Audio
kUTTypeWaveformAudio
@"com.microsoft.windows-media-wma"
文档
kUTTypePDF
@"com.microsoft.word.doc"
@"com.microsoft.excel.xls"
kUTTypePresentation
@"com.microsoft.powerpoint.ppt"
@"com.apple.keynote.key"
压缩包
kUTTypeZipArchive
kUTTypeGNUZipArchive
kUTTypeBzip2Archive
@"public.tar-archive"
@"org.gnu.gnu-zip-tar-archive"
五.插件与Containing App的App Group证书配置
Containing App及其Extension是通过以App Group ID标识的共享资源区—App Group Container来实现数据共享的。
Containing App及其Extension的App ID必须是Explicit,且Extension App ID必须以Containing App ID为Prefix/Seed,并且配置到同一App Group下。
App ID配置到Info.plist的BundleIdentifier中;App Group在target的【Xcode Target|Capabilities】中启用,配置到【Xcode Target|Build Settings|Code Signing|Code Signing Entitlements】中的*.entitlements文件的com.apple.security.application-groups
键中。
证书和Provisioning Profile的申请以及Code Signing配置流程同以前普通的App,详情请参考《iOS开发证书要点详解》。
六.Containing App的Build Phases配置(embed app extensions)
Containing App 的【Xcode target|BuildPhases|Target Dependencies】中可以添加或移除插件target。
Containing App 的【Xcode target|BuildPhases|Embed App Extensions】下Destination为Plugins中可以添加或移除插件product(*.appex)。
注意:默认了勾选“Copy only when installing”,表示从AppStore安装(包括升级覆盖)时才拷贝插件。Xcode连接真机调试时,需取消该改项,否则系统【分享】菜单中不会出现插件
iOS8扩展插件开发配置的更多相关文章
- iOS8扩展插件开发配置 [转载]
一.iOS8扩展插件概述 WWDC14除了发布了OS X v10.10和switf外,iOS8.0也开始变得更加开放了.说到开放,当然要数应用扩展(App Extension)了.顾名思义,应用扩展允 ...
- windows下安装MongoDB扩展和配置
windows下安装MongoDB扩展和配置 1.下载mongoDB扩展,根据当前php版本进行下载 地址如下:http://pecl.php.net/package/mongo 我本地php版本是 ...
- HBuilder的扩展插件开发暴露了一个事实:其实不能实现写一次代码实现跨平台App生成
HBuilder的扩展插件开发,原来并不能生成单独的插件jar,而是以源码 - 类的形式进行开发,这其实就要求必须使用离线打包. 事实上,开发顺序应该是:先弄好离线打包框架,然后在AS里进行扩展插件开 ...
- php 安装xdebug扩展和配置phpstorm断点
参考链接:安装xdebug扩展和配置phpstorm断点
- Maven介绍,包括作用、核心概念、用法、常用命令、扩展及配置
由浅入深,主要介绍maven的用途.核心概念(Pom.Repositories.Artifact.Build Lifecycle.Goal).用法(Archetype意义及创建各种项目).maven常 ...
- [转]Maven介绍,包括作用、核心概念、用法、常用命令、扩展及配置
转自:http://www.trinea.cn/android/maven/ 两年半前写的关于Maven的介绍,现在看来都还是不错的,自己转下.写博客的一大好处就是方便自己以后查阅,自己总结的总是最靠 ...
- PHP打开PDO_MySQL扩展的配置方法
PHP中的PDO其实是一个很好用的扩展,在一些PHPCMS系统中,开发者大多都有用到,那么如何开启PDO和PDO_MySQL扩展呢?方法同样很简单: 打开php.ini配置文件,找到extension ...
- CentOS扩展库配置
背景:经常用到第三方的库,通过yum命令查询不到.例如:yum search ilbcWarning: No matches found for: ilbc 不要感叹,CentOS没你想象的支持力度那 ...
- PHP安装Xdebug扩展并配置PHPstorm调试(Centos、Windows)
一.给PHP安装Xdebug扩展 [windows] 废话不多说,直接上代码上方法安装扩展,我这里是在windows下. 首先需要确定的就是对应的PHP版本安装对应的Xdebug扩展文件,提供一个最快 ...
随机推荐
- 【HNOI 2002】 营业额统计
[题目链接] 点击打开链接 [算法] 观察式子 : 最小波动值 = min{|该天营业额 - 之前某天的营业额|} = min{该天营业额 - 该天营业额的前驱,该天营业额的后继 - 该天营业额} 用 ...
- 一梦浮生2012 IOS高级进阶目录
一梦浮生2012 精通iphone的UI开发,能熟练操作复杂表视图,熟练使用图层技术, 可以自定义UI控件,使用类别扩展系统控件功能; 擅长通讯技术,熟悉各种通信协议,精通xml, json, 二进制 ...
- nodejs supvisor模块
在测试nodejs程序的时候,每次都需要在控制台编译,非常的麻烦.supervisor是一款无需重复手动编译,自动后台监听文件变化来自动编译,并且不需要在项目内require,使用非常的方便. 使用方 ...
- CClientDC类 CWindowDC类
CClientDC类 CClientDC类也是CDC类的派生类.它只能在窗口的客户区(即窗口中除了边框.标题栏.菜单栏以及状态栏外的中间部分)中进行绘图,坐标点(0,0)通常指的是客户区的左上角.它的 ...
- 最优灌溉_最小生成树Kruskal
问题描述 雷雷承包了很多片麦田,为了灌溉这些麦田,雷雷在第一个麦田挖了一口很深的水井,所有的麦田都从这口井来引水灌溉. 为了灌溉,雷雷需要建立一些水渠,以连接水井和麦田,雷雷也可以利用部分麦田作为“中 ...
- 由mysql分区想到的分表分库的方案
在分区分库分表前一定要了解分区分库分表的动机. 对实时性要求比较高的场景,使用数据库的分区分表分库. 对实时性要求不高的场景,可以考虑使用索引库(es/solr)或者大数据hadoop平台来解决(如数 ...
- CocoaPods(第三方类库管理工具)
iOS安装CocoaPods详细过程 一.简介 什么是CocoaPods CocoaPods是OS X和iOS下的一个第三类库管理工具,通过CocoaPods工具我们可以为项目添加被称为“Pods” ...
- 3DMAX 合并镜像物体
如果镜像文件是实例,那么就不能用附加选项,所以可以先删除一半,再copy镜像出来,然后点选可编辑网格,在一个物体上选附加,再点选另一半即可
- bzoj 4753: [Jsoi2016]最佳团体【01分数规划+二分+树上背包】
01分数规划,二分答案然后把判别式变成Σp[i]-Σs[i]*mid>=0,然后树上背包判断,设f[i][j]为在i点子树里选j个的最大收益,随便背包一下就好 最丧病的是神卡常--转移的时候要另 ...
- 温习LOGO语言
LOGO是什么? LOGO语言是一种早期的编程语言,也是一种与自然语言非常接近的编程语言,它通过"绘图"的方式来学习编程,对初学者特别是儿童进行寓教于乐的教学方式. LOGO语言创 ...