Web 活动简介

最近,各种手机上的应用的一个强大的功能是意图(intents)。您可以注册您的应用来处理某些类型的操作,或者在您的应用中指定您正在寻找哪种支持,以完成您想要做的事情。

这在 Firefox OS 的情况下尤其重要。无论您的 Web 应用最初有多好,真正将其提升到更高水平的是与设备上的其他应用和活动进行交互。

这就是 Web 活动 发挥作用的地方。

它基本上是我们一直在开发的新 Web API 之一,旨在使 Web 作为平台变得更加强大,其理念是提供一个简单的 API 来指定活动的意图,以及声明您的应用能够处理来自其他应用的操作。

顺便说一句,如果您还没有了解 Web 应用,最好的方法可能是阅读 Web 应用入门指南。最简单的形式,Web 应用仅仅是 HTML5、CSS 和 JavaScript,以及添加的 应用清单

Web 活动入门

您可以通过几种方式使用 Web 活动

  • 调用活动并显示可以处理该活动的应用
  • 在清单文件中注册您的 Web 应用的活动支持
  • 动态注册活动支持
  • 在该活动发生时,将处理程序附加到您的应用

调用活动

假设您的应用中有一个按钮,并且您希望能够获取图片 - 无论是来自图库、相机还是 Firefox OS 中任何其他支持该活动的应用。然后,您可以像这样调用 pick 活动

var pick = new MozActivity({
   name: "pick",
   data: {
       type: ["image/png", "image/jpg", "image/jpeg"]
   
}
});

在这个示例中,我们指定名称 pick 和数据为 PNG 或 JPEG 图像。然后,您将看到 Firefox OS 中可用活动的菜单

作为用户,您可以选择要从中选择图片的应用 - 或使用相机拍照 - 并且一旦完成,结果将发布回请求的应用(注意:由处理活动的应用选择是否以及将返回什么内容)。

处理响应

对于大多数 Web API(包括 Web 活动),您将拥有 onsuccessonerror 事件处理程序。在图像/文件的情况下,您将获得一个 Blob 返回。然后,您可以直接在您的应用中直观地表示返回的图像

pick.onsuccess = function () {

    // Create image and set the returned blob as the src
    var img = document.createElement("img");
    img.src = window.URL.createObjectURL(this.result.blob);

    // Present that image in your app
    var imagePresenter = document.querySelector("#image-presenter");
    imagePresenter.appendChild(img);
};

pick.onerror = function () {

    // If an error occurred or the user canceled the activity
    alert("Can't view the image!");
};

注册您的应用以处理某个活动

如上所述,您还可以将您的应用设置为某些活动的处理程序。有两种方法可以做到这一点

通过清单文件 - 声明注册

{
    "name": "My App",
    "description": "Doing stuff",
    "activities": {
       "view": {
            "filters": {
                "type": "url",
                "url": {
                    "required": true,
                    "regexp":"/^https?:/"
                }
            }
        }
    }
}

注册活动处理程序 - 动态注册

var register = navigator.mozRegisterActivityHandler({
    name: "view",
    disposition: "inline",
    filters: {
        type: "image/png"
    }

});



register.onerror = function () {
    console.log("Failed to register activity");

}

然后处理活动

navigator.mozSetMessageHandler("activity", function (a) {

    var img = getImageObject();

    img.src = a.source.url;

    /*
      Call a.postResult() or a.postError() if 

      the activity should return a value

    */
});

可用活动

目前可供选择的活动有:

  • 配置
  • 成本控制/余额
  • 成本控制/数据使用
  • 成本控制/电话
  • 拨号
  • 新建(例如,类型:“websms/sms”、“webcontacts/contact”)
  • 打开
  • 选择(例如,类型:“image/png”)
  • 录制
  • 保存书签
  • 分享
  • 测试
  • 查看

一些示例

拨号

var call = new MozActivity({
    name: "dial",
    data: {
        number: "+46777888999"
    }
});

新建短信

var sms = new MozActivity({
    name: "new",
    data: {
        type: "websms/sms",
        number: "+46777888999"
    }
});

新建联系人

var newContact = new MozActivity({
    name: "new",
    data: {
        type: "webcontacts/contact",
        params: { // Will possibly move to be direct properties under "data"
            giveName: "Robert",
            familyName: "Nyman",
            tel: "+44789",
            email: "robert@mozilla.com",
            address: "Sweden",
            note: "This is a note",
            company: "Mozilla"
        }
    }
});

