为 Firefox OS 构建 Cordova 应用

更新: 除了下面描述的 Cordova 集成之外,Firefox OS 现在也受 Adobe PhoneGap 3.5 版的支持。

如果您已经使用 PhoneGap 构建应用,您可以快速轻松地将现有应用移植到 Firefox OS。我们认为这非常酷,因此我们启动了 为 PhoneGap 应用提供的手机计划,该计划专门针对使用 PhoneGap 和/或 Cordova 构建的引人注目的应用。有一个很棒的 PhoneGap 应用吗?我们很乐意给您发送一台设备!

Cordova 是 Apache 基金会的一个流行的开源项目,它提供了一组设备 API,允许移动应用程序开发人员从 JavaScript 访问本机设备功能,例如相机或加速度计。HTML5 应用程序可以通过框架打包成本机应用程序,并从支持平台(包括 iOS、Android、Blackberry、Windows Phone 以及现在的 Firefox OS)的应用商店中获取。Cordova 也是 Adobe 产品 PhoneGap 中的基础软件。

在过去几个月里,Mozilla 一直与 Cordova 团队合作,将 Firefox OS 集成到 Cordova 框架中,使在 Firefox OS 平台上发布 Cordova 应用成为可能。虽然这是一个正在进行的项目,但现在 Cordova 的 3.4 版 中已经提供了重要的功能。在本篇文章中,我们将介绍如何使用这些新功能。

在 Cordova 中创建和构建 Firefox OS 应用

Cordova 网站 说明了如何安装软件。请注意,安装过程需要 Node.js,并且可以从命令行执行。

$ sudo npm install -g cordova

安装 Cordova 后,可以使用 Cordova create 命令构建应用程序。(命令的参数在上面链接的 Cordova 文档中描述。)

$ cordova create hello com.example.hello HelloWorld

这将创建一个名为 hello 的目录,该目录包含项目以及 hello/www 目录中的一个基本 Web 应用。为了生成 Firefox OS 应用,需要添加适当的平台。

$ cd hello
$ cordova platform add firefoxos

对于其他一些支持的平台,您通常会在这一阶段运行 build 命令来生成平台的输出。由于 Firefox OS 是一个基于 HTML5 的操作系统,因此不需要编译步骤来处理和生成应用。唯一需要的步骤是准备语句来打包应用。

$ cordova prepare firefoxos

这些是从 Cordova 项目生成简单 Firefox OS 应用的基本步骤。项目的输出将位于 hello/platforms/firefoxos/www 目录中。

调试应用

对于大多数其他 Cordova 平台,您将使用 emulate 或 run 命令来测试应用。对于 Firefox OS,您目前需要使用 应用管理器,它是调试和查询 Firefox OS 应用的主要工具。该工具提供了许多功能,包括 JavaScript 调试以及与设备连接时 CSS 的实时编辑。

上面的链接说明了如何安装和启动应用管理器。应用管理器运行后,您可以单击“添加打包的应用”按钮,选择应用的 hello/platforms/firefoxos/www 目录,然后按“打开”按钮。

appmanager

这将把基本应用添加到应用管理器。您会注意到没有图标。这是因为框架集成目前没有提供它们,并且只创建了一个简陋的 manifest.webapp。从这里,您可以更新应用或对其进行调试。请注意,在更新之间,您必须运行 cordova prepare firefoxos 命令,因为此步骤会打包应用并将其放在 platforms/firefoxos/www 目录中。下面是 Cordova HelloWorld 应用正在调试的屏幕截图。

debugger

Firefox OS 清单

Firefox OS 应用本质上是 HTML5 应用程序,由清单文件描述。该清单文件指向应用将使用的图标、起始页等工件。此外,清单还控制应用所需的权限级别和特定于设备的 API。清单文档在 MDN 上提供

在 Cordova 的默认集成中,会创建一个非常通用的清单,并将其放在 platforms/firefoxos/www 目录中。在几乎所有情况下,这都不够用,因为您至少需要为应用提供图标。如果应用不包含至少一个 128×128 像素的图标,应用管理器会报错。这不会阻止您测试应用,但这是将应用上传到 Firefox 市场必不可少的步骤。可以使用简单的文本编辑器创建清单,也可以在应用管理器中修改清单。下面是一个示例 manifest.webapp

