跳到主要内容

离线支持

AISCouncil 是一个渐进式 Web 应用 (PWA),在首次访问后可离线工作。整个应用程序是一个没有外部依赖项的单个 HTML 文件,因此可以被浏览器的 service worker 完全缓存。

渐进式 Web 应用 (PWA)

应用程序注册一个 service worker (sw.js),在首次加载时缓存所有静态资源。在后续访问中,应用程序立即从缓存加载 —— 即使没有网络连接。

安装为应用

Chrome / Edge(桌面):

  1. 访问 aiscouncil.net
  2. 点击地址栏中的安装图标(或转到菜单 > "安装 AISCouncil")
  3. 应用程序在自己的窗口中打开,有自己的任务栏条目

Chrome / Edge(Android):

  1. 访问 aiscouncil.net
  2. 点击浏览器菜单(三个点)
  3. 选择"添加到主屏幕"或"安装应用"

Safari(iOS / macOS):

  1. 访问 aiscouncil.net
  2. 点击分享按钮
  3. 选择"添加到主屏幕"
提示

作为 PWA 安装时,应用程序以 standalone 模式运行 —— 没有浏览器界面、全屏体验,并在任务切换器中显示为原生应用。

Service Worker 缓存策略

Service worker 使用过期重验证策略:

  1. 首次访问: 所有预缓存的资源被下载并存储在缓存中
  2. 后续访问: 缓存版本立即提供(零网络延迟),同时 service worker 在后台获取更新版本
  3. 更新后的下次访问: 更新版本从缓存提供

这意味着您始终可以获得即时加载时间,更新在后台静默到达。

什么被缓存

Service worker 在安装时预缓存这些文件:

文件用途
/HTML shell(重定向到 /index.html
/index.html完整应用程序(~所有 JS、CSS 和 HTML 内联)
/icon.svg矢量应用图标
/icon-192.png192x192 PNG 图标(Android 主屏幕)
/icon-512.png512x512 PNG 图标(启动屏幕、可遮罩)
/favicon.ico浏览器标签页图标
/manifest.webmanifestPWA 清单(名称、图标、主题颜色)

此外,应用程序发出的任何同源 GET 请求将在首次获取时缓存,并在后续请求时从缓存提供(过期重验证)。

什么不被缓存

资源原因
LLM API 调用这些直接发送到提供商 API(Anthropic、OpenAI 等)并需要网络连接
注册表更新从 GitHub 获取模型注册表需要网络,但应用程序会回退到缓存/捆绑数据
跨域资源只有同源请求被 service worker 缓存
POST/PUT/DELETE 请求只有 GET 请求被缓存
API 代理调用/v1/* 的请求明确排除在缓存之外

离线能力

离线时,您可以:

  • 浏览现有聊天 —— 所有聊天历史本地存储在 IndexedDB 中
  • 管理配置文件 —— 创建、编辑和删除机器人配置文件
  • 查看和更改设置 —— 所有设置都在 localStorage 中
  • 导出数据 —— 下载您的备份 JSON 文件
  • 在机器人之间切换 —— 所有机器人配置本地存储
  • 阅读之前的对话 —— 完整的消息历史可用

离线时,您不能

  • 发送新消息 —— 需要对 LLM 提供商进行 API 调用
  • 刷新模型注册表 —— 需要从 GitHub 获取
  • 登录 —— OAuth 需要网络连接
  • 安装小程序 —— 需要获取清单和入口 HTML
信息

拥有本地实例的 Ollama 用户仍然可以离线聊天,因为 Ollama 在 localhost 上运行,不需要互联网访问。

缓存版本控制

Service worker 使用版本化的缓存名称:

const CACHE = "ais-v1.0.0";

当版本字符串更改时(在重大更新时),新的 service worker:

  1. 使用新名称创建新缓存
  2. 将所有资源预缓存到新缓存中
  3. 激活时删除所有旧缓存
  4. 声明所有打开的客户端

这确保在重大更新后清理过期的缓存代码。

更新应用程序

更新自动发生:

  1. 当您访问页面时,浏览器检查 sw.js 是否已更改
  2. 如果已更改,新的 service worker 在后台安装
  3. 下次页面加载时(或关闭所有标签页并重新打开后),新的 service worker 激活
  4. 新版本现在从缓存提供
强制更新

要强制立即更新:打开开发者工具 > 应用程序 > Service Worker,点击已注册的 service worker 上的"更新",然后重新加载页面。或者,按住 Shift 并点击浏览器的重新加载按钮以绕过缓存。

Web 应用清单

manifest.webmanifest 文件定义应用程序安装时的显示方式:

{
"name": "AISCouncil",
"short_name": "AISCouncil",
"description": "Chat with Claude, GPT, or Grok -- no server, no setup.",
"start_url": "/",
"display": "standalone",
"background_color": "#000000",
"theme_color": "#7c3aed",
"categories": ["productivity", "utilities"],
"icons": [
{ "src": "icon.svg", "sizes": "any", "type": "image/svg+xml" },
{ "src": "icon-192.png", "sizes": "192x192", "type": "image/png" },
{ "src": "icon-512.png", "sizes": "512x512", "type": "image/png" },
{
"src": "icon-512.png",
"sizes": "512x512",
"type": "image/png",
"purpose": "maskable"
}
]
}
字段用途
displaystandalone无浏览器 UI 运行(地址栏、标签页)
orientationany纵向和横向都可工作
theme_color#7c3aed状态栏和标题栏的紫色强调
background_color#000000应用加载时的启动屏幕背景

故障排除

应用程序显示旧版本:

  • 打开开发者工具 > 应用程序 > Service Worker
  • 点击旧 service worker 上的"注销"
  • 重新加载页面

应用程序无法离线工作:

  • 确保 service worker 已注册(开发者工具 > 应用程序 > Service Worker)
  • 确保您在线时至少访问过页面一次
  • 检查缓存是否存在(开发者工具 > 应用程序 > 缓存存储)
  • 某些浏览器在隐私/隐身模式下禁用 service worker

安装提示不出现:

  • 页面必须通过 HTTPS 提供(或 localhost
  • Service worker 必须已注册并处于活动状态
  • 清单必须有效并在 HTML <head> 中链接
  • 您必须至少访问过页面两次,中间间隔一些时间(浏览器启发式)