首次启动时的权限提示
当 askforpushpermissionatfirstrun 设为 true 时,iOS 会在用户还没看到任何内容之前就发出询问。点按“允许”的用户同意的是接收通知,而不是接收营销。
App Store 审核被拒
Apple 只允许在用户通过应用内的同意文案明确选择加入之后发送营销推送通知,并且用户必须能在应用内退订。iOS 的权限对话框并不等于这种同意。下面介绍如何区分事务类推送和营销推送、在 Web 应用中收集同意,并把它接入 WebViewGold 的推送设置。
每个平台一次性 $109 起,或由我们的团队全程代劳,$698 起。
准则 4.5.4 为推送通知定了四条规则。应用在没有推送的情况下也必须能正常使用。推送不应包含敏感的个人信息或机密信息。除非用户通过您应用界面中显示的同意文案明确选择加入,否则不应将推送用于促销或直接营销。此外,应用必须提供退订这类消息的方式。Apple 还补充说,滥用可能导致您失去推送权限。
请注意哪些是不需要的:用户预期中的消息,例如“您的订单已发货”或“您有一条新回复”,除了系统权限之外不需要额外的同意。选择加入专门针对的是促销和营销。一般性的设置请参阅推送通知概览。
审核人员通常会说,应用在未获得明确同意的情况下将推送通知用于(或看起来打算用于)促销目的,或者应用内没有退订方式。他们会在描述(“通过推送获取专属优惠”)、承诺提供优惠的引导页面,或者某条测试通知中发现这一点。第二种变体是说应用要求用户必须允许通知才能继续,这与 4.5.4 的第一句相冲突。
当 askforpushpermissionatfirstrun 设为 true 时,iOS 会在用户还没看到任何内容之前就发出询问。点按“允许”的用户同意的是接收通知,而不是接收营销。
AI 生成的引导流程经常在用户授予权限之前阻止其进入下一步。这让推送变成了必需项,而 4.5.4 不允许这样做。
WebViewGold 文档中的本地推送示例,是通过 sendlocalpushmsg:// 发送的购物车提醒。它很有用,但属于促销:只发给选择接收营销消息的用户。
Config.swift 中的 firebaseTopic 会让应用订阅一个 Firebase 主题,因此每个启用 Firebase 推送的安装都在其中。用于服务通知没有问题;用于促销,就会把营销内容发给从未选择加入的人。
AI 写的描述和引导页面特别喜欢“绝不错过任何特别优惠”。审核人员会把它理解为一个未经同意的营销计划。