{
  "name": "My App",
  "description": "My elevator pitch goes here",
  "launch_path": "/",
  "icons": {
    "128": "/img/icon-128.png"
  },
  "developer": {
    "name": "Your name or organization",
    "url": "http://your-homepage-here.org"
  },
  "default_locale": "en"
}

确保清单已创建或复制到 project/www 文件夹中。后续的 cordova prepare 命令将用您的应用程序特定的清单替换自动生成的清单。

启动代码

创建 Cordova 应用时,生成的启动代码包括 index.html、css/index.css、img/logo.png 和 js/index.js 文件。index.js 中的代码在 index.hml 中以这种方式启动


initialize 函数实际上设置了 onDeviceReady 事件的事件触发器,它表示 Cordova 框架已加载并准备就绪。生成的代码对于 Firefox OS 足够用,除非您想要实现一个特权应用。特权应用是需要使用更敏感的 API 的市场签名应用,例如,Contacts API。有关详细信息,请参阅 打包应用文档。对于特权应用,由于存在内联脚本标签,因此像这样的代码违反了 CSP 限制。为了解决这个问题,请删除内联脚本,并在 js/index.js 文件中使用 window.onload 事件启动应用。

示例应用

为了测试和调试 Cordova/Firefox OS 集成,我们开发了一个示例应用。此应用程序在 GitHub 上可用。它说明了如何使用特定于设备的插件。以下部分中的图像和代码片段取自示例应用。如果您想查看代码并使用它,首先创建一个 Cordova 项目,并将代码检入 project/www 目录。然后,您可以运行 cordova prepare firefoxos 来打包应用。按照本篇文章前面介绍的步骤运行和调试应用。

app

设备 API

Cordova 使用插件架构来实现设备 API,例如加速度计、地理位置或联系人。这些 API 与 Firefox OS Web APIWeb 活动 非常相似,并在 Cordova 网站 上有文档。以下是为 Firefox OS 实现的当前插件以及有关如何在应用中包含它们的简要说明。您始终可以通过查看 Apache 网站上的 Jira 来查看 Firefox OS 平台插件开发的当前状态

通知 API

通知 API 用于提醒用户您的应用,并在两个插件中实现:org.apache.cordova.dialogs 和 org.apache.cordova.vibration。目前,我们已经实现了 alert、confirm、prompt 和 vibrate 功能。要使用此功能,请使用以下命令将插件添加到您的项目中

$ cordova plugin add org.apache.cordova.dialogs
$ cordova plugin add org.apache.cordova.vibration

要使 Firefox OS 中的弹出框获得正确的样式,您需要将 notification.css 文件添加到您的项目中。添加 dialogs 插件后,转到 project/plugins/org.apache.cordova.dialogs/www/firefoxos 目录,并将 notification.css 文件复制到 project/www/css 文件夹中。在 index.html 的 head 元素中链接 CSS 文件。


现在,您可以使用通知函数。

function onPrompt(results) {
    alert("You selected button number " +
          results.buttonIndex +
          " and entered " + results.input1);
}
navigator.notification.vibrate(500);
navigator.notification.prompt(
      'Enter Name', // message
       onPrompt, // callback to invoke
       'Prompt Test', // title
        ['Ok', 'Exit'], // buttonLabels
         'Doe, Jane' // defaultText
);

prompt

指南针 API

指南针 API 使用 org.apache.cordova.device-orientation 插件实现。此插件实现了 compass getCurrentHeading 和 watchHeading 函数。要使用它,只需运行插件添加命令

$ cordova plugin add org.apache.cordova.device-orientation

添加插件后,您可以使用 get 或 watch heading 函数来获取指南针信息。