查看 URL

var openURL = new MozActivity({
    name: "view",
    data: {
        type: "url", // Possibly text/html in future versions
        url: "http://robertnyman.com"
    }
});

保存书签

var savingBookmark = new MozActivity({
    name: "save-bookmark",
    data: {
        type: "url",
        url: "http://robertnyman.com",
        name: "Robert's talk",
        icon: "http://robertnyman.com/favicon.png"
    
}
});

立即试用!

您可以立即尝试一下,方法是 开发一个 Web 应用 并调用 Web 活动。然后,您可以在 Firefox OS 模拟器 中测试它!

正在开发中

Web 活动正在开发中,活动名称、数据类型等可能会发生变化。但是,目前上述大多数内容都可以正常工作(除了 mozRegisterActivityHandlermozSetMessageHandler,它们尚未实现)。

我希望您能与我一起对 Web 活动提供的所有可能性感到兴奋,并且可能想到许多用例,通过与其他应用的交互使您的应用更加强大!

关于 Robert Nyman [名誉编辑]

Mozilla Hacks 的技术布道师和编辑。进行关于 HTML5、JavaScript 和开放 Web 的演讲和博客分享。Robert 是 HTML5 和开放 Web 的坚定支持者,自 1999 年以来一直从事 Web 前端开发工作 - 在瑞典和纽约市。他还定期在 http://robertnyman.com 上发布博客,并且热爱旅行和结识新朋友。

更多 Robert Nyman [名誉编辑] 的文章…


