关于Opera Mini和App Store

[更新: 关于附加iPhone SDK准则3.3.2的附录]

我已经做了一些挖掘这个“Opera Mini被App Store拒绝”的故事,而且事实似乎与报道和假设的情况大相径庭。

这一切都始于本段来自Saul Hansell的NY Times Bits博客关于Opera首席执行官Jon Stephenson von Tetzchner:

先生von Tetzchner said that Opera’s engineers have developed a version of Opera Mini that can run on an Apple iPhone, but Apple won’t let the company release it because it competes with Apple’s own Safari browser.

但是请注意,这不是von Tetzchner的引用 - 他被Hansell解释了。

我的理解是基于知情人士的信息,因为他们没有得到雇主的授权,他们不希望被识别,因为Opera开发了一个iPhone版的Opera Mini,但他们甚至没有提交这对Apple来说,更不用说它被拒绝了。

我之前没有意识到的一件事是Opera有两种不同的移动浏览器:Opera MiniOpera MobileOpera Mobile几乎是一种传统的常规Web浏览器这是Opera,但是已经针对移动平台进行了细分和优化但是,Opera Mini是另一回事Opera Mini不是直接与网站交互的网络浏览器,而是通过Opera运行的代理服务器。

在一个坚果中,它的工作方式如下:您在Opera Mini中请求一个URLOpera Mini向Opera运行的代理服务器发出请求Opera的代理服务器连接到托管请求的URL的Web服务器,并将页面呈现为图像然后将该图像(以专有格式称为OBML - Opera Binary Markup Language)传输到Opera Mini客户端Opera Mini在屏幕上显示渲染图像这可能听起来很复杂,但显然结果非常有效 - 传输速度更快,因为只有OBML(压缩二进制格式)通过电话网络传输到移动设备,而在慢速移动处理器上渲染速度要快得多。

Hansell表示苹果拒绝了Opera Mini,而不是Opera Mobile所以,我的推测它被App Store拒绝运行自己的JavaScript解释器是错误的 - Opera Mini实际上只是一个知道如何显示OBML的瘦客户端它甚至不呈现HTML,更不用说包含完整的JavaScript解释器(克里斯米尔斯去年在Opera开发者博客上写了一篇文章关于Opera Mini和JavaScript。)OBML更像是PDF而不是HTML所以从理论上讲,我认为可以开发出符合iPhone SDK协议的Opera Mini版本。

但是,Opera的版本具有为iPhone开发的其他方面存在问题Opera Mini客户端软件的跨平台代码库是用Java编写的假设它应该在任何带有Java ME虚拟机的手机上运行当然,iPhone不支持任何形式的Java。

在4月的Opera Labs网站上,Chris Mills描述了他们如何将Opera Mini移植到AndroidAndroid uses the Java programming language for development, but doesn’t use a standard Java virtual machine; instead, for Android, Google has developed他们自己的虚拟机叫做Dalvik这是Mills对Opera如何为Android移植它的描述:

We decided to use the existing Opera Mini code base (even the binary package) instead of creating a separate port, to save on resourcesWe created a special wrapper that translates Java ME (mostly MIDP) API calls into Android API calls使用的工具是MicroEmulator— this is an open source (LGPL) implementation of Java ME that runs on top of Java SEThe lead Opera Mini Android developer is also the lead developer of MicroEmulator, so it was an inspired choice! The Android platform is similar to Java SE, with the exception of several libraries normally included in Java SE (like AWT/Swing — these are excluded because they would likely be too heavy to fit into the embedded environment.) It is therefore fairly simple to port MicroEmulator to run inside Android environmentThe only major task was to replace the AWT/Swing graphics backend of MicroEmulator with Android specific APIs.

简而言之,他们已经编写了自己的桥梁来在Android上运行Java ME字节码。

如果他们为iPhone所做的事情也是如此 - 他们已经在iPhone上运行了Java ME运行时 - 它显然超出了iPhone SDK协议的范围有关准则是规则3.3.2,内容如下:

3.3.2 — An Application may not itself install or launch other executable code by any means, including without limitation through the use of a plug-in architecture, calling other frameworks, other APIs or otherwiseNo interpreted code may be downloaded and used in an Application except for code that is interpreted and run by Apple’s Published APIs and built-in interpreter(s).

我有点明智的预感是,Vet Tetzchner在接受Hansell采访时提到的Opera Mini的iPhone版仅在越狱的iPhone上运行如果它只使用越狱iPhone上的API,它可能不会因为它现在只使用官方API的标准iPhone。

Opera需要提供一个可以提交给App Store的Opera Mini版本,将整个客户端软件移植到iPhone正式支持的C和Objective-C API上很可能即使在那时,苹果也会以反竞争的理由拒绝App Store,但与本周的猜测相反,这种情况并未发生。

我希望它不会,因为Opera Mini听起来像一个非常酷的应用程序。

附录

一些读者对我对规则3.3.2的解释提出异议,认为它一般不禁止口译员该子句中的关键词是“已下载” - 您无法发送包含解释器的iPhone应用程序,该解释器允许您下载其他可执行内容,绕过App Store例如,一个通用的“Flash Player”应用程序,它允许您直接下载到用Flash编写的iPhone游戏和实用程序 - 这就是3.3.2禁止的事情。

但是,根据本指南,应该允许包含仅执行应用程序包中自包含的脚本或字节码的解释器的应用程序显然,今天使用这些技术通过App Store发布的应用程序。

甚至还有像Innnaworks这样的商业开发项目AlcheMo,它将J2ME Java应用程序转换为本机iPhone应用程序,以及Unity3D,一个基于Mono的游戏开发框架,使用JavaScript,C#和Python,但它输出原生的ARM汇编代码,因此也是本机iPhone应用程序。

因此,iPhone SDK协议中可能没有任何内容禁止Opera Mini出现在App Store中但是,仅仅因为应用程序没有违反规则并不意味着Apple会接受它。