GMTC全球大前端技术大会(北京站)门票9折特惠截至本周五,点击立减¥480 了解详情
写点什么

深入 App Extensions for iOS 8

2014 年 7 月 22 日

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

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

然而,其中有一个最可能的误解需要澄清一下,就是iOS 8 App Extensions 不同于 Android Indents Ars 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

2014 年 7 月 22 日 21:586826
用户头像

发布了 256 篇内容, 共 68.3 次阅读, 收获喜欢 6 次。

关注

评论

发布
暂无评论
发现更多内容

Mac 环境下 RabbitMQ 的安装

AlwaysBeta

Mac RabbitMQ 消息队列

学习总结 - 架构师训练营 - 第七周

走过路过飞过

week 7 作业

a晖

Vue3-组合式API

福豆粑粑

Vue3

架构师训练营第七周总结

Bruce Xiong

Python 实现 RabbitMQ 的六种工作模式(附 Python 代码)

AlwaysBeta

Python RabbitMQ 消息队列

【架构师训练营 - week7 -1】作业

早睡早起

架构师训练营第七章作业

吴吴

redis 基础-数据结构-跳跃表

小技术君

架构师训练营 week7

devfan

第七周作业

Geek_a327d3

关于性能压测

俊俊哥

性能测试

架构训练营第七周感悟

张锐

第7周 性能优化:性能优化是架构师展现自己技术全面性的时刻

陆不得

第七周总结

Geek_a327d3

w7-分布式系统中性能的影响因素

麻辣

架构师训练营 No.7 周总结

连增申

ARTS打卡Week 08

teoking

ios LeetCode

第07周 优化系统性能-01 学习总结

Jaye

架构师训练营 - 作业 7

进击的炮灰

第07周 优化系统性能-01 命题作业

Jaye

操作系统、性能优化

GalaxyCreater

性能优化

架构师培训 -07 总结 性能测试与性能优化

刘敏

架构师训练营 No.7 周作业

连增申

第七周总结

上山砍柴

性能测试并发压力变大,系统如何变化

李朋

第7周

Geek_2b3614

redis系列之——数据类型geospatial:你隔壁有没有老王?

诸葛小猿

redis geospatial

并发测试JAVA

王麒宇

RabbitMQ 的监控(附 Python 监控源码)

AlwaysBeta

Python RabbitMQ 消息队列 消息堆积处理

架构师 0期07周总结

我在终点等你

深入App Extensions for iOS 8-InfoQ