使用 HTML5 和 Mozilla Web Runtime 的桌面应用程序

使用 HTML5 的桌面应用程序

HTML 最棒的一点是它永远不会“完成”。HTML 陪伴着我们,比我们认为习以为常的大多数开发技术还要久远(.NET、ASP、Java、PHP 等)。

HTML 的最新版本 HTML5 已经成为软件和信息行业中热议的话题。当我们说“HTML5”时,我们实际上是指“HTML/CSS/JavaScript”的组合。

在 Mozilla,我们通常将其统称为“Web 运行时”或简称 WebRT。Mozilla 的应用程序计划,包括 Web 运行时,在此有文档记录

怀疑者喜欢说“HTML5 还没有准备好”。本周,我看到一篇报道称,HTML5 在未来 10 年内都不会“准备好”。对此,我反问:“准备好做什么?”当然,还有很多 API 正在开发中,但对于许多场景来说,HTML5 已经可以使用了。对于许多其他场景,它现在已经可以开发了,并且在不久的将来就可以投入使用。

最近,Mozilla Apps Native Install Experience 被引入 Firefox Nightly 频道。(在此阅读有关 Firefox 发布频道的更多信息。

此功能使我们能够在 Windows 或 Mac 上以原生启动体验安装 HTML5 应用程序(Linux 和 Android 即将推出)。

一个好方法是简单地将您的应用程序列入 Mozilla Marketplace。Marketplace 很快就会向公众开放,开发者现在可以在 Marketplace 生态系统门户 上提交他们的应用程序。除了要提交的应用程序之外,您还需要一组 BrowserID 凭据。

面向 Mozilla Web Runtime 的 HTML5 应用程序包含一个清单文件。

清单只是一个声明应用程序某些数据的 JSON 文件。

这是来自示例应用程序的清单文件。您可以在此处了解有关 Mozilla 应用程序清单的更多信息。

    {
      "version": "1.0",
      "name": "KO Round Timer",
      "description": "A Workout Timer for Fighting Athletes!",
      "icons": {
        "128": "/images/icon-128.png"
      },
      "developer": {
        "name": "Joe Stagner",
        "url": "http://koscience.com"
      },
      "installs_allowed_from": [
        "http://timer.koscience.com",
	"https://marketplace.mozilla.org"
      ],
      "default_locale": "en"
    }

JSON 不需要用 CRLF 格式化。上面显示的 JSON 只是为了简化显示而进行了格式化。

请注意上面的第 12 行,它指定了应用程序可以从哪里安装。

Mozilla Web Runtime 包含一个 apps 对象(winbow.navigator.mozApps)。mozApps 对象(目前在 Windows 和 Mac 上的 Firefox Nightly 中实现)具有一个方法来安装应用程序。我们将在稍后查看使用该 API 的代码。

如果您希望您的应用程序从 Mozilla Marketplace 安装,则不需要编写任何安装代码。当您在 Marketplace 中列出您的应用程序时,Marketplace 会为您的应用程序创建一个列表页面,该页面包含一个安装按钮。

Mozilla Marketplace App Listing Page

当点击安装按钮时调用的生成代码会告诉运行时安装应用程序。运行时会获取应用程序的清单,并会检查应用程序是否允许从请求安装的域安装,以及其他检查。

如上所述,您可以在清单中看到第 14 行指定应用程序可以从“https://marketplace.mozilla.org”安装。

但是,您可能希望允许用户从其他域安装您的应用程序,例如您自己的网站。

您可以在我们上面列出的示例清单中看到第 13 行,其中“http://timer.koscience.com”也被指定为有效的“安装来源”位置。我可以指定任意数量的域,以授权其从这些域安装应用程序,并且支持通配符。

但是,如果我们要从自己的网站安装应用程序,则需要自己实现安装逻辑。

我们可以创建一个与 Mozilla Marketplace 上的应用程序列表页面类似的页面,或者使应用程序“自动安装”,这意味着我们可以自己在应用程序中实现安装逻辑。

例如,请看下面的 Workout Timer 应用程序。

K.O. Timer Screen Shot

请注意计时器底部的导航按钮行。

最右边的一个按钮是“安装我”。

安装按钮应该只在应用程序在支持 mozApps 运行时的环境中运行时显示。由于此应用程序(K.O. Timer)是一个 HTML5 应用程序,因此它可以在任何兼容 HTML5 的浏览器中运行,但只有在支持 mozApps 的浏览器/运行时中运行时才能“安装”。

我们也不希望安装按钮在应用程序已安装的情况下显示。

这是一个用于测试运行时支持和安装状态的 JavaScript 方法。

如果存在运行时支持并且应用程序未安装,则会显示一个安装按钮。

在某些情况下,您可能选择不显示可选的安装按钮,而是在应用程序未安装的情况下直接启动安装程序。

(此代码使用 jQuery)

function TestAppInstalled() {
    if ((!navigator.mozApps) || (!navigator.mozApps.getSelf)) {
        /*-----------------------------------------------------------+
        || Test to see if the Mozilla Apps Web Runtime is supported
        || HACK: Testing for either mozApps OR mozApps.getSelf is a
        || hack.
        || This is needed because some pre-beta versions of Firefox
        || have the object present but nit fully implemented.
        || TODO: Update when Firefox Desktop & Mobile are complete.
        ------------------------------------------------------------*/
        return;
    }

    var MyAppSelf = navigator.mozApps.getSelf();
    MyAppSelf.onsuccess = function() {
        if (! this.result) {
            // Application is not "installed"
            $('#InstallButton').show();
        }
        else {
             // This "MozApp" is already installed.
        }
        return;
    }
    MyAppSelf.onerror = function() {
        alert('Error checking installation status: ' +
               this.error.message);
        return;
    }
}

当用户点击安装按钮时,会调用以下代码。

$('#InstallButton').click(function() {
    var installation = navigator.mozApps.install(
                "http://timer.koscience.com/kotimer.webapp");
    installation.onsuccess = function() {
        $('#InstallButton').hide();
        alert("K.O. Timer has been successfully installed.....");
    }
    installation.onerror = function() {
        alert("APP: The installation FAILED : " + this.error.name);
    }
});

因此,当用户在支持 mozApps 的浏览器(目前是 Firefox Nightly)中导航到 K.O. Timer 应用程序(timer.koscience.com)并点击“安装我”按钮时,mozApps 运行时会启动安装程序。

KOTimer at Install Click

KOTimer at Install Click Closeup

在用户点击上面图片中显示的对话框中的“安装”按钮后,会调用安装程序,安装完成后,用户会获得原生启动体验。

在 Windows 上,您会获得一个桌面快捷方式。

Native Shortcut for HTML5 App

以及一个开始菜单项。

HTML5 app in the Windows Start Menu

当然,应用程序现在也位于用户的 Mozilla MyApps 集合中。

Mozilla MyApps Collection

重要的是要记住,尽管这些启动器已在用户的系统上创建,但应用程序本身仍然存在于云中。开发人员可以选择通过其他 HTML5 功能(如 AppCacheLocalStorage IndexedDB)为其应用程序添加“离线”功能。

能够为 HTML5 应用程序提供原生启动器,再加上 Mozilla Marketplace 公开发布后(在不久的将来)将可用的庞大 HTML5 应用程序分发机制,为构建基于标准的应用程序的开发者创造了巨大的机遇。

关于 Joe Stagner

Joe Stagner 的更多文章…


23 条评论

  1. Adam Messinger

    当我第一次阅读有关 WebRT 的信息时,我以为它会为“HTML5”应用程序提供一个无边框的环境。这是否正在开发中?我之所以这样问,是因为我当前的一个项目将受益于类似于信息亭的体验。我可以使用全屏 API,但是一个好奇或恶作剧的用户可能会退出全屏状态并使用浏览器的地址栏访问新 URL。这可能会导致同一台机器上的下一个用户感到困惑。

    我还想知道 Mozilla 是否考虑过将 Gecko 作为可安装运行时提供,用于本地或云端 HTML5 应用程序,这些应用程序可以通过任何应用程序商店进行分发,并安装在移动或桌面平台上。可以使用 PhoneGap 构建此类跨平台移动应用程序,但是仍然存在一些非凡的平台兼容性难题需要解决。如果能为一个平台开发,并在多个环境中运行可安装应用程序,那就太好了。

    2012 年 5 月 14 日 下午 1:56

    1. Jean-Yves Perrier

      Mozilla 市场上的 HTML5 应用程序在测试阶段将可安装在任何地方,无论是移动设备还是桌面。Gecko 不会成为可安装的运行时,应用程序只会启动 Firefox,Firefox 将具有特殊模式。

      2012 年 5 月 14 日 下午 3:22

    2. Kevin Dangoor

      @Adam:我想指出您消息的第一部分,从 Firefox 安装的应用程序确实会在您启动它们时运行无边框运行时。因此,您无法从其他应用程序商店安装 Gecko 运行时(其中一些应用程序商店甚至不支持安装此类运行时),但在安装后,您确实可以获得这种“独立的无边框应用程序”体验。

      2012 年 5 月 14 日 下午 7:15

      1. Adam Messinger

        一些应用程序商店的问题是运行时环境是否为单独的安装?如果“编译”步骤将运行时捆绑到可安装的应用程序中,这是否仍然是一个问题?感谢您的澄清 - 我不太熟悉各种应用程序商店的策略。

        2012 年 5 月 16 日 上午 9:42

  2. Jon Galloway

    Joe,很有意思的帖子!(还有,你好!)

    这与 XUL 有什么关系?

    2012 年 5 月 14 日 下午 3:11

  3. Adam Messinger

    感谢 Kevin 和 Jean-Yves 的后续回复。我期待着见证 WebRT 的发展,并将来在某一时刻使用它。

    2012 年 5 月 14 日 下午 8:14

  4. antistress

    非常详细,谢谢。

    您写道
    “此功能使我们能够在 Windows 或 Mac 上以原生启动体验安装 HTML5 应用程序(Linux 和 Android 即将推出)。"
    “在 Windows 上,您会获得一个桌面快捷方式,以及一个开始菜单项。”

    应用程序是否会使用桌面菜单规范(http://standards.freedesktop.org/menu-spec/menu-spec-latest.html)使应用程序能够位于 Linux 菜单应用程序中(该应用程序分为几类:图形/实用程序/游戏/办公软件等)?

    2012 年 5 月 15 日 上午 3:33

    1. Joe Stagner

      谢谢。我们希望今年夏天能解决 Linux 的原生安装程序问题,因此细节尚未确定。我们欢迎社区贡献,如果您有兴趣,请告诉我,我可以为您提供合适的联系方式。-Joe

      2012 年 5 月 15 日 上午 7:26

      1. antistress

        感谢您的回答,但我只是一个普通用户,没有特殊的技能:我只知道 Linux(GNOME、KDE、Xfce……)上的菜单是使用该 freedesktop 规范构建的。因此,如果作者没有对其应用程序进行分类(图形/实用程序/游戏/办公软件等),那么很难实现 Linux 集成。
        此外,这种分类将有助于在 Mozilla 网上应用商店中对应用程序进行分类。

        2012 年 5 月 15 日 上午 8:25

  5. pd

    (winbow.navigator.mozApps

    糟糕。

    2012 年 5 月 15 日 08:02

  6. pd

    这很有趣。多年来,Mozilla 似乎在提供一个对 Web 开发人员友好的原生操作系统感知代码库方面几乎患有精神分裂症。我记得有关 xulRunner 的争论,还有 Prism - 现在看起来像是半心半意的 WebRT... 我肯定还有很多我忘记的参考资料。现在看来,态度似乎发生了转变,现在可以将 Firefox 本质上视为一个多平台应用程序开发平台,具有原生操作系统桌面/主屏幕感知能力。

    对我来说,问题是,据我所知,Electrolysis 的优先级已被降低,但 Jean-Yves 你提到应用程序在“特殊模式”下运行 Firefox,但只有一个运行时。如果用户安装了一个 Firefox 二进制文件作为其主浏览器,但也安装了一个或多个 Web 应用程序,当他们运行浏览器以及 Web 应用程序时,它们会使用同一个 Firefox 二进制可执行文件吗?如果是这样,这与 Electrolysis 应该提供的多进程支持有何不同?实际上,应用程序是否只是将打开一个辅助的(或更多)Firefox 窗口,而没有默认的 Chrome UI?

    我每天使用 Firefox 大约 12 个小时,而且已经使用了很多年,但尽管做了无数小时的开发工作,我还是不时地遇到这种情况,Chrome 被进程关闭,但进程却顽固地拒绝退出。然后我不小心再次单击 Firefox 快捷方式,但我没有得到一个正常的浏览器窗口,而是得到了一个没有会话的辅助窗口。我可能没有解释得很清楚,但我只是想知道这种行为是否可以清理掉,从而避免 Web 应用程序用户可能的困惑。

    2012 年 5 月 15 日 08:26

    1. Kevin Dangoor

      Electrolysis 的优先级已被降低。我不知道所有的技术细节,但我现在在我的机器(Mac OS)上运行着一个已安装的应用程序。它在一个单独的进程中运行,我认为它有一个单独的配置文件。这意味着应用程序将被隔离

      1. 与其他浏览(因此有助于确保在面对两端的不良行为时具有响应能力)

      2. 从有缺陷的附加组件

      3. 从配置文件中积累的垃圾。

      使用新的干净配置文件可以修复在旧的垃圾配置文件中看到的某些奇怪行为。 “重置 Firefox”功能 [1] 可能有助于解决您报告的这种奇怪行为。只是确保目前只在测试版中尝试它。

      [1]: http://blog.mozilla.org/verdi/166/the-new-reset-firefox-feature-is-like-magic/

      2012 年 5 月 16 日 06:07

      1. alexleduc

        很高兴看到有人正在考虑“垃圾配置文件”问题。这让我不禁想起了 Windows 注册表,以及垃圾注册表如何减慢机器速度(尤其是在 Windows 9x 时代)。

        对于我们这些技术人员来说,当我们觉得 FF 开始出现错误/速度变慢时,从头开始导出书签并创建一个新的配置文件很容易,但普通用户只会得出结论:“FF 现在太臃肿了,我要换用其他东西”。

        2012 年 6 月 5 日 06:08

  7. Iraê

    我一直在使用 Firefox Aurora。我打开了控制台并验证了 API 是否可用。我克隆了 openwebapps 存储库并在我的本地服务器上托管了 mozball 示例,结果发现它使用了旧的 API 样式。此外,我订阅了 Mozilla 市场,但需要有人批准我才能加入。

    我是不是漏掉了什么,或者说现在仅仅运行一个 hello world 应用程序也存在着很高的入门门槛?我目前正在使用 Web 技术构建桌面应用程序,并且正在选择 Apace Cordova(以前称为 Phonegap)、Chromium 嵌入式框架、Mozilla Prism,并且我对研究 MozillaWebRT 感兴趣,但是信息非常稀少,而且很难测试。

    是否有已经在某个地方或在某个存储库中托管的示例,我可以查看?或者说现在只能复制、粘贴和修改吗?=)

    2012 年 5 月 15 日 10:18

  8. Iraê

    顺便说一下,我的批准配置文件是:https://mozillians.org/en-US/irae

    2012 年 5 月 15 日 10:22

  9. julio

    嗨,这是一篇很棒的文章,但是这个桌面应用程序的功能将在 Windows 8 上运行,我指的是 Windows 8 和 Metro 风格的应用程序。

    谢谢

    2012 年 5 月 16 日 17:21

  10. Joe Stagner

    嗨,Irae,

    现在你需要 Firefox Nightly。

    Joe

    2012 年 6 月 4 日 06:38

  11. Ken Walker

    我写了一篇简短的教程,介绍如何使用 Orion 测试您的 Web 应用程序。在云中为云编写!

    http://planetorion.org/news/2012/06/mozilla-webapp-development-using-orion/

    2012 年 7 月 9 日 11:46

  12. LY

    您好,您的文章对于我研究 Mozilla 应用程序发布和安装非常有用。

    我想确认一件事,即 B2G 是否与您文章中的上述内容具有相同的发布和安装流程?

    我认为 Firefox(PC)应用程序和 B2G 应用程序的流程是一样的。

    谢谢!

    2012 年 7 月 26 日 23:17

  13. Joe Stagner

    嗨,LY,

    是的,Firefox OS(B2G)的流程将相同。

    -Joe

    2012 年 7 月 27 日 06:32

  14. Tankred Hase

    嗨,

    安装的应用程序是否会使用开发人员的私钥进行安全签名(例如在 Chrome 打包应用程序中)?谢谢

    Tankred

    2012 年 7 月 28 日 23:22

  15. Hayk Saakian

    这项技术的现状如何?

    我读过关于 Firefox 打包应用程序的文章,但它们目前只适用于 Firefox OS。

    我们什么时候可以期待正式的 PC 版本?

    2013 年 1 月 19 日 22:19

    1. Robert Nyman

      它正在开发中,您可以尝试在 Firefox OS 模拟器 或 Firefox 的 Nightly 版本中使用它。

      2013 年 1 月 22 日 01:57

本文的评论已关闭。