到目前为止,在移动设备上开发网络应用程序一直比较棘手。
在花费时间开发应用程序后,让用户安装它很困难,尤其是在“安装网络应用程序”的概念定义不明确的情况下。
最流行的方法与在主屏幕上添加快捷方式同义。这在许多方面都存在问题,最重要的是,网络应用程序的管理方式(尤其是在启动、切换和卸载网络应用程序方面)与原生应用程序的管理方式有很大不同。
网络应用程序只“存在”于主屏幕上,而不是应用程序抽屉中。
当它运行时,它在最近的应用程序列表中没有明显标记。
即使你获得了像将你的应用程序顺利安装到用户手机主屏幕这样的用户体验,你经常会发现你的应用程序在降级或过时的网页视图中运行,错过了桌面级浏览器的兼容性或速度优化。
我们开发者想要的,是一个现代的、快速的网络运行时,它可以在我们的设备上保持最新状态。
如果我们的用户能够像使用原生应用程序一样启动和管理他们的网络应用程序,那不是很好吗?
介绍 APK Factory
我们一直在努力让网络应用程序在桌面上真正实现。在桌面上,如果你安装了一个网络应用程序,Firefox 会将该应用程序重新打包成桌面应用程序,这样它就能完美地与你系统的其他部分集成,如 跨平台开放式网络应用程序进展报告 中更详细地概述的那样。
这意味着在 Windows 的开始菜单中,或在 Mac OS X 的启动控制屏幕中。
从 Firefox 29 开始,这将适用于 Android。
这意味着,作为一名网络开发者,你可以在 Android 上依靠一个现代的、最新的网络运行时来运行你的网络应用程序。更棒的是,该网络运行时由一个普通的 Android 应用程序提供,这意味着它将保持现代和最新,你终于可以告别 Android 浏览器了。
一个名为 ShotClock 的网络应用程序。注意屏幕右上角的图标。
用户将体验你的网络应用程序,就像它是一个真正的原生 Android 应用程序一样。
- 应用程序出现在应用程序抽屉中,最近的应用程序列表中,有它自己的名称和图标。
- 应用程序可以像原生 Android 应用程序一样安装和卸载。
- 应用程序可以像原生 Android 应用程序一样更新。
在应用程序抽屉中。
在最近的应用程序列表中:所有这些应用程序都是网络应用程序。
安装时附带某些权限。
最棒的是,我们做这些改变不需要开发者做什么。作为开发者,你可以编写很棒的网络应用程序,而不必担心将网络应用程序交付给用户时需要不同的打包方式。
因此,如果你已经在为 Firefox OS 创建一流的应用程序,那么你已经为 Android 创建了 一流的应用程序。
技术细节
在 Firefox 上,你可以使用 window.navigator.mozApps.install(manifestUrl)
方法调用来安装应用程序。任何网站都可以使用此 API,因此任何网站都可以成为应用程序商店。
manifestUrl
是一个 manifest.json
文档的 URL,它描述了应用程序,而不会实际加载应用程序。
- 应用程序的名称和描述,翻译成多种语言。
- 应用程序的图标,各种尺寸,适用于不同的像素密度。
- 应用程序运行所需的权限。
- 应用程序想要注册的 WebActivities。
- 仅针对打包应用程序,这提供了指向包含应用程序代码和资源的 zip 文件的 URL。
在 Firefox for Android 上,我们通过将 URL 发送到 Mozilla 管理的服务来实现此方法,该服务专门为应用程序构建 Android APK。
Factory 创建的 APK 使用 Android 出色的资源框架,以便向用户显示正确的图标和翻译,尊重用户的区域设置或手机屏幕。
网络应用程序权限被渲染为 Android 权限,因此用户将拥有完全原生的安装应用程序体验。
对于打包应用程序,APK 还包含打包 zip 文件的副本,因此下载应用程序后无需额外网络连接。
对于托管应用程序,应用程序第一次启动时,会下载其应用程序缓存中列出的资源,以便后续启动可以尽可能快地进行,无需网络连接。
如果你想检测应用程序是在网络应用程序中运行还是在网页中运行,检查 getSelf()
方法调用将有所帮助。
if (window.navigator.mozApps) {
// We're on a platform that supports the apps API.
window.navigator.mozApps.getSelf().onsuccess = function() {
if (this.result) {
// We're running in an installed web app.
} else {
// We're running in an webpage.
// Perhaps we should offer an install button.
}
};
}
保持应用程序最新
对于托管应用程序,你可以像往常一样更新你的应用程序:只需更改你服务器上的应用程序,你的用户下次运行应用程序时就会获得这些更改。你可以随意更改,你的用户每次启动应用程序并连接到你的服务器时都会获得最新版本的应用程序。
对于需要更改应用程序清单的任何内容,你的用户会收到更新的 APK 发送给他们,以更新他们现有的安装。
例如,如果你想更改应用程序的图标,甚至名称,更改应用程序的清单会导致 APK Factory 服务重新生成应用程序的 APK,并通知你的用户有新的版本可供安装。
对于打包应用程序,相同的机制适用:更改应用程序的包 zip 文件,然后更新应用程序清单文件中的版本号,APK Factory 会获取这些更改并通知你的用户有更新的应用程序可用。你的用户会收到通知,告知他们有新的 APK 可供安装。就这么简单。
就是这些吗?
这是一个令人兴奋的项目。它几乎没有网络开发者参与,也没有额外的 API 供开发者使用:但是,它应该代表着 Android 上网络应用程序可用性的进步。
现在我们已经采取了为网络应用程序生成 APK 的措施,这为我们提供了一个平台,可以进一步模糊网络应用程序和应用程序之间的界线。亲自体验并帮助我们改进功能:从 Google Play 商店获取 Firefox Beta,从 Firefox Marketplace 安装应用程序,并告诉我们你的想法!
关于 James Hugman
James 是一位软件工程师,自 2009 年以来一直在从事移动操作系统的工作,并且一生都在与小型低功耗计算机打交道。在 Mozilla,他从事 Web Runtime 团队的工作,大部分时间都花在说服两个调皮的孩子“Gecko”和“Android”友好相处。
关于 Robert Nyman [名誉编辑]
Mozilla Hacks 的技术布道者和编辑。发表有关 HTML5、JavaScript 和开放式网络的演讲和博客。Robert 是 HTML5 和开放式网络的坚定支持者,自 1999 年以来一直在从事网络前端开发工作,在瑞典和纽约市。他还定期在 http://robertnyman.com 上发布博客,喜欢旅行和结识新朋友。
51 条评论