33 条评论

  1. Steve

    有哪些措施可以防止恶意使用高级短信和拨号功能?

    这是否需要进一步加强浏览器本身的安全性,以防止恶意软件渗透到这些工具中?

    虽然我很高兴看到 HTML5 被视为原生应用,但它也引起了我的担忧。

    想象一下,一个桌面浏览器允许网页从用户的开始菜单(或 Dock,或任何可用的 Linux 等效项等)启动实时应用。

    当然,作为一名开发者,我很想看到所有地方的原生集成……并且我确实认为意图是处理它的最佳方法。

    但是,作为用户,我仍然感到担忧。

    2013 年 1 月 24 日 上午 06:31

    1. Robert Nyman [编辑]

      这是一个合理的问题。一般来说,假设有人调用了用于拨打电话号码的 Web 活动。如果多个应用支持该活动,则系统会向用户显示一个菜单,让他们选择哪个应用应该打开它。

      如果只有一个应用支持它,则会将请求发送到该应用。但是,不会进行任何呼叫/启动操作(短信也是如此),因此触发的唯一操作是显示预先填写了用户传递的号码的电话(或短信)界面。

      2013 年 1 月 24 日 下午 12:59

      1. Steve

        明白了。

        众所周知,即使在移动设备出现之前,Web 也一直充斥着恶意软件。

        对于移动应用,意图通常会打开一个权限窗口,在安装之前必须接受该窗口……然而,Web 恶意软件变得更加隐蔽,通过 Flash、Java 甚至图像注入恶意脚本。

        我的真正担忧是(尤其是在 Android 上,Java 占据主导地位),只要 Web 脚本和硬件之间存在路径,就会存在被利用的可能性。

        Android 已经发生了很多案例,其中已安装的应用能够向手机用户从未被告知的高级号码发送隐蔽短信。

        这部分可能是由于,在获得提升的权限后,应用可能会将自身嵌入到固件中,甚至在通知传播到整个系统之前拦截通知,例如。

        考虑到大量的 Web 漏洞和各种移动漏洞……必须仔细考虑这两者之间的组合。

        例如,是否可以在浏览器中创建短信应用?

        例如,如果应用能够获得用户的权限来运行 Java,如果他们找到了提升权限的方法,它是否可能作为相对原生的 Android 应用运行?或者它是否仍然受小程序的传统权限限制?

        尤其是当我们将 Web 打开以访问硬件时……摄像头、短信、拨号器、内存访问等。

        除了典型的授权请求弹出窗口外,网站和设备之间是否存在任何其他安全层?例如,不确定在这种情况下是否真的能够实现沙盒。

        我喜欢这个计划,很想实现它,但我感到担忧,因为我知道外面有多少聪明、狡猾的人。

        2013 年 1 月 24 日 下午 15:24

        1. Jonas Sicking

          您似乎对成为应用意味着什么做出了很多假设。

          仅仅因为我们支持使用 HTML 创建应用,并不意味着我们支持这些应用能够执行 Windows 或 OSX 上的应用可以执行的任何操作。

          我们非常有意识地将 Web 应用平台的初始版本限制为我们可以使其安全的特性集。当然,就像任何软件一样,也存在错误,因此我不会声称 Firefox OS 是牢不可破的。

          因此,例如,我们目前不允许除内置应用之外的任何应用使用电话或短信 API。这将来可能会改变,但只有在我们能够确保其安全的情况下才会改变。

          同样,所有应用都非常严格地隔离,Web 活动是它们可以交互的少数几种方式之一。因此,Web 应用无法互相嵌入或读取/写入彼此的数据,例如。这种隔离比例如 Android 中的隔离要强得多。

          虽然我同意,只要存在从 JavaScript 到硬件的路径,就会增加漏洞的风险。但这与只要存在 Java 和硬件之间的路径或 C++ 和硬件之间的路径就同样成立。

          2013 年 1 月 24 日 下午 21:18

          1. Steve

            绝对正确。很高兴你们在考虑这个问题。

            至于假设,我不同意。

            现在可能还没有发生,正如您所说,一旦它变得更安全,您将努力实现它。

            但它*正在到来*。

            随着 HTML5 的出现,我们终于拥有了一种单一的、安全的跨平台语言,它足够强大和灵活,可以真正创建真实的应用……尤其是在 Harmony 发布以及 NodeJS 在后端发展时。

            我们已经看到了地理位置、相机访问等的实现……并且随着移动设备的普及,我相信很快就会有压力将其他功能整合到框架中。

            更有可能的是,某些人(Chrome、Explorer、Safari 等)会使用一些半专有的访问方式,然后开发者会使用这些方式。

            到那个阶段,为统一的 API 制定计划为时已晚……与其破坏现有代码,不如“修补现有路径”……即使这些路径计划不周。我们以前见过这种情况,我相信我们还会再见到。

            虽然对于大多数事情来说,这对开发者来说很麻烦,但这却有所不同。

            我们最后一个最棒的跨平台语言 Java 由于安全漏洞而失败……Flash 也是如此。

            在正在发展的 Web 中,我找不到其他任何地方存在同样的灾难可能性。

            HTML5 是 Web 唯一剩下的基石。

            虽然*确实*任何可以直接访问硬件的语言都容易受到利用……但在其他任何情况下,我们都没有发现这种在原生连接和潜在知识产权和身份损失以及直接经济损失之间的独特融合,尤其是在移动设备上。

            说实话,我很想看到完全访问权限……HTML5 在所有可用平台上运行为原生代码,无需修改或限制……我很想看到真实的磁盘访问权限,我很想看到启动外部应用的能力,我很想看到通过 HTML5 直接运行电话功能的能力。

            我认为这有可能在不断发展的 Web 中引发另一场革命。我相信*这会发生*,而且可能比我们准备得更快。

            我只是希望尽我所能确保它得到良好的规划,并且每个人都在使用相同的、安全的、统一的 API,当它最终到来时……即使这意味着用我的担忧来烦扰你们。

            普通开发者没有其他直接访问塑造 Web 的高层权限。

            我相信 Mozilla 团队……他们是相当可靠的开源团队。我相信他们会尽最大努力确保他们符合新兴标准,并帮助确保其安全。我尤其感谢他们展现出在掌握技术的同时不急于推向市场的能力……这必须是一个难以维持的平衡。

            我对 Chrome 团队的印象不那么深刻,因为 Dart 和其他技术表明他们愿意朝着自己的方向发展,以求率先进入市场……同样,我也对 Apple 和 Microsoft 怀有戒心。

            我担心如果其中一个团队匆忙将 API 推出,导致一个拼凑而成的 API,那么将会产生长期的安全影响。

            我真诚地希望,这一次,这些团队中的每一个团队都能将各自的利益放在一边,同意一个真正的开源解决方案,并着眼于我看到的平台的最终扩展……并且能够以统一、安全的方式做到这一点。

            我所能做的就是表达我的担忧,并希望它们能传达给合适的人。

            感谢你们的回复……这让我确信Mozilla团队正在积极处理我提出的问题。我希望其他团队也能同样重视。

            2013年1月24日 22:42

          2. Robert Nyman [编辑]

            感谢你的想法!
            我相信,与Java和Flash相比,HTML5由于完全开放且不属于一家公司,因此有更大的机会共同努力发现缺陷,确保其安全性等。

            我们绝对非常重视这个问题,并将尽一切努力确保其安全性。

            2013年1月25日 02:06

  2. Joshua Ols

    太棒了,真的很高兴你们决定支持意图。我一直在我的Android手机和平板上使用它们,所以我认为它们是一个杀手级功能。;)

    2013年1月24日 07:36

    1. Robert Nyman [编辑]

      谢谢!我完全同意,我认为意图方法起着重要作用!

      2013年1月24日 12:55

  3. Fabrice

    请注意,动态注册尚未实现。

    2013年1月24日 10:30

    1. Robert Nyman [编辑]

      是的,这就是为什么我想在最后一段中提到它。那部分还没有实现,但希望很快就能实现!

      2013年1月24日 12:55

  4. Mikko Ohtamaa

    喜欢这个。我们现在离更易用的HTML5应用更近了一步。

    2013年1月24日 14:00

    1. Robert Nyman [编辑]

      谢谢!我同意,这是非常重要的一部分。

      2013年1月24日 14:08

  5. Ron

    我希望你们至少与Chrome团队讨论过此事。

    为什么你们的“Web活动”看起来如此类似于Web意图(http://webintents.org/),只是名称令人恼火地不同?

    闻起来像是“不是我发明的”综合症。:S

    我想我会等到它至少在2个浏览器中标准化之后再费心。

    2013年1月24日 14:45

    1. Robert Nyman [编辑]

      我们一直都在与他们沟通。:-)
      Web意图和Web活动已经讨论了很长时间,并且Web活动是对Web意图的反提案,范围有限。此外,自去年11月以来,谷歌已暂停Web意图

      2013年1月24日 15:00

    2. Jonas Sicking

      我们没有采用Web意图的原因是它们仍处于研究阶段。Web意图具有更大的功能集,并试图解决更复杂的问题。这很好,但也意味着需要更长的时间才能找到有效的解决方案。

      事实上,我相信Chrome的新版本已经弃用了一些Web意图支持,因为最初的方法效果不如他们预期的那样好。

      由于我们希望将某些内容放入Firefox OS中,因此我们决定采用更简单的方法。因此有了Web活动。

      但我们确实与谷歌的团队进行了沟通,并将继续这样做。上次我们交流时,能够使我们的提案更加接近,因此我毫不怀疑我们将能够达成一个共同的提案。

      2013年1月24日 21:11

  6. Pic

    那个有一个未闭合的括号:p
    “通过清单文件 – 声明注册”

    有没有可能在浏览器中看到它?或者只有在从应用商店下载的应用中才能看到?

    2013年1月24日 14:45

    1. Robert Nyman [编辑]

      谢谢,已更新!
      目前,它在应用中有效,但也适用于Firefox OS上的常规网页浏览器。从长远来看,我希望在Android上的Firefox和其他任何移动网页浏览器中看到它。

      2013年1月24日 15:04

  7. Steve

    在移动设备上看到这个很好……但也在意料之中。

    我更感兴趣的是看看我们是否会在桌面上看到它。

    我不一定需要立即与其他应用交互,但我知道Mozilla、Chrome和其他团队正在努力实现对客户端硬件的访问:网络摄像头、麦克风、硬盘驱动器等。

    我认为意图应该是将所有这些权限密集型功能包装在一个API下的非常简单的方法。

    我们有没有可能在不久的将来在桌面上看到它?

    2013年1月24日 15:04

    1. Robert Nyman [编辑]

      我只能表示同意。就像你说的,这可以提供一种访问网络摄像头和更多内容的简单方法。但是,据我所知,我不认为我们会在不久的将来在桌面上看到它。

      不过,对于一般访问网络摄像头等,我们将拥有WebRTC——我们在桌面版Firefox上取得了进展——但就我个人而言,我认为Web活动也将是一个非常简单的选择。

      2013年1月24日 15:08

      1. Steve

        不得不表示同意。

        希望看到所有内容都包含在一个权限系统下……不幸的是,太多网络技术被零散地拼凑在一起,导致多个API存在的地方,而一个API就能解决问题(Android上的apple-touch-icon??)。

        希望Mozilla能引领潮流,让所有这些都能无缝地融合在一起。

        2013年1月24日 15:29

        1. Robert Nyman [编辑]

          我认为两者都适用。在某些情况下,一个简单的API会更有意义,但同时,支持、更新等的范围也会变得更大。然后,更小、更专门的API就非常棒。

          2013年1月25日 02:08

  8. Joshua Ols

    有一个相关的问题。Firefox OS是否支持共享/复制富文本?这是Android上一个非常恼人的限制,每当我必须在电子邮件、Google文档、浏览器等之间进行工作时,它都会让我回到我的PC上。

    2013年1月25日 04:24

    1. Robert Nyman [编辑]

      好问题。我不确定复制,但有一个“共享”活动,其中可能可以选择以更丰富的格式共享文本(尽管现在,我相信它只支持共享文件/Blob)。

      2013年1月25日 04:38

  9. Axel Hecht

    我想知道,是否可以使用应用的后台页面来处理活动,以实现不会弹出新应用的Web API?

    此外,活动名称是否仅限于当前集合,或者任何两个Web应用都可以创建一个新的活动并相互通信?

    2013年1月25日 05:45

    1. Robert Nyman [编辑]

      我们并没有像谷歌Chrome扩展程序那样真正使用后台页面。但将要实现的是对disposition属性的支持,其值为“inline”或“window”。基本上,“window”将转到另一个应用,而“inline”则在当前请求的应用中显示它。

      关于名称和限制,这是一个好问题!
      目前我相信它仅限于当前集合,但这可能是一种扩展它的有趣方式!

      2013年1月25日 05:50

  10. Jeff Walden

    我在其中看到一个"regexp":"/^https?:/"。大概需要两个正斜杠。与HTML输入元素上的pattern属性更一致的是,字符串与ECMAScript中的Pattern生成匹配。有没有可能更改它?

    2013年1月27日 03:36

    1. Jeff Walden

      而且,更仔细地查看HTML语言,也许模式应该暗示开头有一个^(?:和结尾有一个)$,以便字符串与整个输入字符串匹配,而不是与它的任何子组件匹配(这似乎有点容易出错,例如,如果有人错误地使用"https://"作为他们的输入字符串)。

      2013年1月27日 03:39

      1. Robert Nyman [编辑]

        感谢你的反馈!我会与团队讨论此事。

        2013年1月28日 08:45

    2. Jonas Sicking

      我们希望支持传递正则表达式标志,这样你就可以编写如下内容:

      regexp: “/^https?:/i”

      我确实同意暗示全字符串匹配会很好。类似于

      regexp: “https?:”
      “regexp-flags”: “i”

      可能是一个更好的解决方案。我认为我们无法在v1中更改此设置,但也许可以在v1.x中更改。

      2013年1月29日 02:45

  11. Sebastian Ortiz

    你好,

    我正在寻找已注册活动的应用列表。现在我正在尝试共享一个URL,但看起来唯一已注册的应用是蓝牙,它在FirefoxOS模拟器上无法运行。

    那么,我有哪些选项可以测试我的应用与共享活动?

    2013年1月29日 18:36

    1. Robert Nyman [编辑]

      拥有已注册活动的应用有点像移动的目标,是的,你现在说的关于共享是正确的。
      基本上,你现在可用的选项是

      – 浏览Gaia(Firefox OS的用户界面)代码并查看你能找到什么
      – 等待一段时间,直到更多应用支持它
      – 构建第二个应用,在那里你自己注册共享活动

      2013年1月30日 02:12

  12. Robin Berjon

    终于看到这方面的一些进展真是太好了。有没有可能加快此功能的标准化?它已经徘徊了太久。

    另外,为什么不在桌面上?这是一个杀手级功能,它真正打开了Web的大门。似乎没有充分的理由延迟它!

    2013年2月5日 04:30

    1. Robert Nyman [编辑]

      谢谢Robin!
      我希望它们能很快标准化。老实说,我相信桌面支持将是接下来要做的,但现在有很多事情正在发生,我们还没有妥善处理过。

      2013年2月5日 07:17

本文的评论已关闭。