首先考虑离线

由于因特网连接可能会不稳定或者不存在,您需要首先考虑离线:假设没有因特网连接的条件下编写您的应用。一旦您的应用能够在离线状态下工作,添加任何需要的网络功能,使您的应用在在线状态下做更多事情。继续阅读,了解有关实现离线可用应用的技巧。

概述

Chrome 应用程序本身具有以下特性:

  • 您的应用的文件——所有 JavaScript、CSS 和字体,以及它需要的其他资源(例如图片)都已经下载好
  • 您的应用可以使用 Chrome 浏览器的存储 API 保存并可选地同步少量数据。
  • 您的应用可以监听在线与离线事件检测连接可用与否的变化

然而这些能力不足以保证您的应用能够离线工作。您的离线可用的应用应该遵循这些规则:

尽可能使用本地数据
从因特网使用资源时,通过 XMLHttpRequest 来获取它,并在本地保存数据。您可以使用 Chrome 浏览器的存储 API、IndexedDB 或文件系统 API 在本地保存数据。
将您的应用的用户界面与它的数据分开
将用户界面与数据分离不仅可以改善您的应用的设计,简化启用离线支持的任务,还能让您提供用户数据的其他视图。MVC 框架可以帮助您保持用户界面与数据的分离。
假定您的应用可以在任何时候关闭
保存应用状态(尽可能本地与远程同时保存)以便用户可以随时从离开的地方继续。
充分测试您的应用
确保您的应用程序在常见与特殊的情形下都能正常工作。

安全性限制

Chrome 应用对资源存放的位置有一些限制:

  • 由于本地数据在用户的计算机上可见,不能安全地加密,敏感数据必须留在服务器上。例如,不要在本地储存密码或者信用卡号。
  • 应用执行的所有 JavaScript 都必须在应用包中,不能内嵌。
  • 所有 CSS样式图片字体可以一开始就在应用程序包中,也可以在远程 URL 上。如果资源是远程的,您不能在您的 HTML 中指定它,而需要使用 XMLHttpRequest 获取数据(参见引用外部资源),然后通过 Blob URL 或者(更好的)通过文件系统 API 保存并加载数据。

    注意:样式可以内嵌或者在单独的 .css 文件中。

然而您可以从外部站点加载大型媒体资源,例如视频与声音。这一例外的一个原因是当应用只有有限的或根本没有网络连接时,<video> 与 <audio> 元素有良好的应变行为,另一个原因是目前通过 XMLHttpRequest 和 Blob URL 获取并托管媒体时不支持流处理或部分缓冲。

要提供一个受沙箱保护的 iframe,您可以创建一个 <object> 标签,它的内容可以来自远程,但是它不能直接访问 Chrome 浏览器的应用 API(参见嵌入外部网页)。

对 Chrome 应用的部分限制由内容安全策略(CSP)强制实施, Chrome 应用的策略永远是如下内容,不能修改:

default-src 'self';
connect-src *;
style-src 'self' blob: data: filesystem: 'unsafe-inline';
img-src 'self' blob: data: filesystem:;
frame-src 'self' blob: data: filesystem:;
font-src 'self' blob: data: filesystem:;
media-src *;

指定 offline_enabled

默认情况下假定您的应用在离线状态下能很好地工作。如果不是这样,您应该使用户了解这一事实,以便用户离线时执行图标可以暗色显示。如果要这么做,请在应用的清单文件中将 offline_enabled 设置为 false

{
  "name": "我的应用",
  ...
  "offline_enabled": false,
  ...
}

在本地保存数据

下表展示了您在本地保存数据的几种选择(请参见管理数据)。

API 最佳使用情形 备注
Chrome 存储 API 少量字符串数据 适用于设置与状态,方便远程同步(但不是必须的),由于配额限制不适合大量数据。
IndexedDB API 结构化数据 能够快速搜索数据,请与 unlimitedStorage 权限 一起使用。
文件系统 API 其他数据 提供一个您可以储存文件并受沙箱保护的区域,请与 unlimitedStorage 权限 一起使用。

注意:Chrome 应用不能使用网络 SQL数据库或 localStorage。WebSQL 规范目前已经弃用,而 localStorage 以同步方式处理数据(这意味着它比较慢)。存储 API 以异步方式处理数据。

在远程保存数据

总的说来,如何在远程保存数据取决于您,但是一些框架与 API 可能会有所帮助(参见 MVC 架构)。如果您使用 Chrome 浏览器的存储 API,那么所有可同步的数据都将在应用在线并且用户登录至 Chrome 的任何时候自动同步。然而,注意如果用户卸载了您的应用,用户的同步数据也将删除。 {QUESTION: true?}

考虑在您的应用卸载后用户数据至少保留 30 天,这样用户如果重新安装您的应用的话也会有良好的体验。

将数据与用户界面分离

使用 MVC 框架可以帮助您设计与实现您的应用,使数据与应用的数据视图完全分离。请参见 MVC 架构了解 MVC 框架列表。

如果您的应用与自定义服务器交互,服务器应该向您提供数据,而不是 HTML 片段。考虑 RESTful API。

一旦您的数据与您的应用分离,就能更容易地提供数据的替代视图。例如,您可以提供公开数据的网站视图。当您的用户不使用 Chrome 浏览器时,网站视图不仅有用,还能使搜索引擎找到数据。

测试

确保您的应用程序在以下条件下都能正常工作:

  • 应用安装后立刻进入离线状态。换句话说,应用的第一次使用是离线的。
  • 应用在一台计算机上安装后同步到另一台计算机。
  • 应用卸载后又立刻重新安装。
  • 应用同时在两台计算机上运行,具有相同的配置文件。当一台计算机进入离线状态,用户在这台计算机上做了一些事情,这台计算机又进入在线状态时,应用程序必须有合理的行为。
  • 应用程序只有时断时续的网络连接,经常在在线与离线状态间切换。

此外确保应用程序不会在用户的计算机上保存任何敏感的用户数据(例如密码)。