首先考虑离线
由于因特网连接可能会不稳定或者不存在,您需要首先考虑离线:假设没有因特网连接的条件下编写您的应用。一旦您的应用能够在离线状态下工作,添加任何需要的网络功能,使您的应用在在线状态下做更多事情。继续阅读,了解有关实现离线可用应用的技巧。
概述
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 浏览器时,网站视图不仅有用,还能使搜索引擎找到数据。
测试
确保您的应用程序在以下条件下都能正常工作:
- 应用安装后立刻进入离线状态。换句话说,应用的第一次使用是离线的。
- 应用在一台计算机上安装后同步到另一台计算机。
- 应用卸载后又立刻重新安装。
- 应用同时在两台计算机上运行,具有相同的配置文件。当一台计算机进入离线状态,用户在这台计算机上做了一些事情,这台计算机又进入在线状态时,应用程序必须有合理的行为。
- 应用程序只有时断时续的网络连接,经常在在线与离线状态间切换。
此外确保应用程序不会在用户的计算机上保存任何敏感的用户数据(例如密码)。