Permisos de servicios en primer plano en Google Play: completa la declaración o elimina el servicio
Desde Android 14, cada servicio en primer plano tiene un tipo declarado, y Google pide a las apps que se dirigen a Android 14 o posterior que justifiquen cada tipo en la Play Console con una descripción y un vídeo. Una app web empaquetada típica no necesita ningún servicio en primer plano. Si aparece uno en tu bundle, averigua de dónde viene y después quítalo o decláralo con un vídeo que coincida con el caso de uso.
Desde $109 de pago único por plataforma, o deja que nuestro equipo lo haga todo desde $698.
Garantía de aprobación – o te devolvemos el dinero en 14 días
Sin programar
Pago único, actualizaciones gratuitas
Soporte humano 24/7
Hecho en Alemania desde 2014 · ISO 27001
9:41
Tu app
Tu appYa en tu bolsillo
App Store · Google Play Aprobada
Qué cambió con Android 14 y qué revisa Google
Un servicio en primer plano es un trabajo que una app sigue haciendo mientras el usuario está en otra parte, con una notificación persistente que lo hace visible: reproducir música, la navegación, la grabación de un entrenamiento, una llamada. Desde Android 14, cada servicio en primer plano debe declarar un tipo (location, mediaPlayback, dataSync, camera, microphone, health, phoneCall y algunos más) y la app debe tener el permiso FOREGROUND_SERVICE_* correspondiente. Algunos tipos necesitan además el permiso de tiempo de ejecución subyacente, como el acceso a la ubicación para el tipo location.
Google Play añade encima un paso de revisión. Las apps que se dirigen a Android 14 o posterior y usan servicios en primer plano completan la declaración de servicios en primer plano en la página App content (Contenido de la aplicación). Para cada tipo describes la función que lo usa, explicas el impacto para el usuario si el sistema aplazara o interrumpiera la tarea, eliges el caso de uso correspondiente de una lista y enlazas un vídeo que muestre los pasos que sigue un usuario para activar la función. Los requisitos de Google para los servicios en primer plano describen el formulario. La expectativa de fondo: el usuario inició la tarea o la percibe con claridad, y la tarea no puede simplemente esperar a más tarde.
Cómo se redacta el rechazo
Hay dos situaciones típicas. Antes de la revisión, la subida o la versión queda bloqueada hasta que indicas si la app usa permisos de servicios en primer plano y declaras cada tipo que usa. Después de la revisión, se rechaza la declaración: el vídeo no muestra la función, el caso de uso seleccionado no coincide con lo que muestra el vídeo o el tipo no está justificado para lo que hace la app. Los desarrolladores que siguen subiendo el mismo tipo de vídeo cuentan que se quedan atrapados en un bucle. La salida es corregir el desajuste entre función, caso de uso y vídeo, o eliminar el servicio.
Tipos de servicio en primer plano que puedes encontrar en una app empaquetada
Tipo y permiso
Origen típico
Qué hacer
location / FOREGROUND_SERVICE_LOCATION
El GPSService de WebViewGold para el seguimiento en segundo plano (requireBackgroundLocation)
Consérvalo solo para un seguimiento iniciado por el usuario que sea el núcleo de la app; si no, vuelve a comentar los bloques
mediaPlayback / FOREGROUND_SERVICE_MEDIA_PLAYBACK
Una biblioteca de audio o multimedia
Consérvalo solo si reproducir audio con la pantalla apagada es una función principal
dataSync / FOREGROUND_SERVICE_DATA_SYNC
Bibliotecas de sincronización, copia de seguridad o subida
Normalmente, elimínalo; para las transferencias que pide el usuario, Google remite a los trabajos de transferencia de datos iniciados por el usuario
camera, microphone, phoneCall
SDK de videollamada o de voz
Solo para funciones de llamada reales
health / FOREGROUND_SERVICE_HEALTH
Bibliotecas de seguimiento de actividad física
Solo mientras el usuario graba activamente un entrenamiento
specialUse
Código propio, poco habitual
Necesita una justificación por escrito y se revisa; no es un atajo para esquivar un tipo que encaja
¡Una forma estupenda de convertir tu web app en una app nativa! Entrega rápida y una manera genial de llevar tus apps a las tiendas sin tener que desarrollar una app nativa completa.
Kevin Joling · FlightConnections & TrainConnections · Trustpilot
Primero limpia, después declara lo que quede
Una hora para la limpieza y un vídeo por cada tipo que conserves.
Enumera cada servicio y cada permiso
En Android Studio, abre AndroidManifest.xml, cambia a la pestaña Merged Manifest y busca foregroundServiceType y FOREGROUND_SERVICE. En la Play Console, el App bundle explorer (Explorador de app bundles) enumera los permisos que Google extrajo de tu bundle.
Hazte dos preguntas por entrada
¿Lo inicia un usuario y lo percibe el usuario mientras se ejecuta? Si ninguna de las dos se cumple en una función que tu app ofrezca de verdad, el servicio no debería estar en la app.
Quita lo que no necesites
Para el servicio de ubicación de WebViewGold, pon requireBackgroundLocation en false y comenta los bloques FOREGROUND_SERVICE_LOCATION y GPSService (consulta la documentación de geolocalización para Android). Si viene de una biblioteca, quita el permiso y su servicio con las reglas de abajo y después prueba la función que aporta esa biblioteca; eliminar un servicio al que la biblioteca sigue llamando puede hacer que se bloquee.
Graba un vídeo corto por cada tipo que quede
Graba la pantalla en un dispositivo real: abre la app, inicia sesión si hace falta, toca el control que inicia la función (por ejemplo un botón Iniciar seguimiento que llama a backgroundlocationon://), muestra la notificación persistente, sal de la app para que se vea que la tarea continúa y después detenla. Súbelo como vídeo no listado de YouTube.
Rellena la declaración
En la página App content, abre la declaración de servicios en primer plano y, para cada tipo, describe la función en una o dos frases, explica qué se rompe si la tarea se aplaza o se interrumpe, elige el caso de uso que coincide con el vídeo y pega el enlace.
Recompila y sustituye todos los canales
Version code más alto, bundle nuevo y sustitución de los bundles antiguos en los canales de prueba. Un tipo que hayas quitado no debería necesitar declaración una vez que ningún bundle activo lo contenga. La guía del target API level explica por qué aquí también importa recompilar desde la plantilla actual.
Eliminar un servicio en primer plano que añadió una biblioteca
Copia el nombre de clase exacto de la pestaña Merged Manifest; el de abajo es un marcador de posición. Después, prueba la función de la biblioteca.
xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<!-- Elimina un tipo de servicio en primer plano que la app no usa -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" tools:node="remove" />
<application>
<!-- Marcador de posición: usa el nombre de clase que aparece en la pestaña Merged Manifest -->
<service android:name="com.example.somelibrary.SyncForegroundService" tools:node="remove" />
</application>
</manifest>
Plantilla: respuestas de la declaración para un servicio de seguimiento de ubicación
Describe una función concreta, con las palabras que usaría un usuario, y haz que el vídeo muestre exactamente estos pasos. La plantilla se queda en inglés porque los revisores de Google la leen en inglés.
Para la declaración de servicios en primer plano, tipo location (adapta los corchetes)
Feature description: When a courier taps Start shift, [App name] starts a location foreground service that shares the courier's position with dispatch until the courier taps End shift. An ongoing notification is shown the whole time.
Impact if deferred or interrupted: Dispatch loses the courier's position during the delivery, customers see wrong arrival times, and orders cannot be reassigned when a courier is delayed. The task cannot be postponed, because the position is only useful in real time.
Use case: [the closest match from the list, for example user-initiated location sharing].
Video: [YouTube link], showing login with the test account from Sign-in details, Start shift, the ongoing notification, the app in the background with tracking active, and End shift.
The same feature is declared in the Location permissions declaration.
Preguntas frecuentes
Mi app no ejecuta nada en segundo plano. ¿Por qué la Play Console pregunta por servicios en primer plano?
Porque en tu bundle hay un permiso FOREGROUND_SERVICE o un servicio con tipo, normalmente aportado por una biblioteca o por un bloque de la plantilla que no necesitas. Búscalo en el manifiesto combinado y elimínalo; si no queda nada, la declaración deja de ser necesaria.
¿Las notificaciones push necesitan un servicio en primer plano?
No. OneSignal, Firebase Cloud Messaging y Pushwoosh entregan las notificaciones a través del sistema sin un servicio en primer plano en tu app, y los recordatorios locales programados tampoco son un caso de uso de servicio en primer plano.
¿Puedo elegir specialUse para saltarme el vídeo?
specialUse está pensado para tareas que ningún otro tipo cubre, y Google revisa la justificación escrita. Usarlo para algo que encaja claramente en otro tipo, como location o media playback, es buscarse un rechazo.
¿Qué hace que falle el vídeo de una declaración?
Empieza a mitad de la función, se salta la acción del usuario que inicia el servicio, muestra un flujo distinto del caso de uso seleccionado o no se puede abrir porque el enlace es privado. Hazlo corto, lineal y visible para cualquiera que tenga el enlace.
¿Puedo evitar la declaración dirigiéndome a una versión antigua de Android?
No. Google exige un target API level reciente para las apps nuevas y las actualizaciones, así que toda app actual se dirige a Android 14 o posterior y necesita la declaración siempre que use servicios en primer plano.
Tres formas de llevar tu app a las tiendas
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.
Hazlo tú mismo
$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.
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.
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.
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.