跳至内容
WebViewGold 从 Vibe Coding 到 App Store
中文
获取 WebViewGold

v0 + 设备存储

为您的 v0 应用提供原生存储和设备 ID

用户希望应用能记住他们。Cookie 和 localStorage 通常能让您的 v0 应用保持登录,但它们属于 Web 存储,清除缓存后就会消失。WebViewGold 增加了两个小巧的原生辅助功能:一个持久化的值存储(writevalue:// 和 readvalue://),用于保存设置和恢复会话;以及一个设备 UUID(get-uuid://),用于您服务器上的设备绑定许可证、受信任设备和按设备区分的设置。

每个平台一次性 $109 起,或由我们的团队全程代劳,$698 起。

  • 审核通过保证 – 否则 14 天内退款
  • 无需编程
  • 一次性付费,免费更新
  • 7×24 小时人工支持
  • 2014 年起德国出品 · ISO 27001

两个原生辅助功能

Read/Write Value API

writevalue:// 会把 scheme 之后的全部内容作为一个字符串保存在应用的私有存储中;readvalue:// 则把它注入回页面,在 iOS 上是 window.storedValues,在 Android 上是 window.appSettings。这些值在重启和清除缓存后依然保留,卸载应用后才会消失(在 Android 上清除应用数据时也会消失)。

UUID API

get-uuid:// 会设置 JavaScript 变量 uuid,这是一个不含个人信息的唯一设备 ID。也可以把它以 ?uuid=XYZ 的形式附加到第一次请求上(enhanceUrlUUID / UUID_ENHANCE_WEBVIEW_URL),或者注入到每个页面中(autoInjectVariable / AUTO_INJECT_VARIABLES)。

它不是什么

它不会在设备之间同步,不是数据库,也不是密码保险箱。值要尽量小(设置、标志位、可吊销的令牌),用户数据请放在 Next.js 路由处理程序和 Server Actions,通过 Neon 或 Supabase 使用 Postgres 中,并且绝不要把 UUID 当作身份证明。

给 v0 的提示词

把这段粘贴到 v0 中以实现 Web 应用端。检查结果,发布,然后在 WebViewGold 应用中测试。

粘贴到 v0 的提示词
为这个 Next.js App Router 应用添加面向 WebViewGold 封装的原生设备 ID 和持久化支持。1) 在 middleware.ts 中,如果请求带有 uuid 查询参数(由 WebViewGold 通过 enhanceUrlUUID / UUID_ENHANCE_WEBVIEW_URL 发送一次),先校验其格式,设置一个有效期一年的 httpOnly、secure Cookie device_id,然后重定向到不带该参数的同一 URL。2) 创建 app/api/devices/route.ts:为已登录用户 upsert { userId, deviceId, platform, lastSeen },并执行每个许可证最多三台设备的限制,超出时返回 409 和设备列表。3) 创建客户端辅助模块 nativeValues,其中 write(obj) 导航到 writevalue://k=v;k=v,read() 导航到 readvalue:// 并在 250 毫秒后解析 window.storedValues 或 window.appSettings;仅在 navigator.userAgent 包含我的 WebViewGold 标识时使用。4) 首次在客户端加载时,如果主题或语言区域 Cookie 缺失,就从原生值中恢复。5) 在设置下添加带“移除”按钮的“设备”页面。6) 绝不要在服务端渲染期间读取 window 上的值。

把 Web 应用转换成原生应用的绝佳方式!周转速度快,无需开发完整的原生应用就能把应用上架到应用商店!

Kevin Joling · FlightConnections & TrainConnections · Trustpilot

它能在哪些地方发挥作用

保持登录

登录后写入一个可吊销的刷新令牌。如果清除缓存后 Web 会话没了,就在启动时把它读回来,悄悄恢复会话,而不是显示登录页面。

即时加载的设置

主题、语言、单位、“已完成引导”、上次打开的工作区:启动时在本地读取,比后端响应更早,离线时也能用。

绑定设备的许可证

“Pro 版可在两台设备上使用”:激活时注册 UUID,在服务器上统计活跃设备数,并提供“管理设备”页面来释放名额。

受信任设备

在用户已经确认过的设备上跳过第二重验证或邮件验证码,并显示“已登录设备:iPhone、Pixel”,每台设备都可以单独退出登录。

自助终端和共享平板

前台的 iPad 或仓库里的扫码手机,应该始终打开同一个门店或工位:按设备保存工位 ID 即可。

接入 v0 应用