function onSuccess(heading) {
    var element = document.getElementById('heading');
    myHeading = (heading.magneticHeading).toFixed(2);
    console.log("My Heading = " + myHeading);
}
function onError(compassError) {
    alert('Compass error: ' + compassError.code);
}
var options = {
    frequency: 500
};
watchID = navigator.compass.watchHeading(onSuccess, onError, options);

compass

加速度计 API

加速度计使用 org.apache.cordova.device-motion 插件访问,使开发人员能够访问 x、y 和 z 方向的加速度数据。此插件实现了 getCurrentAcceleration 和 watchAcceleration 函数。

要使用这些函数,请通过执行以下命令将 device-motion 插件添加到您的项目中。

$ cordova plugin add org.apache.cordova.device-motion

然后,您可以使用类似于以下代码的代码来监控加速度值

var options = {
    frequency: 100
};
watchIDAccel = navigator.accelerometer.watchAcceleration(onSuccess, onError, options);
function onSuccess(acceleration) {
  var acX = acceleration.x.toFixed(1) * -1;
  var acY = acceleration.y.toFixed(1);
  var acZ = acceleration.z.toFixed(1);
  var vals = document.getElementById('accvals');
  var accelstr = "Accel X: " + acX + "
" + "Accel Y: " + acY + "
" + "Accel Z: " + acZ; vals.innerHTML = accelstr; } function onError() { alert('Could not Retrieve Accelerometer Data!'); }

您还可以监控设备方向事件并检索 alpha、beta 和 gamma 旋转值,如下所示

function deviceOrientationEvent(eventData) {
    //skew left and right
    var alpha = Math.round(eventData.alpha);
    //front to back - neg back postive front
    var beta = Math.round(eventData.beta);
    //roll left positive roll right neg
    var gamma = Math.round(eventData.gamma);
    console.log("beta = " + beta + " gamma = " + gamma);
}
window.addEventListener('deviceorientation', deviceOrientationEvent);

相机 API

相机 API 用于从图库或设备相机检索图像。此 API 在 org.apache.cordova.camera 插件中实现。要使用此功能,请将插件添加到您的项目中。

$ cordova plugin add org.apache.cordova.camera

在 Firefox OS 中,此插件的 getPicture 函数将触发一个 Web 活动,允许用户选择图像的检索位置。

可以使用类似于以下代码的代码来执行 getPicture 函数

navigator.camera.getPicture(function (src) {
    var img = document.createElement('img');
    img.id = 'slide';
    img.src = src;
  }, function () {}, {
      destinationType: 1
});

联系人 API

联系人 API 用于创建或检索设备上的联系人,并在 org.apache.cordova.contacts 插件中实现。要访问此功能,请运行以下命令

$ cordova plugin add org.apache.cordova.contacts

访问联系人的应用必须在清单文件中设置适当的权限,才能获得特权。请参阅本篇文章前面介绍的“Firefox OS 清单”部分,了解如何为您的应用程序创建自定义清单。对于此 API,您需要将以下权限添加到清单中

"permissions": {
  "contacts": {
    "access": "readwrite",
    "description": "creates contacts"
  }
}

请参阅 清单文档,了解具体的访问权限。此外,您需要在清单中将应用类型更改为特权。

"type": "privileged",

更改清单后,您可以使用类似于以下代码的代码添加联系人。

// create a new contact object
var contact = navigator.contacts.create();
var name = new ContactName();
name.givenName = fname;
name.familyName = lname;
contact.name = name;
contact.save(onSuccess, onError);

contact

地理位置 API

地理位置 API 用于从设备的 GPS 设备检索位置、时间和速度值,并在 org.apache.cordova.geolocation 设备插件中实现。

$ cordova plugin add org.apache.cordova.geolocation

您可以在 Firefox OS 上使用此 API 检索设备的纬度、经度和时间戳,但这需要在清单文件中添加权限。请参阅本篇文章前面介绍的“Firefox OS 清单”部分,了解如何为您的应用程序创建自定义清单。

"permissions": {
    "geolocation": {
      "description": "Marking out user location"
    }
}

添加此权限会导致应用程序提示用户授予检索 GPS 数据的权限。您可以使用 getCurrentPosition 一次读取 GPS,或使用 watchPosition 获得基于间隔的更新。

var onSuccess = function (position) {
    console.log('Latitude: ' + position.coords.latitude + 'n' +
    'Longitude: ' + position.coords.longitude + 'n');
};
function onError(error) {
    console.log('Error getting GPS Data');
}
navigator.geolocation.getCurrentPosition(onSuccess, onError);

geolocation

加入我们

这篇文章介绍了新的 Firefox OS Cordova 集成的基本内容。我们将继续向项目添加更多设备 API,敬请关注。如果您有兴趣参与集成工作或需要特定设备插件的支持,请通过 Stack Overflow 上的 firefox-os 标签 或在 Mozilla IRC 上的 #cordova 频道联系我们。

同时,如果您有一个使用上述 API 的 Cordova 应用程序,请尝试为 Firefox OS 生成该应用程序并将其提交到 Firefox 市场!

关于 Piotr Zalewa

Piotr Zalewa 是 Mozilla 开发者生态系统团队的高级网页开发人员。从事网页应用开发工作。他是 JSFiddle 的创建者。

更多 Piotr Zalewa 的文章…


13 条评论

  1. Hugo

    我更希望 Mozilla 鼓励纯净的真正的 HTML5 应用程序开发,并确保我们能够通过 FFOS、Firefox for Android、Firefox 桌面上的 Web 应用程序,而不是通过 Cordova 将它们交付到所有平台。

    通过支持 Cordova,就好像是在告诉开发者:“HTML5 还不成熟,无法进行跨平台开发,请改用 Cordova API”。

    这并不是 FFOS 和 Mozilla 要传达给世界的真实信息。

    所有操作系统的通用平台必须是 HTML5 Web 应用程序,而不是 Cordova。

    2014 年 2 月 20 日 下午 12:43

    1. James Long

      您的评论的要点是正确的,HTML 将成为编写应用程序的平台,这些应用程序将与原生应用程序进行激烈的竞争。但我们必须在战略上实现这一目标。说实话,这将是一个漫长而艰巨的过程,但回报巨大(我确实相信我们能够实现这一目标)。

      该战略的一部分是尽可能让每个人都编写 HTML5 应用程序,即使是 Cordova 应用程序。Firefox OS(以及更普遍地说,浏览器供应商之间各种举措)开创的 Web API 非常新,而且还不够成熟。目前,使用 Cordova API 可以编写跨平台 HTML5 应用程序,这 *非常棒*。一旦人们沉迷于这种棒极了的东西,我们就可以着手将 API 更改为标准的 Web API,这样人们就可以只编写普通的 JS,并在任何地方都能正常工作。

      编写 HTML5 应用程序的人越多越好,这只是实现这一目标的过程的一部分。

      2014 年 2 月 20 日 下午 1:12

      1. debbie

        我真的想沉浸在你的热情中,展望光明的未来,但你试过将针对 Android 原生浏览器或甚至 iOS7 上的 MobileSafari 的 HTML5 部署了吗?我觉得现实情况是,移动浏览器支持的现状会很快让跨平台的乌托邦消失。我认为在原生二进制世界中情况并没有太大不同,到处都有设备怪癖,但即使作为一名 HTML5 开发人员,我也不确定在目前情况下,为了纯粹的理论上的跨兼容性而放弃控制和性能是否是一个合理的权衡。我们拭目以待吧!这可能会随着更成熟的开发工具而变得更容易…

        2014 年 2 月 20 日 下午 5:21

      2. Luke

        为什么 XUL 不是编写 Firefox OS 应用程序的平台?这是 Firefox 与 Chrome 或其他没有系统让你使用 flex、hbox 标签、vbox 标签等标签(而不是必须弄清楚所有 display、float、margin、padding 等标签)的优势。

        2014 年 2 月 20 日 下午 7:39

        1. Robert Nyman [编辑]

          因为我们希望开发人员使用使用开放技术的标准方法来构建事物,即 HTML5。XUL 只在 Firefox 网页浏览器中受支持,这意味着将是另一种要开发的平台/技术。

          有了 Firefox OS,我们希望开发人员能够重用他们现有的 HTML5 技能,同时通过一系列 JavaScript API 获得更多访问权限。

          2014 年 2 月 21 日 上午 5:48

      3. Hugo

        @James Long:我并没有看到这些情况,但你说的确实对,这可以作为一个过渡阶段,同时让 HTML5 变得更加成熟。感谢您的回复。

        @Debbie:你说得对,Android 原生 WebView 对 Web 应用程序来说简直是糟糕透顶(我在 IOS 上没有尝试过)。但这并不能说明如果有一个好的 WebView,HTML5 是否能够制作出优秀的应用程序。
        我不知道你使用的是什么设备,但我尝试了 Nexus 7 上的 Android 版 Chrome 和 Firefox 中的许多网站/Web 应用程序,说实话,很多时候我无法区分原生应用程序,除非屏幕顶部有 Chrome 的 URL 栏。你绝对可以在最新的设备上使用 HTML 制作出超级流畅的应用程序,但你需要一个好的 HTML 引擎。
        (顺便说一下,Google 在 KitKat 中宣布了一个基于 chrom(ium) 的新 WebView,所以应该会更好…)

        2014 年 2 月 21 日 下午 3:15

    2. Arul Selvan

      当我们为 Firefox OS 编写 HTML5 应用程序时,Cordova 让我们可以为其他任何东西编写 HTML5 应用程序。结果 HTML5 越来越流行。

      2014 年 2 月 21 日 上午 9:46

  2. towfique anam rine

    好文章,
    想把它翻译成我的母语孟加拉语 :)

    2014 年 2 月 20 日 下午 12:55

  3. sintaxi

    Hugo,虽然我同意你的观点,但事实是,设备 API 还没有像在 FXOS 中那样在网络上广泛可用。Cordova 在其他浏览器赶上来之前发挥作用。Cordova 在设备访问方面所做的事情,就像 JQuery 在 DOM 方面所做的事情一样。网络应该拥有设备 API。

    2014 年 2 月 20 日 下午 3:26

  4. ozten

    做得太好了!

    这是一个不错的选择,在这种情况下,用户无法或不想使用 Firefox,并且项目拥有足够的资源逐步升级为 Cordova 应用程序。

    当然,如果用户使用的是 Firefox,那么使用 Open Web App API,我们越来越接近在桌面、Android 和 FxOS 上本地安装应用程序。

    2014 年 2 月 20 日 下午 3:56

  5. Sébastien Blanc

    真棒!

    我们已经开始更新我们的插件来支持 Firefox :)

    能够将 JSON 代码片段放在 plugin.xml 中,然后将其合并到清单文件中(就像你可以对 XML 配置文件那样)会很不错,但我认为这是要添加到 Cordova 核心中的东西。

    2014 年 2 月 21 日 上午 3:22

  6. dac san

    您的评论的要点是正确的,HTML 将成为编写应用程序的平台,这些应用程序将与原生应用程序进行激烈的竞争。但我们必须在战略上实现这一目标。说实话,这将是一个漫长而艰巨的过程,但回报巨大(我确实相信我们能够实现这一目标)。

    该战略的一部分是尽可能让每个人都编写 HTML5 应用程序,即使是 Cordova 应用程序。Firefox OS(以及更普遍地说,浏览器供应商之间各种举措)开创的 Web API 非常新,而且还不够成熟。目前,使用 Cordova API 可以编写跨平台 HTML5 应用程序,这 *非常棒*。一旦人们沉迷于这种棒极了的东西,我们就可以着手将 API 更改为标准的 Web API,这样人们就可以只编写普通的 JS,并在任何地方都能正常工作。

    编写 HTML5 应用程序的人越多越好,这只是实现这一目标的过程的一部分。

    2014 年 2 月 23 日 下午 5:26

  7. grigio

    我喜欢 Cordova Firefox OS 集成,这是一个将 Cordova 应用程序部署到非 WebKit 环境的巨大机会。

    2014 年 2 月 24 日 上午 7:51

本文的评论已关闭。