·5 分钟阅读

让你的应用记住数据:State SDK 使用指南

保存用户数据、游戏进度、个人偏好,跨会话不丢失 — 不需要搭后端。跟 AI 助手说一句话就能搞定。

tutorialstate-sdkdata

问题:一刷新就全没了

你用 AI 做了个很棒的应用 — 一个测验、一个游戏、一个实用工具。别人用得挺开心,然后关掉了标签页。再打开的时候,什么都没了。最高分?没了。设置?没了。写了一半的东西?也没了。

网页应用默认就是这样的。但不一定非得这样。


解决方案:gapp.so 的 State SDK

在 gapp.so 上发布的每个应用都自带云端存储系统 — 不用搭后端、不用配数据库、不用申请任何密钥。你的应用只要几行代码就能存取数据。

SDK 会自动注入到你的应用中,通过 gapp.state 就能调用。不需要安装任何东西。


怎么加到你的应用里

把下面这段话发给你的 AI 编程助手(Claude Code、Cursor、Gemini 等):

> "用 gapp.so 的 state SDK 来保存和加载用户数据,文档在这里:https://gapp.so/ai-sdk-prompt.md"

就这一句话。AI 助手会读文档,然后帮你把存储功能接好。

想说得更具体一点?可以这样跟它说:

  • *"保存用户偏好设置,关掉再打开还在"*
  • *"加一个最高分系统,记住每个用户的最好成绩"*
  • *"每隔几秒自动保存用户正在编辑的内容"*
  • *"做一个所有用户都能看到的全局排行榜"*

能做什么?

给每个用户存私有数据

每个用户有自己独立的存储空间,适合存:

  • 偏好设置 — 主题、语言、字体大小
  • 进度 — 游戏存档、已完成的关卡、解锁的成就
  • 个人内容 — 草稿、笔记、自定义配置
// 保存
await gapp.state.set('preferences', { theme: 'dark', lang: 'zh' })

// 读取
const prefs = await gapp.state.get('preferences')

所有用户共享的数据

需要排行榜?共享计数器?协作空间?用 global 作用域:

// 读取排行榜
const scores = await gapp.state.global.get('leaderboard') || []

// 加一条新记录
scores.push({ name: '玩家1', score: 9500 })
scores.sort((a, b) => b.score - a.score)
await gapp.state.global.set('leaderboard', scores.slice(0, 100))

零代码自动同步

最省事的办法:如果你的应用已经用了 localStorage(AI 助手大概率已经帮你用了),gapp.so 会自动把它同步到云端。用户换个设备登录,数据还在 — 你一行代码都不用改。

// 这就已经能用了 — gapp.so 会自动同步
localStorage.setItem('gameProgress', JSON.stringify(progress))

三种存储范围

范围谁能访问适合存什么
User(用户)只有这个登录用户,跨设备同步偏好、存档、个人数据
Session(会话)只有这台设备(匿名用户)临时状态、登录前的草稿
Global(全局)所有使用这个应用的人排行榜、共享内容、计数器

默认情况下,SDK 会自动选择:登录用户用 User 范围,匿名用户用 Session 范围。除非你有特殊需求,否则不用操心这个。


实际例子

记住答题进度的测验应用

window.addEventListener('gapp:ready', async () => {
  // 加载上次做到哪了
  const progress = await gapp.state.get('quizProgress') || {
    currentQuestion: 0,
    correctAnswers: 0,
    totalAnswered: 0
  }
  startQuiz(progress)
})

// 每回答一题
async function onAnswer(isCorrect) {
  progress.totalAnswered++
  if (isCorrect) progress.correctAnswers++
  progress.currentQuestion++
  await gapp.state.set('quizProgress', progress)
}

自动保存的画板应用

// 改动后每 2 秒自动保存
let saveTimer
canvas.addEventListener('change', () => {
  clearTimeout(saveTimer)
  saveTimer = setTimeout(async () => {
    await gapp.state.set('canvas', canvas.toJSON())
  }, 2000)
})

// 打开时恢复
const saved = await gapp.state.get('canvas')
if (saved) canvas.loadFromJSON(saved)

容量限制

上限
User/Session 存储每个应用 100 KB
Global 存储每个应用 1 MB
最多键数每个范围 100 个
键名长度100 个字符

对大多数应用来说这些完全够用。如果数据量比较大,可以把数据拆分到多个键里存储。


获取用户信息

SDK 还能获取用户身份信息:

if (gapp.user.isAuthenticated()) {
  const name = gapp.user.getName()
  const avatar = gapp.user.getAvatarUrl()
  showWelcome(name, avatar)
}

可以用来做个性化体验 — 显示欢迎语、在排行榜上显示用户名、或者根据用户身份调整界面。


本地测试

想在发布前测试数据保存功能?用本地开发模式

  1. 管理后台 > 创作者工具 获取开发令牌
  2. 把开发脚本加到 HTML 里
  3. State SDK 在本地会用 localStorage 模拟 — 接口一样,不需要服务器

具体步骤在 AI SDK 文档 里。


快速参考

我想要...跟 AI 助手说...
保存用户数据*"用 gapp.so 的 state SDK:https://gapp.so/ai-sdk-prompt.md"*
加排行榜*"用 gapp.state.global 做一个全局排行榜"*
自动保存进度*"用 gapp.state 做带防抖的自动保存"*
保持 localStorage 能用不用说 — 自动同步
本地测试*"配置 gapp.so 本地开发模式:https://gapp.so/ai-sdk-prompt.md"*

完整文档

准备好分享你的作品了吗?

发布你的 AI 应用,几秒钟内获得专属落地页。

提交应用