深入 App Extensions for iOS 8

  • Sergio De Simone
  • 马德奎

2014 年 7 月 22 日

话题:AppleiOS语言 & 开发架构

近日,苹果宣布了App Extensions for iOS 8,它允许开发人员将功能和内容扩展到单个应用程序之外。

其中,App Extensions 允许修正的两个主要 iOS 限制是:由 Open In 系统创建的应用程序之间不必要的数据复制无法替代苹果的键盘。这种状况与 Android 平台允许用户借助Widget自定义键盘形成鲜明的对比。

然而,其中有一个最可能的误解需要澄清一下,就是 iOS 8 App Extensions 不同于Android IndentsArs Technica 网站撰稿人 Andrew Cunningham这样写道。根据 Google 的描述:

Intent 提供了一种机制,用于不同应用程序代码之间的后期运行时绑定。它主要用来启动 Activities,因此可以将它看作是 Activities 之间的粘合剂。从本质上讲,它是一个无源数据结构,存放要执行动作的抽象描述。

虽然 Extension 在很多情况下与 Intent 没有什么不同,但在 iOS 8 中,App Extension 系统的整体设计使得它与 Intent 有很大的不同。

Extension的生命周期

正如苹果文档中的描述,Extension 是通过“包含应用程序(containing app)”提供的专门的二进制文件。包含应用程序只负责提供 Extension,后者是独立运行的。尽管如此,一个 iOS 包含应用程序实际上还需要提供 Extension 之外的某些功能。OS X 没有这样的要求,其上的包含应用程序不需要提供任何额外的功能。

文档提到,Extension 的生命周期与它的包含应用程序完全没有关系,它由 4 个阶段组成:

  1. 用户选择一个 App Extension
  2. 系统启动它
  3. App Extension 运行
  4. 系统终止 App Extension

如果两个应用程序需要同样的 Extension 做相同的工作,那么这会发生在两个独立的 Extension 进程中。

这一方法的主要动机是,通过生命周期短暂的 Extension 减少内存使用和能量消耗,并防止一个 Extension 的错误影响到使用了相同 Extension 的应用程序。

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 与其它应用程序之间的通信,苹果有几项强制规定:

  1. 调用 Extension 的应用程序即主应用程序不能启动 Extension;只有系统可以启动 Extension。
  2. 当 Extension 启动后,主应用程序就和它直接通信。
  3. 主应用程序永远不和包含应用程序直接通信。
  4. Extension 不是一个应用程序,但它由系统生成,并有它自己单独的进程。
  5. 为了在包含应用程序和它的 Extension 之间共享数据,包含应用程序及其 Extension 都必须是应用程序组的一部分。对于应用程序组的其中两个成员,部分数据可以在两者沙箱之外的第三个容器中共享。

正如 Ars Technica 的 Andrew Cunningham 总结的那样,这些规则的最终结果主要是一个应用程序不能进入另一个应用程序的沙箱。这与 Android 相反,在 Android 上,内容提供程序解析程序仍然可以一起工作来为应用程序提供对其它应用程序中数据的访问。

反应

App Extension 已经在 iOS 开发人员中间引发了极大的兴趣。Cunningham 说,“Extension 将会对新操作系统产生最大最显著的影响”。

MacStories 的 Federico Viticci 收集了若干开发人员对苹果公告的反应,他说“Extension 对于 iOS 应用程序生态系统的影响很难量化,但是……考虑到开发人员对苹果公告的反应,在今年秋天,我们将看到许多又新又酷的东西”。

另一方面,安全专家提出警告,更强大的功能往往带来更大的风险。安全公司Symantec 写到:“在 iOS 8 发布之前,我们无法看到攻击是上升还是下降,因此,我们无法知道这些功能效果如何”,同时他们也承认“根据目前获得的信息,少数安全功能应该会增强 iOS 设备的防护等级”。

查看英文原文:App Extensions for iOS 8 in Depth

AppleiOS语言 & 开发架构