Extension的类型
Extension有多种类型,每一种类型都绑定到一个称为“扩展点(Extension point)”的系统区域:
“今日(Today,又称为Widget)”:可以快速获取更新或者在通知中心的今日视图中执行一项快速任务。
共享:发布到一个共享网站或者与其它应用程序共享内容。
动作:在另一个应用程序的上下文中操作或查看内容。
照片编辑(仅限于iOS):在照片应用程序中编辑照片或视频。
查找器(仅限于iOS):在查找器中直接显示文件同步的状态信息。
文档提供程序(仅限于iOS):提供对文件库的访问和管理。
自定义键盘(仅限于iOS):用自定义键盘替代iOS系统键盘,并用于所有的应用程序中。
由于每个扩展点都有与之相关的使用策略和专门的API,开发人员必须为他们想要提供的那种功能选择恰当的扩展点。例如,在默认情况下,键盘Extension“不能访问网络,而且不能与其包含应用程序共享同一容器”。通过对Extension进行恰当的配置,这样的限制可以移除,但开发人员仍然需要遵守苹果应用商店审查指南和iOS开发者计划许可协议中的具体的网络键盘指南。
沙箱和安全
众所周知,每个iOS应用程序都有自己的沙箱。通过Mac苹果应用商店分发的OS X应用程序也有类似的要求,不过许多OS X应用程序是在Mac苹果应用商店之外分发的,并不需要遵守这一沙箱要求。
沙箱是苹果iOS安全策略的基石之一。沙箱是为了限制应用程序对文件、首选项、网络资源、硬件等的访问,具体来讲,其目的是为了限制受损的应用程序可能对系统造成的损害。
考虑到并不是所有可以用在应用程序中的API都可以用在Extension中,所以与通常的应用程序相比,App Extension运行在有更多限制的沙箱中。不能在Extension中使用的API标记为不可用宏,如NS_EXTENSIONS_UNAVAILABLE,它会在链接时导致失败。
此外,对于Extension与其它应用程序之间的通信,苹果有几项强制规定:
调用Extension的应用程序即主应用程序不能启动Extension;只有系统可以启动Extension。
当Extension启动后,主应用程序就和它直接通信。
主应用程序永远不和包含应用程序直接通信。
Extension不是一个应用程序,但它由系统生成,并有它自己单独的进程。
为了在包含应用程序和它的Extension之间共享数据,包含应用程序及其Extension都必须是应用程序组的一部分。对于应用程序组的其中两个成员,部分数据可以在两者沙箱之外的第三个容器中共享。
正如Ars Technica的Andrew Cunningham总结的那样,这些规则的最终结果主要是一个应用程序不能进入另一个应用程序的沙箱。这与Android相反,在Android上,内容提供程序和解析程序仍然可以一起工作来为应用程序提供对其它应用程序中数据的访问。
Extension的生命周期
正如苹果文档中的描述,Extension是通过“包含应用程序(containing app)”提供的专门的二进制文件。包含应用程序只负责提供Extension,后者是独立运行的。尽管如此,一个iOS包含应用程序实际上还需要提供Extension之外的某些功能。OS X没有这样的要求,其上的包含应用程序不需要提供任何额外的功能。
文档提到,Extension的生命周期与它的包含应用程序完全没有关系,它由4个阶段组成:
用户选择一个App Extension
系统启动它
App Extension运行
系统终止App Extension
如果两个应用程序需要同样的Extension做相同的工作,那么这会发生在两个独立的Extension进程中。
这一方法的主要动机是,通过生命周期短暂的Extension减少内存使用和能量消耗,并防止一个Extension的错误影响到使用了相同Extension的应用程序。