El aviso de permisos en el primer arranque
Con askforpushpermissionatfirstrun en true, iOS pregunta antes de que los usuarios hayan visto nada. Quien toca Permitir acepta las notificaciones, no el marketing.
Rechazo en App Store
Apple solo permite notificaciones push de marketing cuando los usuarios las aceptan de forma explícita mediante un texto de consentimiento en tu app, y solo si pueden darse de baja dentro de la app. El diálogo de permisos de iOS no es ese consentimiento. Aquí verás cómo separar el push transaccional del de marketing, recoger el consentimiento en tu app web y conectarlo a la configuración de push de WebViewGold.
Desde $109 de pago único por plataforma, o deja que nuestro equipo lo haga todo desde $698.
La Directriz 4.5.4 fija cuatro reglas para las notificaciones push. La app debe funcionar sin ellas. No deben contener información personal sensible ni confidencial. No deben usarse para promociones ni marketing directo salvo que el usuario lo haya aceptado de forma explícita mediante un texto de consentimiento mostrado en la interfaz de tu app. Y la app debe ofrecer una forma de darse de baja de esos mensajes. Apple añade que el abuso puede costarte los privilegios de push.
Fíjate en lo que no se exige: los mensajes que el usuario espera, como "tu pedido se ha enviado" o "tienes una respuesta nueva", no necesitan más consentimiento que el permiso del sistema. La aceptación se refiere específicamente a promociones y marketing. La visión general de las notificaciones push cubre la configuración general.
Los revisores suelen decir que la app usa, o parece tener previsto usar, notificaciones push con fines promocionales sin consentimiento explícito, o que no hay forma de darse de baja en la app. Lo detectan en la descripción ("recibe ofertas exclusivas por push"), en una pantalla de bienvenida que promete ofertas o en una notificación de prueba. Una segunda variante dice que la app obliga a permitir las notificaciones antes de poder continuar, lo que choca con la primera frase de la 4.5.4.
Con askforpushpermissionatfirstrun en true, iOS pregunta antes de que los usuarios hayan visto nada. Quien toca Permitir acepta las notificaciones, no el marketing.
Los onboardings generados por IA suelen bloquear el siguiente paso hasta que se concede el permiso. Eso convierte el push en obligatorio, y la 4.5.4 no lo permite.
El ejemplo de push local de la documentación de WebViewGold es un recordatorio de carrito con sendlocalpushmsg://. Útil, pero promocional: envíalo solo a usuarios que aceptaron el marketing.
firebaseTopic en Config.swift suscribe la app a un único tema de Firebase, así que todas las instalaciones con push de Firebase están en él. Bien para avisos de servicio; usarlo para promociones envía marketing a personas que nunca lo aceptaron.
A las descripciones y pantallas de bienvenida escritas por una IA les encanta "no te pierdas ninguna oferta especial". Los revisores lo leen como un plan de marketing sin consentimiento.

