Google 每年都会提高门槛
新应用和更新必须在 Google 每年规定的截止日期前,以较新的 Android 版本为目标。过了这个日期,旧模板就无法上传;目标 API 级别指南解释了时间安排。
| 变更 | 如何发布 | 说明 |
|---|---|---|
| Web 应用中的新页面、新功能、错误修复、设计变更 | 即时:在 Lovable、Bolt、Vercel 或您的托管平台上部署 | 每个已安装的应用在下次加载时就会显示;无需审核 |
| 文案、Web 上显示的价格、法律页面 | 即时 | 让商店中的应用内购买价格与应用显示的价格保持一致 |
| 应用图标、应用名称、启动画面 | 商店更新 | 属于构建中的原生素材 |
| 启用一项原生功能(推送服务商、生物识别、二维码扫描、AdMob、RevenueCat) | 商店更新 | 一个 Config 开关加一次重新构建;新的权限会被审核 |
| 新的权限说明(相机、位置、照片) | 商店更新 | 如果数据使用方式有变,同时更新 App Privacy 答案和数据安全表单 |
| 更改起始 URL 或域名 | 商店更新 | 在上线前选好自定义域名即可避免 |
| WebViewGold 模板更新(新的 iOS SDK、Play 目标 API 级别、隐私清单) | 商店更新 | 免费更新;大约每年需要一次,以保持可发布状态 |
| 商店详情文字和截图 | 无需构建,但需审核 | App Store:截图、描述和关键词只能随新版本更改;推广文本和 URL 随时可改。Play:商店详情随时可改,需审核 |
iOS 有两个号码:用户看到的版本号(CFBundleShortVersionString,例如 1.2.0),以及每次上传都必须递增的构建号(CFBundleVersion),即使版本号相同也一样。Android 有 versionName(自由文本,显示给用户)和 versionCode,后者是一个整数,每次上传到 Play Console 都必须递增。您可以在 Xcode 的 General 选项卡和 build.gradle 中设置它们,或者在 Cloud Builder 的对应字段中设置。让两个平台上面向用户的版本号保持一致,并使用 major.minor.patch 格式;这样客服沟通(“您用的是哪个版本?”)就会轻松很多。
您的 Web 应用有自己的发布节奏,两者可能在一个重要方面脱节:一个需要原生能力的 Web 功能(比如新的扫码流程),在启用该能力之前构建的应用版本中无法运行。WebViewGold 的 App Version Check API 解决了这个问题:跳转到 getappversion://,应用就会设置 window.versionNumber 和 window.bundleNumber(或者把 autoInjectVariable / AUTO_INJECT_VARIABLES 设为 true,让它们在每个页面上自动注入)。这样,您的 Web 应用就可以为旧版安装隐藏该功能,或显示一个更新横幅。文档:App Version Check(iOS)和Android。
在应用内的每次页面加载时运行。与支持当前 Web 应用的最低版本进行比较。
const inApp = /WebViewGoldApp/.test(navigator.userAgent);
const MIN_APP_VERSION = "1.3.0";
function olderThan(a, b) { // "1.2.9" < "1.3.0"
const pa = a.split(".").map(Number), pb = b.split(".").map(Number);
for (let i = 0; i < 3; i++) { if ((pa[i] || 0) !== (pb[i] || 0)) return (pa[i] || 0) < (pb[i] || 0); }
return false;
}
if (inApp) {
window.location.href = "getappversion://"; // WebViewGold 会设置 window.versionNumber
setTimeout(() => {
if (window.versionNumber && olderThan(String(window.versionNumber), MIN_APP_VERSION)) {
document.getElementById("update-banner").hidden = false; // “有新版本可用”+ 商店链接
}
}, 800);
}
我很高兴购买了这个应用!非常简单,文档也很棒。联系客服后,他们回复很快且非常友好,一天之内就解决了我的问题。10/10,值得推荐。
大约一小时的工作,再加上审核时间。只要上表中某一行写着“商店更新”,就按此执行。
下载当前版本(更新免费),然后把您的 Config.swift 和 Config.java 设置值、图标、启动画面、GoogleService-Info.plist 或 google-services.json 以及所有自定义权限说明复制过去。您的 Android keystore 和上传密钥保持不变。Cloud Builder 用户可以跳过这一步:该服务使用持续维护的模板进行构建。
版本 1.2.0 → 1.3.0,构建号 +1,versionCode +1。
Xcode → Product → Archive → Distribute 到 App Store Connect;Android Studio → Build → Generate Signed Bundle → 上传到 Play Console。或者在 Cloud Builder 中一键完成两者。
TestFlight 内部测试和 Play 内部测试轨道:登录、推送权限、离线页面、来自邮件的深度链接;如果您有付费内容,再在沙盒中完成一次购买。在真机上花十五分钟即可;参见测试指南。
Apple:选择分阶段发布(七天内比例自动递增,可随时暂停),或在获批后手动发布。Google:分阶段发布,从 10% 到 20% 开始,在几天内逐步提高;如果 Play Vitals 显示崩溃激增,就暂停发布。
App Store Connect 中的崩溃和评论、Play Console 的 Vitals 以及政策邮件。在原生构建逐步推送期间,Web 端的修复依然即时生效。
splashTimeout 或启用 remainSplashOption。新应用和更新必须在 Google 每年规定的截止日期前,以较新的 Android 版本为目标。过了这个日期,旧模板就无法上传;目标 API 级别指南解释了时间安排。
上传的构建必须使用较新的 Xcode 和 iOS SDK 构建,而且 iOS 应用现在需要附带隐私清单。模板更新两者都包含。
更新会添加新的 API(文档扫描、健康数据、小组件),每一个都只需一个链接就能开放给您的 Web 应用。
即使没有任何变更,每年用最新模板重新构建一次,也能让应用保持可发布状态,并让“更新”日期保持新鲜,有利于 ASO。
不会。只有提交新构建或修改商店详情元数据时才会审核。Web 应用中的内容由您随意更改,只要应用始终与其商店详情页和准则相符即可。
为满足平台要求,至少每年一次;此外,每当您更改图标、原生功能或权限时也要重新构建。许多团队最终会固定为每一到两个月发布一次商店更新。
无法真正强制,但当后端变更需要时,版本检查可以让您用一条附带商店链接的提示把旧版应用挡在外面。
不会。除非启用了 Config 文件中的清除缓存选项,否则 Cookie 和 localStorage 在更新后都会保留。
结果相同,只是您需要投入的工作量不同。三种方式都附带审核通过保证和 7×24 小时人工支持。
$109 每个平台,一次性付费
WebViewGold 许可证:一个现成的 Xcode 或 Android Studio 项目。粘贴您的 URL,设置名称和图标,开启所需功能,构建并提交。永久免费更新。
在主页查看方案$349 每个许可证,一次性附加购买
无需 Mac、Xcode 或 Android Studio:在浏览器中完成配置,我们在云端构建两个应用,并将其交付到 App Store Connect 和 Play Console。
Cloud Builder 如何运作 试用免费演示$698 每个平台 $798
把您的 URL 和图标发给我们。我们的团队在 72 小时内完成配置、构建并交付您的应用,白标,附源码项目。两个平台共 $1,158。
Full Service 详情 服务提供方:冬季特惠价格有效期至 2026年12月31日。
App Store & Google Play 审核通过保证 – 否则 14 天内退款
想直接交给我们?Full Service:我们在 72 小时内完成配置、构建并交付,每个平台 $698 起。有疑问?通过 7×24 小时在线聊天联系我们。
退款依据我们 FAQ 中列出的条件:应用因非内容原因被 Apple 和/或 Google 拒审,并在购买后 14 天内提出申请。