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

后端检查清单

Supabase 应用上架 App Store 和 Google Play:完整检查清单

Lovable、Bolt、Tempo、Hostinger Horizons 和大多数 Cursor 项目底层都是 Supabase。Supabase 在 WebViewGold 应用中运行得非常好,但有少数几个设置会默默假定自己运行在浏览器标签页里。这份清单按您遇到它们的顺序逐一讲解。

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

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

1. 认证配置:Site URL 和重定向 URL

Supabase 控制台 → Authentication → URL Configuration。这些值决定了每封邮件中的链接和每次 OAuth 回调最终落在哪里。

  • Site URL = 您的生产域名(https://app.yourbrand.com),绝不能是 lovable.app 预览地址或 localhost。自定义域名指南解释了为什么应用必须加载一个您自己拥有的域名。
  • 重定向 URL:添加您用到的每一个回调路径(https://app.yourbrand.com/auth/callback、/reset-password、/**)。上线前删除隧道和预览 URL。
  • 邮件模板使用 {{ .SiteURL }} 和 {{ .RedirectTo }};检查确认邮件、Magic Link 邮件和找回密码邮件是否都指向您的域名。
  • 只要 WebViewGold 中的清除缓存选项保持关闭(Config.swift 中的 deletecache、Config.java 中的 CLEAR_CACHE_ON_STARTUP),会话就会像在浏览器中一样保持。

2. 社交登录:Google 和 Apple

准则 4.8 规定:如果您提供 Google 登录,就必须同时提供 Sign in with Apple(或同等的注重隐私的选项)。

  1. Google:保留 Supabase provider,加上 WebViewGold 辅助工具

    Google 拒绝在嵌入式 WebView 中进行 OAuth(即“disallowed_useragent”错误)。WebViewGold 的 Social Login Helper 无需修改代码即可解决:在 Config.swift 中把 google_login_helper_triggers 设为 ["https://accounts.google.com", "https://accounts.youtube.com"],并在 Config.java 中设置 GOOGLE_LOGIN_HELPER_TRIGGERS;之后登录会在一个使用 Google 认可的 user agent 的专用窗口中进行。详情见disallowed_useragent 指南。

  2. Apple:在 Supabase 中启用该 provider

    Apple Developer:一个启用了 Sign in with Apple 功能的 App ID、一个返回 URL 为 https://YOUR-PROJECT.supabase.co/auth/v1/callback(或您的自定义认证域名)的 Services ID,以及一个 .p8 密钥。Supabase:Authentication → Providers → Apple,填入 Services ID、Team ID、Key ID 和生成的 client secret。这个 secret 是一个最长六个月就会过期的 JWT;请在日历里设个提醒。

  3. 在 Web 应用中添加按钮

    supabase.auth.signInWithOAuth({ provider: "apple", options: { redirectTo: "https://app.yourbrand.com/auth/callback" } })。Apple 按钮至少要和 Google 按钮一样醒目。WebViewGold 会自动识别 appleid.apple.com;无需配置辅助工具。

  4. 在真实 iPhone 上测试两者

    在 TestFlight 构建中完整走一遍 Google 和 Apple 登录,包括一个使用 Apple“隐藏邮件地址”中转地址注册的全新账号。

3. 通过 Universal Links 处理 Magic Link 和密码重置

从“邮件”应用中打开的 Magic Link 默认会落到 Safari:用户在网站上登录了,在应用中却没有。Universal Links(iOS)和 App Links(Android)会把指向您域名的链接转到应用中打开。在项目的 public 文件夹中托管 /.well-known/apple-app-site-association 和 /.well-known/assetlinks.json,添加 Associated Domains 功能(applinks:app.yourbrand.com),并在 Config.swift 中把 ShowExternalLink 设为 true;在 Android 上,启用 Config.java 中的 IS_DEEP_LINKING_ENABLED,并在 AndroidManifest.xml 的 intent filter 中添加该域名。Universal Links 文档和App Links 文档中有具体步骤。

在 Supabase 端,使用 PKCE 流程(supabase-js v2 的默认设置),并在回调页面上调用 exchangeCodeForSession。请为认证邮件关闭点击追踪,因为链接中的追踪域名会让关联失效。深度链接指南介绍了如何测试。

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

Kevin Joling · FlightConnections & TrainConnections · Trustpilot

4. 账号删除 edge function

Apple 准则 5.1.1(v) 和 Google 的账号删除政策要求在应用内提供删除账号及其数据的方式。客户端无法删除认证用户;一个使用 service role key 的小型 edge function 可以。把“删除账号”按钮连到它,之后让用户退出登录,再添加一个公开的 /delete-account 页面(Google 会要求提供这个 URL)。完整流程见账号删除指南。

typescript
// supabase/functions/delete-account/index.ts
import { createClient } from "npm:@supabase/supabase-js@2";

Deno.serve(async (req) => {
  const authHeader = req.headers.get("Authorization") ?? "";
  const userClient = createClient(Deno.env.get("SUPABASE_URL")!, Deno.env.get("SUPABASE_ANON_KEY")!, {
    global: { headers: { Authorization: authHeader } },
  });
  const { data: { user }, error } = await userClient.auth.getUser();
  if (error || !user) return new Response("Unauthorized", { status: 401 });

  const admin = createClient(Deno.env.get("SUPABASE_URL")!, Deno.env.get("SUPABASE_SERVICE_ROLE_KEY")!);
  await admin.from("profiles").delete().eq("id", user.id); // 或对 auth.users 使用 ON DELETE CASCADE
  const { error: delError } = await admin.auth.admin.deleteUser(user.id);
  if (delError) return new Response(delError.message, { status: 500 });
  return new Response(JSON.stringify({ ok: true }), { headers: { "Content-Type": "application/json" } });
});

5. 数据:RLS、存储上传和隐私

  • 每张含有用户数据的表都要启用 Row Level Security。构建工具有时会生成“全部允许”的策略,只为让演示跑起来;上线前请在 Table editor → Policies 下审查它们。
  • 存储:用户文件放在私有 bucket 中并使用签名 URL;公开 bucket 只用于真正公开的素材。
  • 从 WebView 上传开箱即用:标准的文件输入框(accept="image/*")会打开原生照片选择器或相机。在 Info.plist 中为相机和照片图库写上真实的权限说明,并删除您用不到的权限。
  • 客户端中的 anon key 按设计就是可以公开的;service role key 只能出现在 edge function 和服务器代码中。
  • App Privacy(Apple)和数据安全(Google):一个 Supabase 应用至少会收集邮箱、用户 ID 和用户内容;请在隐私政策中把 Supabase 列为数据处理方。隐私指南提供了典型的回答。

6. 推送用户 ID 和 RevenueCat webhook

让原生功能变得个性化的两个后端接入点。

  1. 为每个用户保存推送订阅 ID

    登录后跳转到 getonesignalplayerid://;WebViewGold 会设置 window.onesignalplayerid(或启用 autoInjectVariable / AUTO_INJECT_VARIABLES,无需调用即可获得)。把它 upsert 到 profiles.push_id,再通过 edge function 调用 OneSignal REST API 发送定向通知。Firebase 和 Pushwoosh 的做法相同。

  2. 接收 RevenueCat 事件

    创建一个 edge function 作为 webhook 端点,校验您在 RevenueCat 中设置的 Authorization 请求头,并写入 subscriptions(user_id, entitlement, expires_at, store)。由于您的 Web 应用通过 revenuecat://purchase?external_id=USER_ID&product=PRODUCT 触发购买,webhook 中的 app_user_id 正好就是您的 Supabase 用户 ID。

  3. 在服务器端控制功能权限

    高级功能检查通过 RLS 读取 subscriptions 表,绝不依赖 localStorage 中的标记。Web 版本的 Stripe webhook 写入同一张表,因此一次检查就能覆盖两个渠道(RevenueCat 指南)。

常见问题

应用需要原生 Supabase SDK 或不同的认证流程吗?

不需要。您已经在用的 Web SDK 可以直接在 WebView 中运行。唯一需要添加的是用于 Google 的 WebViewGold Social Login Helper,以及用于邮件链接的 Universal Links 设置。

Supabase Realtime 和 websocket 在 WebViewGold 中能用吗?

能。WKWebView 和 Android WebView 都支持 websocket,因此 Realtime 订阅的表现与在浏览器中完全一样。

用户在两次启动应用之间会保持登录吗?

会,只要 Config 文件中的清除缓存选项保持关闭。会话由 supabase-js 刷新,和在 Web 上一模一样。

没有 Universal Links,Magic Link 还能用吗?

能让用户登录,但登录发生在 Safari 中而不是应用中。对于以登录为核心的应用来说,这已经足够让人困惑,值得花一小时完成设置。

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

结果相同,只是您需要投入的工作量不同。三种方式都附带审核通过保证和 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日。

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

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

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

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