出色的工作!无需任何编码就能轻松完成。简单快捷!创作者也提供了大力帮助!
| 消息 | 类型 | 是否需要营销同意 |
|---|---|---|
| 您的订单已发货 | 事务类 | 否 |
| Anna 回复了您的评论 | 用户关注的动态 | 否 |
| 用户自己设置的提醒(7:00 健身) | 用户主动请求 | 否 |
| 用户为某商品创建的价格提醒 | 用户主动请求 | 否 |
| 本周末八折 | 促销 | 是 |
| 您的购物车还在等您 | 促销 | 是 |
| 好久不见,回来领一份免费积分 | 召回营销 | 是 |
| 新功能:深色模式上线了 | 产品资讯 | 按营销处理 |
适用于 OneSignal、Firebase 和 Pushwoosh;同意记录保存在您自己的数据库中。
在 Config.swift 中把 askforpushpermissionatfirstrun 设为 false(Android 上则在 Config.java 中把 requirePush 设为 false)。推送通知文档介绍了这两个选项。
在用户注册之后或完成第一个有意义的操作之后,说明您会发送什么。提供两个独立的选项:“订单和账号动态”以及“优惠和资讯”。营销选项默认关闭,并配有单独的同意说明。
当用户打开任一选项时,跳转到 registerpush://,iOS 会在此时此地、结合上下文显示权限对话框。在 Android 上,这需要在 Config.java 中至少启用一个推送服务。
读取订阅 ID:getonesignalplayerid:// 会填充 onesignalplayerid,getfirebaseplayerid:// 会填充 firebaseplayerid,getpushwooshid:// 会填充 pushwooshplayerid。对于 OneSignal 和 Firebase,把 autoInjectVariable 设为 true 即可自动注入 ID。把它与用户的选择、同意文案的版本以及时间戳一起保存,并在隐私政策中提及推送 token(隐私政策与隐私标签指南)。
由您的后端从数据库中筛选收件人:OneSignal 的 API 可以定向到特定的订阅 ID,Firebase 可以发送给单个 token,或者发送给一个由您的服务器把已同意用户的 token 订阅进去的主题。绝不要用共享的 firebaseTopic 做促销。推送服务商对比解释了每种服务的定向选项。
在设置页面中放一个“优惠和资讯”开关,切换后立即更新数据库。用 checkNativePushPermissions:// 显示系统状态,它会设置 nativePushEnabled;并为想关闭所有通知的用户提供指向 settingsapp:// 的链接(打开应用设置文档)。
只有在营销同意为 true 时,才用 sendlocalpushmsg:// 安排购物车或召回提醒。当用户退订时,调用 sendlocalpushmsg://push.send.cancel;它会取消所有已安排的本地通知,所以请重新安排用户自己要求的那些提醒。
适用于任何 Web 技术栈的精简版本;接口名称只是占位符,请换成您自己的后端。用 Lovable 构建?Lovable 推送通知指南介绍了与之配套的推送服务商设置。
// 注册后的通知页面(Config.swift: askforpushpermissionatfirstrun = false)
var CONSENT_TEXT_V2 = "通过推送通知向我发送优惠和资讯。我可以随时在设置中关闭。";
async function saveNotificationChoices(updates, offers) {
await fetch("/api/me/notification-prefs", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
transactional: updates,
marketing: offers, // 除非用户主动打开,否则为 false
marketing_consent_text: offers ? CONSENT_TEXT_V2 : null,
marketing_consent_at: offers ? new Date().toISOString() : null
})
});
if (updates || offers) {
window.location.href = "registerpush://"; // 结合上下文弹出 iOS 权限对话框
}
}
// 之后的页面加载:推送 ID 一旦存在就保存(autoInjectVariable = true)
if (typeof onesignalplayerid !== "undefined" && onesignalplayerid) {
fetch("/api/me/push-id", { method: "POST", headers: { "Content-Type": "application/json" },
body: JSON.stringify({ provider: "onesignal", id: onesignalplayerid }) });
}
// 设置页面:退订开关
async function setOffers(enabled) {
await fetch("/api/me/notification-prefs", { method: "PATCH", headers: { "Content-Type": "application/json" },
body: JSON.stringify({ marketing: enabled }) });
if (!enabled) {
window.location.href = "sendlocalpushmsg://push.send.cancel"; // 会清除所有已安排的本地提醒
}
}逐步描述同意流程,并准确告诉审核人员退订选项在哪里。模板保留英文,因为 Apple 审核人员阅读的是英文。
Hello App Review team, Thank you for reviewing [App name] [version] ([build]). We changed how the app handles push notifications to comply with Guideline 4.5.4: 1. The app no longer asks for notification permission at launch, and every feature works when notifications are declined. 2. After sign-up, a notification screen offers two separate choices: "Order and account updates" and "Offers and news". The marketing option is off by default and shows this consent text: "[consent sentence]". 3. Only users who switch on "Offers and news" receive promotional notifications. Promotional local reminders are also sent only with this consent. 4. Users can opt out at any time in [Settings > Notifications > Offers and news]. The same screen links to the iOS notification settings. To verify: log in with the demo account from App Review Information and open [Settings > Notifications]. [New build: [number].] Best regards, [Name], [email]
askforpushpermissionatfirstrun 为 false;权限对话框在用户已经感受到应用价值之后才出现。firebaseTopic 不用于促销。不算。系统对话框询问的只是是否允许显示通知。Apple 要求在您自己的界面中获取营销同意,措辞要说明会发送促销消息,并在应用内提供退订方式。
准则 4.5.4 说的是推送通知,但在用户和审核人员看来,促销类本地通知与推送并无二致。请把购物车和召回提醒当作营销推送处理,只在获得同意后发送。
在他们选择加入之前,只给他们发送事务类消息。更新后显示一次新的通知页面,或者在设置中添加一段简短说明,介绍新的“优惠和资讯”选项。
应用仍然必须在没有通知的情况下也能使用。清楚说明用户会错过什么,提供指向设置的链接,然后让他们继续。
在欧盟,依据数据保护和电子营销相关规定,营销消息通常也需要获得同意。同一个选择加入页面,连同时间戳和同意文案一起保存,可以同时满足两方面的要求。如果营销是您业务的核心,请就您的具体情况咨询律师。
结果相同,只是您需要投入的工作量不同。三种方式都附带审核通过保证和 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 天内提出申请。