大约一小时,外加后端里的一张设备表。

  1. 检测应用

    在 Config.swift(useragent_iphone、useragent_ipad)和 Config.java(USER_AGENT)中设置自定义 User-Agent,只在匹配时才调用这些 scheme。在浏览器中则回退到 localStorage。

  2. 选择安全的格式

    writevalue:// 之后的所有内容都会原样保存为一个字符串,所以请使用简单的 key=value;key=value 格式,并且只用 URL 安全的值(字母、数字、点、连字符、下划线)。每次写入都会替换整个字符串,因此请始终写入所有键。

  3. 启动时读取

    导航到 readvalue://,稍等片刻(文档中用的是 200 毫秒),然后解析 window.storedValues(iOS)或 window.appSettings(Android)。先应用主题和语言,然后在需要时恢复登录会话。

  4. 注册设备

    登录后读取 uuid(在调用 get-uuid:// 之后,或通过自动注入选项自动获得),并把它和用户一起保存在 Next.js 路由处理程序和 Server Actions,通过 Neon 或 Supabase 使用 Postgres 中:用户 ID、UUID、平台、最后活跃时间。设备数量限制要在服务器上强制执行,绝不要放在客户端。

  5. 清理

    退出登录时,重写一份不含令牌的值,并在服务器上吊销该令牌。删除账号时,也一并删除设备记录(账号删除指南)。

  6. 注意 iOS 的单次调用规则

    iOS 在每次脚本执行中只处理一次 scheme 导航,所以请用短暂的延迟把调用串起来(或者使用支持 get-uuid 的 multiapicall://),而不是在同一时刻同时触发。

适用于两个平台的小型封装

在应用和浏览器中使用同一套 API。把 YourAppToken 替换为您的自定义 User-Agent。

javascript
var inApp = navigator.userAgent.indexOf("YourAppToken") !== -1;

function nativeWrite(values) {                 // { rt: "abc123", theme: "dark", lang: "en" }
  var str = Object.keys(values).map(function (k) { return k + "=" + (values[k] || ""); }).join(";");
  if (!inApp) { try { localStorage.setItem("appValues", str); } catch (e) {} return; }
  window.location.href = "writevalue://" + str;
}

function parseValues(str) {
  var out = {};
  String(str || "").split(";").forEach(function (pair) {
    var i = pair.indexOf("=");
    if (i > 0) out[pair.slice(0, i)] = pair.slice(i + 1);
  });
  return out;
}

function nativeRead(callback) {
  if (!inApp) { callback(parseValues(localStorage.getItem("appValues"))); return; }
  window.location.href = "readvalue://";
  setTimeout(function () {
    callback(parseValues(window.storedValues || window.appSettings));  // iOS || Android
  }, 250);
}

function nativeDeviceId(callback) {
  if (!inApp) { callback(null); return; }
  if (typeof uuid !== "undefined") { callback(uuid); return; }        // 已自动注入
  window.location.href = "get-uuid://";
  setTimeout(function () { callback(typeof uuid !== "undefined" ? uuid : null); }, 250);
}

隐私与审核

  • 如果您在服务器上保存 UUID,请在 App Privacy 中申报“设备 ID”(与账号一起保存时标记为与用户关联),并在 Google Play 数据安全表单中申报“设备或其他 ID”。
  • 只把它用于您自己的功能。与广告网络或数据经纪商共享它,或者把它与其他公司的数据关联起来,根据准则 5.1.2 都属于跟踪,需要显示 App Tracking Transparency 提示。
  • 不要把 UUID 与其他设备信号结合起来为用户生成指纹;无论是否显示了提示,Apple 都不允许设备指纹识别。
  • 在隐私政策和条款中写明,例如:“此许可证最多可在两台设备上使用;我们会保存一个设备标识符来执行这一限制。”
  • 把值存储当作应用的偏好设置文件来对待:适合存放设置和可吊销的令牌,不适合存放密码或支付数据。

常见问题

为什么不直接使用 Cookie 和 localStorage?

先用它们;在应用内,它们的持久性和在浏览器中一样。原生值存储是一份备份,用来保存必须在清除缓存后依然存在的内容,例如可吊销的设备令牌、引导状态或语言选择,而且启动时即可读取,离线也能用。

WebViewGold 的 UUID 和广告标识符是一回事吗?

不是。它是一个用于您自己应用逻辑、不含个人信息的设备标识符,不是 IDFA,也不是 Android 广告 ID,读取它也不会弹出 App Tracking Transparency 提示。如果您用它跨其他公司的应用跟踪用户,或者把它分享给广告网络,那就构成了跟踪,ATT 规则随之适用。

保存的值会同步到用户的其他设备吗?

不会。值按安装、按设备保存。凡是应该跟着用户走的内容(个人资料、偏好设置、购买记录)都应放在您的后端;设备存储只负责加快启动速度,并让一台设备保持登录。

重新安装后或换了新手机会怎样?

卸载后保存的值就没有了,而且您也不应假设 UUID 会保持不变。让用户重新登录、重新注册设备,并在一段时间不活跃后或通过“管理设备”页面,在 Next.js 路由处理程序和 Server Actions,通过 Neon 或 Supabase 使用 Postgres 中释放旧设备。

我能在浏览器或预览中测试吗?

只能测试兜底方案。这些 scheme 只在 WebViewGold 应用内有效,在桌面浏览器或 v0 预览中都不起作用。检测自定义 User-Agent,在浏览器中使用 localStorage 兜底,并在手机上用应用的构建版本测试真实流程。

让您的应用上架商店的三种方式

结果相同,只是您需要投入的工作量不同。三种方式都附带审核通过保证和 7×24 小时人工支持。

自己动手

$109 每个平台,一次性付费

WebViewGold 许可证:一个现成的 Xcode 或 Android Studio 项目。粘贴您的 URL,设置名称和图标,开启所需功能,构建并提交。永久免费更新。

在主页查看方案

Cloud Builder

$349 每个许可证,一次性附加购买

无需 Mac、Xcode 或 Android Studio:在浏览器中完成配置,我们在云端构建两个应用,并将其交付到 App Store Connect 和 Play Console。

Cloud Builder 如何运作 试用免费演示

Full Service

$698 每个平台 $798

把您的 URL 和图标发给我们。我们的团队在 72 小时内完成配置、构建并交付您的应用,白标,附源码项目。两个平台共 $1,158。

Full Service 详情 服务提供方: WeSetupYourWebViewApp

冬季特惠价格有效期至 2026年12月31日。

准备好发布您的 v0 应用了吗?

App Store & Google Play 审核通过保证 – 否则 14 天内退款

想直接交给我们?Full Service:我们在 72 小时内完成配置、构建并交付,每个平台 $698 起。有疑问?通过 7×24 小时在线聊天联系我们。

退款依据我们 FAQ 中列出的条件:应用因非内容原因被 Apple 和/或 Google 拒审,并在购买后 14 天内提出申请。