【iShout】谈谈 iOS 8 和 OS X 10.10 的 Extension
编者注:本文作者为 Mac OS X 上快速启动应用 Manico 的开发者 TualatriX,对 iOS 8 和 OS X 10.10 中的 Extension 机制,以及它的场景进行比较深入的讨论。
上周看完了 WWDC 14 的视频之《Creating Extensions for iOS and OS X》,差不多可以谈谈 Extensions 了。
我个人认为这是 iOS 和 OS X 发展至今非常具有里程碑意义的一处改进,甚至比 UI 上的改变重要的多。我想简单地谈一下为何 Extensions 这么重要。
Extension 是什么?
首先我们得问,Extension 是什么?这里可能会有很多不同的解释。
一个很明显的例子是便是使用了相同术语的 Firefox 和 Chrome 的 Extension,这两大浏览器提供了非常丰富的 Extension 用于游览器本身以及增强 Web 浏览体验。确切地说,这里的 Exension 是一种 Plugin。
还有一个是 Android 的 Intent,Intent 使 App 可以实现相关 Intent,在系统或者一个 App 里,用户可以自由的选择另一个 App 去完成特定的任务。所以,Android 的 Intent 是一种 IPC(应用程序间的通讯)。
这里的分类有点极端,毕竟浏览器有真正的 Plugin,如 Flash 插件;Android 也有提供 Widget,也更接近系统的 Plugin。在这点上,我可以说 iOS/OS X 的 Extension 也是混合了上面提到的一切:既有 Plugin 的部分(如 Today),也有 IPC 的部分(如 Share、Photo Editing)。
于是让我们就 Extension 简单地理解为:增强系统默认功能,能让 App 之间的协同工作成为可能。
没有 Extension 的日子…
没有现在的 Extenion 之前,iOS 和 OS X 都分别有相似的技术去实现系统的增强以及 App 之前的协作。
对 OS X 来说,它是 Services 和 Scripting,这是 OS X 从一开始就具备的一项特性,通过在应用程序开发框架级别支持 Scripting(默认语言是 AppleScript),让 OS X 支持图形脚本化,从而让这个操作系统具备了无限扩展的能力。
得益于 Scripting 作为技术后端,直接影响了 Alfred 这类 Power Tools 在 OS X 上的流行。然而不管 AppleScript 无论多么简单,它依然是一门语言,与命令行脚本在本质上属于同一类事物,从而注定了 Scripting/AppleScript 是作为 Power Users 的一项工具,离普通用户比较远。
然而,Extensions 的支持将改变这一现象,OS X 的扩展能力相比以前得到进一步增强,与此同时,保持了对普通用户的友好。
另外,对于 iOS 来说,在 Extension 之前,iOS 平台实际上早已实现应用程序间的相互通讯。举个最简单的例子,大家可能用过「知乎日报」,也用过「Evernote」,知乎日报就支持把一篇文章保存到 Evernote 里去。当你点了「保存到 Evernote」里后,知乎日报会调用 Evernote,把文章保存好之后,又返回知乎日报。这就是一个完全的 IPC 过程。
Extensions 于 IPC 的不同在于,它是一个系统级而非 App 级的特性。对上面提到的一个例子来说,知乎日报需要明确知道 Evernote,才能把文章保存到它那里去;而通过 Extension,知乎日报不再需要知道 Evernote,也能保存文章了。这个改变是巨大的…
iOS/OS X Extension 的特点:开放,并且安全
对于这项迟来的特性,iOS/OS X 的 Extension 有何特点,Apple 真的允许开发者做各种他们能在其他平台做的事情,而不再限制的非常死吗?
对于这点,我可以说,是的。Apple 不仅开放了足够多的可以开放、供开发者发挥的地方,并且也做到了和用户利益至关重要的一点:保证安全。也就说,在你使用各种 Extensions 操作照片或其他文档的同时,iOS/OS X 会有设计优良的安全机制将 Extension 与对应的文档(或 App 专有的文档)隔离起来,第三方 Extension 只能被访问授权的对象,而对其他与此对象处于同一目录(或 App)下的将无法得到访问。
对于这点安全性上的考虑,Ars Technica 写了一篇很详细的文章《Explaining iOS 8’s extensions: Opening the platform while keeping it secure》来分析,并且与 Android 提供的不是很安全的 Extension 机制作对比,强烈推荐。
关于 iOS 的输入法
iOS 的输入法也算是一个特殊的 Extension,它和其他 Extension 一样,需要有一个标准的 App Container,需要用户明确去启用它才能使用。
对于输入法来说,安全性有着特别的设计,因为不像其他 Extension 是针对文件进行的安全防护,输入法可是掌握着你输入的那些内容。对此,Apple 提供的输入法模板中,默认是没有网络的支持的,但是如果一款输入法确实需要用到网络(如云词库),那么开发者需要启用它,用户也会得到提示。在这之后,就是用户与开发者的信任关系了:我用你的输入法,我相信你你只用我的输入内容改善词库而不会用做其他用途。
此外,iOS 的输入法还有两个硬性规定:
- 输入法必须提供切换到其他输入法的按钮:这点很重要。我可以在一些我觉得特别的地方不使用你的输入法,而能方便地切换到我想要的输入法。
- 如果一个文本框要求为 secure(如密码框),那么系统会强制使用系统默认的输入法来进行输入,而不是第三方输入法。
有这两点很重要,因为用户总能方便地切换到其他输入法,那么第三方输入法就不能霸占这个系统,与此同时,用户不必担心密码类的会被输入法记住。
关于 Safari 的 Action
Safari 和 Chrome 及 Firefox 一样,在这之前也提供了 Extension 的支持。然而,通过 iOS/OS X 新增的这个系统级 Extension,Safari 可以走的更远了。这部分的 Extension,叫 Safari Action。
简单的说,现在你可以通过你的 App 来分发一个扩展,首先你的 App 是一个完整的 App,其次你的 App 还可以提供一个扩展,用于辅助或增强 App 原有的功能。
比如说,1Password,用过 Mac 版(或 Windows 版)的同学都知道,你可以在浏览器里通过扩展来为你的网站填密码,但是这一功能因为此前 iOS 系统的限制而无法做到。但是在 iOS 8 里面,1Password 将完全有能力像桌面版一样,为你的 Safari 自动填写密码、用户信息等等。这个 Safari Action 的支持可以说是非常实用的。iOS 上浏览 Web 的体验将因此得到增强。
一个鲜活的例子
由于 iOS 8 的测试版本刚刚发布两周,现在还没有什么可用的第三方 Extension 可供演示的,那么我来挑一个非常有用的 OS X 的内置 Extension 来演示吧。
可能大家还记得 WWDC 14 上演示的 Mail.app 支持直接编辑邮件附件的一个功能吧。当时我看了这个就觉得 OS X Yosemite 正式发布后,我一定要开始用 Mail.app。后来我了解到,这项功能实际上是独立于 Mail.app 的,没错,它就是 Extension —— Markup(标记)。
比如,我在 TextEditor 里面写文章,我插入了一张图片。
这时我想给这张图片加一行文字标记,而不是回到源文件用其他 App 去编辑它。只需要很简单:把鼠标移到图片上,会冒出一个下拉点击区域,点击它,就会出来:标记。这就是和 Mail.app 一样的功能。
点击它以后,就会有一个漂亮的动画直接在 TextEditor 里面进入编辑状态了,编辑完点完成图片就能立马得到更新。
这就是系统级 Extension 的威力。一个 Extension 就可以使整个系统的 App 得到增强,并且它的使用是那么的无缝,让你觉得这个功能就像是这个 App 的一部分一样。
可以想像,等到 iOS/OS X 上 Extension 多起来的时候,整个系统会像这个例子一样更好的协调工作,App 们各尽其责,生态圈会比现在更好。
题图来自 agilebits