该页面翻译自 Google Chrome Extensions 与 Google Chrome Apps。除非特别说明,该页面的内容遵循 Creative Commons Attribution 3.0 License,代码示例遵循 BSD License。
由于因特网连接可能会不稳定或者不存在,您需要首先考虑离线:假设没有因特网连接的条件下编写您的应用。一旦您的应用能够在离线状态下工作,添加任何需要的网络功能,使您的应用在在线状态下做更多事情。继续阅读,了解有关实现离线可用应用的技巧。
Chrome 应用程序本身具有以下特性:
然而这些能力不足以保证您的应用能够离线工作。您的离线可用的应用应该遵循这些规则:
XMLHttpRequest
来获取它,并在本地保存数据。您可以使用 Chrome
浏览器的存储 API、IndexedDB 或文件系统 API 在本地保存数据。
Chrome 应用对资源存放的位置有一些限制:
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
设置为 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 浏览器时,网站视图不仅有用,还能使搜索引擎找到数据。
确保您的应用程序在以下条件下都能正常工作:
此外确保应用程序不会在用户的计算机上保存任何敏感的用户数据(例如密码)。