关于 Opera Mini 和 App Store

【原载 Daring Fireball,原文在此。】

我对“ Opera Mini 被苹果 App Store 拒绝”事件(译者注:请见 iPhone 版 Opera Mini 网络浏览器被苹果拒绝 )进行了一些挖掘,发现真实的情况与报道和推测的有很大不同。

故事的起源是《纽约时报》的Bits 博客关于 Opera 公司 CEO Jon Stephenson von Tetzchner 的一篇报道,摘要如下:

“von Tetzchner 先生表示,Opera 的工程师已经开发了一个可以在苹果的 iPhone 上运行的 Opera Mini 版本。但苹果公司不允许 Opera 公司(在 App Store )发布这一应用,因为这与苹果自家的 Safari 浏览器相竞争。”

但值得注意的是,这并不是引援 von Tetzchner 的原话 —— Bits 的作者 Hansell 曲解了原话的意思。

基于我的消息源(他要求不公开身份,因为他的雇主没有授权他透露消息)给我的消息,我的理解是:Opera 的确开发了一个 iPhone 版的 Opera Mini ,但他们甚至还没有递交给苹果,更谈不上被苹果拒绝。

在此之前,我还没有意识到的一点是 Opera 公司拥有两种不同的移动浏览器:Opera MiniOpera Mobile 。Opera Mobile 是一种传统的常规浏览器,即 Opera 浏览器针对移动平台的优化版本。而 Opera Mini 则是另一回事,它不同于传统的浏览器。传统的浏览器直接与网站进行交互,而 Opera Mini 使用的是 Opera 公司的代理服务器。

外表之下,它的工作原理是这样的:当你在 Opera Mini 浏览器中输入 URL 地址, Opera Mini 即向 Opera 公司的代理服务器发出请求,Opera 的代理服务器再访问你所请求的网页,并将该网页转换为一张图片,最后再将该图片(以 Opera 私有的格式 OBML —— Opera Binary Markup Language )传送至你所在的 Opera Mini 客户端。Opera Mini 在你的移动设备屏幕上呈现出图片。这听起来很复杂,但却非常有效 —— 它传输起来更快,因为只有 OBML (一种压缩的二进位格式)图像由手机网络传送给移动设备,比缓慢的移动处理器来翻译(这里指将原数据转换为页面定过程)快多了。

Hansell 所说的是 Opera Mini 而不是 Opera Mobile 被苹果拒绝。所以我推测 “ Opera Mini 不能进入 App Store 是由于它的 JavaScript 解释器” 的说法是错误的 —— 事实上 Opera Mini 只是一个能够显示 OBML 格式图像的小客户端,它连 HTML 都不能显示,更不用说包含完整的 JavaScript 解释器。(Chris Mills 去年曾在 Opera 开发者博客上写过一篇与 Opera Mini 和 JavaScript 相关的文章 )OBML 格式更像是 PDF 而不是 HTML 。所以理论上,我认为 Opera Mini 符合 iPhone SDK 开发协议,是可以被开发的。

但是 Opera 公司为 iPhone 开发的版本在其他的地方出了问题。Opera Mini 客户端的跨平台代码基础是用 Java 语言写成的。Opera 假设它可以在任何手机上使用 Java ME 虚拟机运行,但 iPhone 却不支持任何形式的 Java 语言。

今年 4 月份在 Opera 实验室的官方网页,Chris Mills 描述他们如何让 Opera Mini 在 Android 上运行。Android 使用 Java 编程语言开发,但它使用的并不是标准的 Java 虚拟机。Google 专门为 Android 开发了一种名叫 Dalvik 的自有虚拟机(它可以避免升阳公司 Java 语言授权的相关问题)。下面是 Chris Mills 描述如何将  Opera Mini 移植到 Android 上来。

为了节省资源,我们决定使用现有 Opera Mini 的代码基础,而不重新编写一个新的。我们制作了一个特别的包装器(wrapper)能够将 Java ME(主要是 MIDP ) 应用编程接口调用(calls)转换为 Android 应用编程接口调用,使用的工具是 MicroEmulator —— 一个开源(LGPL)的在 Java SE 上运行的 Java ME 执行。Android 版 Opera Mini 的主要开发者也是  MicroEmulator 的主要开发者,所以这是一个很好的选择。Android 平台与 Java SE 平台很类似,除了 Java SE 包含的几个程序库例外,比如AWT/Swing 由于太大而不适合植入环境而没有移植。所以将MicroEmulator 移植到 Android 环境事实上很容易,主要的任务就是用 Android 的专有编程接口替代 MicroEmulator 的AWT/Swing 的图形后端。

简而言之,他们自己打通了让 Java ME 到 Android 上运行的桥梁。

如果他们对 iPhone 采用的是同样的方式 ——  在 iPhone 平台上运行  Java ME ,明显违反了 iPhone SDK 的开发协议第 3.3.2 条。              

基于我所知道的消息,我感觉 von Tetzchner 在和 Hansell 的采访中提到的 iPhone 版 Opera Mini 只能在越狱的 iPhone 上安装。如果它采用的应用编程接口只支持在越狱的 iPhone 上运行,它甚至都不能在当前使用官方应用程序接口的标准 iPhone 上运行(又何谈递交给 App Store ?)。

Opera 公司的 iPhone 版 Opera Mini 如果要想递交给 App Store ,其客户端软件必须完全采用苹果官方支持的 C 和 Objective-C  应用程序接口。即使Opera 真的做到了这些,苹果仍有可能以“反竞争(Safari 已经提供该功能)”为理由拒绝其进入 App Store —— 但至少与之前的推测的不同,这一切到目前为止都还没有发生呢。

我也希望不会发生,因为 Opera Mini 听起来是个不错的应用。