¡Gran trabajo! Nunca tuve que usar código para nada, pero logré trabajar con esto y tener mi App lista. ¡Fácil y rápido! ¡También con gran ayuda de los creadores!
| Mensaje | Tipo | Necesita aceptar marketing |
|---|---|---|
| Tu pedido se ha enviado | Transaccional | No |
| Anna ha respondido a tu comentario | Actividad que sigue el usuario | No |
| Recordatorio que creó el usuario (entrenamiento a las 7:00) | Solicitado por el usuario | No |
| Alerta de precio que el usuario creó para un producto | Solicitado por el usuario | No |
| 20% de descuento este fin de semana | Promoción | Sí |
| Tu carrito te espera | Promoción | Sí |
| Te echamos de menos: vuelve y llévate un crédito gratis | Marketing de reactivación | Sí |
| Novedad: ya llegó el modo oscuro | Noticias del producto | Trátalo como marketing |
Funciona con OneSignal, Firebase y Pushwoosh; el consentimiento vive en tu propia base de datos.
Pon askforpushpermissionatfirstrun en false en Config.swift (en Android, requirePush en false en Config.java). La documentación de notificaciones push describe ambas opciones.
Tras el registro o la primera acción con sentido, explica qué vas a enviar. Ofrece dos opciones separadas: "Avisos de pedidos y de la cuenta" y "Ofertas y novedades". La opción de marketing está desactivada por defecto y lleva su propia frase de consentimiento.
Cuando el usuario active cualquiera de las dos opciones, navega a registerpush:// e iOS mostrará su diálogo de permisos en ese momento, con contexto. En Android, esto requiere al menos un servicio de push activado en Config.java.
Lee el ID de suscripción: getonesignalplayerid:// rellena onesignalplayerid, getfirebaseplayerid:// rellena firebaseplayerid y getpushwooshid:// rellena pushwooshplayerid. Para OneSignal y Firebase, autoInjectVariable en true inyecta el ID automáticamente. Guárdalo con las elecciones del usuario, la versión del texto de consentimiento y una marca de tiempo, y menciona los tokens de push en tu política de privacidad (guía de política de privacidad y etiquetas).
Tu backend selecciona los destinatarios desde la base de datos: la API de OneSignal puede dirigirse a IDs de suscripción concretos, y Firebase puede enviar a tokens individuales o a un tema al que tu servidor suscribe los tokens que aceptaron. No uses nunca el firebaseTopic compartido para promociones. La comparativa de proveedores de push explica las opciones de segmentación de cada servicio.
Un interruptor de "Ofertas y novedades" en tu página de ajustes que actualice la base de datos al instante. Muestra el estado del sistema con checkNativePushPermissions://, que establece nativePushEnabled, y enlaza a settingsapp:// para quien quiera desactivar todas las notificaciones (documentación de Open App Settings).
Programa los recordatorios de carrito o de reactivación con sendlocalpushmsg:// solo cuando el consentimiento de marketing sea true. Cuando un usuario se dé de baja, llama a sendlocalpushmsg://push.send.cancel; cancela todas las notificaciones locales programadas, así que vuelve a programar los recordatorios que pidió el usuario.
Una versión mínima para cualquier stack web; los nombres de los endpoints son marcadores para tu propio backend. ¿Lo creaste con Lovable? La guía de notificaciones push para Lovable cubre la configuración del proveedor alrededor de esto.
// Pantalla de notificaciones tras el registro (Config.swift: askforpushpermissionatfirstrun = false)
var CONSENT_TEXT_V2 = "Envíame ofertas y novedades por notificación push. Puedo desactivarlo cuando quiera en Ajustes.";
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 salvo que el usuario lo active
marketing_consent_text: offers ? CONSENT_TEXT_V2 : null,
marketing_consent_at: offers ? new Date().toISOString() : null
})
});
if (updates || offers) {
window.location.href = "registerpush://"; // diálogo de permisos de iOS, con contexto
}
}
// En cargas de página posteriores: guarda el ID de push cuando exista (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 }) });
}
// Página de ajustes: interruptor de baja
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"; // borra TODOS los recordatorios locales programados
}
}Describe el flujo de consentimiento paso a paso y dile al revisor exactamente dónde está la baja. La plantilla se queda en inglés porque App Review lee en inglés.
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 está en false; el diálogo de permisos aparece después de que el usuario haya visto el valor de la app.firebaseTopic no se usa para promociones.No. El diálogo del sistema pide permiso para mostrar notificaciones en general. Apple quiere el consentimiento de marketing en tu propia interfaz, con un texto que diga que se enviarán mensajes promocionales, más una forma de darse de baja dentro de la app.
La Directriz 4.5.4 habla de notificaciones push, pero una notificación local promocional se ve igual para los usuarios y para los revisores. Trata los recordatorios de carrito y de reactivación como push de marketing y envíalos solo con consentimiento.
Envíales solo mensajes transaccionales hasta que acepten el marketing. Muestra la nueva pantalla de notificaciones una vez después de la actualización, o añade una nota breve en los ajustes que explique la nueva opción "Ofertas y novedades".
La app tiene que seguir funcionando sin ellas. Explica con claridad qué se perderá el usuario, ofrece un enlace a los ajustes y déjale continuar.
En la UE, los mensajes de marketing suelen necesitar consentimiento también según las normas de protección de datos y de comunicaciones comerciales electrónicas. La misma pantalla de aceptación, guardada con una marca de tiempo y el texto de consentimiento, ayuda con ambas cosas. Si el marketing es clave para tu negocio, consulta tu caso concreto con un abogado.
El mismo resultado, con distinta cantidad de trabajo por tu parte. Las tres incluyen la garantía de aprobación y soporte humano 24/7.
$109 por plataforma, pago único
La licencia de WebViewGold: un proyecto de Xcode o Android Studio listo para usar. Pega tu URL, define nombre e icono, activa funciones, compila y envía. Actualizaciones gratuitas para siempre.
Ver planes en la página principal$349 por licencia, complemento de pago único
Sin Mac, sin Xcode, sin Android Studio: configura en el navegador, compilamos ambas apps en la nube y las entregamos a App Store Connect y a Play Console.
Cómo funciona el Cloud Builder Prueba la demo gratuita$698 por plataforma $798
Envíanos tu URL y tu icono. Nuestro equipo configura, compila y entrega tu app en 72 horas, en marca blanca y con los proyectos fuente. Ambas plataformas por $1,158.
Detalles del Full Service Con tecnología dePrecios de la Oferta de invierno válidos hasta el 31 de diciembre de 2026.
Garantía de aprobación en App Store & Google Play – o te devolvemos el dinero en 14 días
¿Prefieres delegarlo? Full Service: configuramos, compilamos y entregamos en 72 horas, desde $698 por plataforma. ¿Preguntas? Chatea con nosotros 24/7.
Los reembolsos se conceden bajo las condiciones indicadas en nuestras FAQ: un rechazo por motivos ajenos al contenido por parte de Apple y/o Google, reclamado dentro de los 14 días posteriores a la compra.