Restablecer la configuración de notificaciones push para la aplicación

173

Estoy desarrollando una aplicación con notificaciones push. Para verificar todas las formas posibles de interacción del usuario, me gustaría probar mi aplicación cuando un usuario decida tener habilitadas las notificaciones automáticas para mi aplicación durante el primer inicio.

registerForRemoteNotificationTypesSin embargo, el diálogo (iniciado por ) aparece solo una vez por aplicación. ¿Cómo restablezco la memoria de mi aplicación en el iPhone OS? Eliminar la aplicación y reinstalar no ayuda.

hanno
fuente

Respuestas:

300

Nota técnica TN2265: Solución de problemas de notificaciones push

La primera vez que una aplicación habilitada para push se registra para recibir notificaciones push, iOS le pregunta al usuario si desea recibir notificaciones para esa aplicación. Una vez que el usuario ha respondido a esta alerta, no se vuelve a presentar a menos que el dispositivo se restaure o la aplicación se haya desinstalado durante al menos un día.

Si desea simular una primera ejecución de su aplicación, puede dejar la aplicación desinstalada por un día. Puede lograr esto último sin esperar realmente un día al adelantar el reloj del sistema un día o más, apagar el dispositivo por completo y luego volver a encenderlo.

Actualizar: como se señala en los comentarios a continuación, esta solución dejó de funcionar desde iOS 5.1. Le recomendaría que presente un error en Apple para que puedan actualizar su documentación. La solución actual parece ser restablecer el contenido y la configuración del dispositivo.

Actualización: la nota técnica se ha actualizado con nuevos pasos que funcionan correctamente a partir de iOS 7.

  1. Elimina tu aplicación del dispositivo.
  2. Apague el dispositivo por completo y vuelva a encenderlo.
  3. Vaya a Configuración> General> Fecha y hora y configure la fecha un día o más.
  4. Apague el dispositivo completamente de nuevo y vuelva a encenderlo.

ACTUALIZACIÓN a partir de iOS 9

Simplemente eliminar y reinstalar la aplicación restablecerá el estado de notificación notDetermined(lo que significa que aparecerán avisos).

Gracias a la respuesta de Gomfucius a continuación: https://stackoverflow.com/a/33247900/704803

ianolito
fuente
16
¿Alguien ha probado esto con iOS 5.1? He seguido estos pasos exactamente y todavía no puedo hacer que el dispositivo lo reinicie ... Incluso he intentado adelantar el reloj de mi Mac antes de instalarlo a través de Xcode.
nrj
1
Lo mismo ... no recibí un aviso.
Rob
2
Apple agregó un nuevo requisito a las pautas de envío de AppStore, que se basa en la aplicación para mostrar el aviso. Esto puede sugerir que la solicitud automática se ha eliminado en iOS 5.1. Sin embargo, no hay una API para consultar la configuración del centro de notificaciones, por lo que no estoy seguro de cuál sería el propósito de la solicitud de todos modos. Vea mi respuesta a un problema similar: stackoverflow.com/questions/10191006/…
Greg
10
Esto es ridículo. ¿No se da cuenta Apple de que los desarrolladores o incluso los usuarios pueden querer restablecer estas cosas sin usar una solución alternativa realmente mala?
sudo
2
Cuando intento esto en el simulador, obtengo el error Código = 3010 "las notificaciones remotas no son compatibles con el simulador"
Thomas Zimmer
48

Otra solución para probar esto es simplemente cambiando su ID de paquete. ¡Solo no olvides cambiarlo una vez que hayas terminado!

capikaw
fuente
12
¿No necesita también crear un certificado para la nueva identificación de la aplicación para probarla?
Tony
1
Esto solo funcionaría si está utilizando perfiles de aprovisionamiento basados ​​en comodines; de lo contrario, necesitaría crear un perfil para el nuevo paquete.
Zorayr
Incluso si necesita crear un nuevo perfil, eso es simplemente hacer clic en el botón "Solucionarlo" y esperar unos segundos, mucho más rápido que pasar por todos esos ciclos de reinicio.
Ilya
¡Esta es la solución más rápida! Funciona bastante bien para mí ! Al cambiar su bundle_id, no podrá firmar la aplicación con los mismos "perfiles de aprovisionamiento". Pero no se preocupe, en xCode (mi versión 7.1.1), puede hacer clic en "arreglarlo" y hace el trabajo. Además, no olvide el onglet "Capacidades", donde puede tener varios elementos para "arreglar" (haciendo clic en el botón "arreglarlo") y luego, ¡funcionará muy bien!
Dam Fa
Esta respuesta es una opción legítima, pero sigue siendo un truco para una situación tonta de Apple. No estoy modificando el bundleID ni cambiando el reloj del dispositivo. Del mismo modo, cualquier desarrollador podría escribir un código corto que muestre un UIAlertView que pregunte "¿Permitir notificaciones push?" .. Sí = llamar al método de registro; No = llame a didFailToRegisterForRemoteNotificationsWithError (etc.). Esa es mi propia solución, mi para llevar después de leer estas preguntas y respuestas. Técnicamente, es la mejor manera, dar a los usuarios conocimiento de la información de privacidad ... POR QUÉ push debe estar habilitado u opcional.
Tom Pace
36

En iOS 9.0.2, recibo la "alerta de notificación push de registro" cada vez que elimino la aplicación y la reinstalo. Esto es cierto tanto para las descargas de producción de AppStore como para el modo adhoc.

ACTUALIZACIÓN: se confirma que esto funciona para iOS 9.x

Genki
fuente
1
Experimento el mismo comportamiento para iOS 9.x. Le recomendaría que edite la respuesta original agregando una ACTUALIZACIÓN:
Yevhen Dubinin
3
¡Finalmente! No más eliminar la aplicación, apagar el dispositivo, configurar el reloj para adelantar el tiempo y algunas cosas tontas como esta.
mkeremkeskin
19

Como ya se señaló, el enfoque para restablecer el estado de notificación para una aplicación en un dispositivo se cambia para iOS5 en adelante.

Esto funciona para mí en iOS6:

  • Eliminar la aplicación del dispositivo
  • Configure la fecha y hora del dispositivo con dos días o más de anticipación
  • Reiniciar el dispositivo
  • Configure la fecha y hora del dispositivo con dos días o más de anticipación
  • Reiniciar el dispositivo
  • Instala y ejecuta la aplicación nuevamente

Sin embargo, esto solo hará que aparezca el mensaje inicial nuevamente; no eliminará ningún otro elemento relacionado con el estado de inserción.

micmdk
fuente
También funcionó para mí en ios7, tienes que cambiar la fecha dos veces una vez que no funciona
Nath
1
¡Gracias! Esto incluso funciona en iOS 8 (tuve que restablecer los permisos push para Twitter.app, porque no tenía la configuración de "Insignias de íconos de aplicaciones" en su panel de preferencias en la Configuración).
gklka
9

El plist: /private/var/mobile/Library/RemoteNotification/Clients.plist

... contiene los clientes registrados para notificaciones push. Si eliminas la entrada de tu aplicación, aparecerá el mensaje.

Erik Johnson
fuente
11
respuesta inútil si desarrollas para la App Store
samvermette
20
Si esto es posible para los jailbreakers, los desarrolladores deberían poder hacerlo en un teléfono sin jailbreak, ¿verdad? Y NO es una respuesta inútil, porque esto no es algo que pondría en una aplicación para enviarla a la tienda. Es para que los desarrolladores hagan MIENTRAS PRUEBAS.
Oscar
1
Este archivo no es parte de iOS 5.x.
gmogames
Vea una respuesta actualizada como parte de esta pregunta: stackoverflow.com/questions/13021066/…
AriX
7

Hacerlo programáticamente parece funcionar para mí todo el tiempo. Tengo una compilación con la siguiente línea sin comentarios:

 [[UIApplication sharedApplication] unregisterForRemoteNotifications];

Lo ejecuto cada vez que quiero darme de baja de PN. Es posible que deba finalizar la aplicación explícitamente en la lista de recientes y jugar con el Centro de notificaciones en la aplicación Configuración para hacerlo bien.

Además, la solicitud de IU que le pide al usuario que se registre para PN puede no aparecer. No estoy seguro si se ha deshabilitado en alguna de las versiones recientes de iOS.

dagnytaggart
fuente
Me funcionó iOS 10 / iPhone 6S. Tenga en cuenta que no me registré, luego eliminé la aplicación antes de volver a instalarla.
Gabriel Jensen
5

Como dijo ianolito, establecer la fecha debería funcionar:

Puede lograr esto último sin esperar realmente un día al adelantar el reloj del sistema un día o más, apagar el dispositivo por completo y luego volver a encenderlo.

Noté en mi dispositivo (iPhone 4, iOS 6.1.2) que el reloj del sistema avanzaba un día o incluso unos pocos días no me funcionaban . Así que puse la fecha hacia adelante un mes y luego funcionó y mi aplicación mostró las notificaciones de nuevo.

Espero que esto ayude a cualquiera, ¡puede ser un poco doloroso!

Vincent Cohen
fuente
1
No responda con "Último sistema operativo": cambia todo el tiempo. Este comportamiento parece aún roto en 6.1.2, pero ¿tal vez funcionó en 6.0.1?
patr1ck
Editó la respuesta, todavía tengo esto en 6.1.2 sí y antes en 6.0.1 también. Solo funciona para mí si al menos configuro la fecha +1 mes.
Vincent Cohen
1
También había escuchado las 24 horas, así que lo probé y no funcionó con 2 días de anticipación. ¡Configúrelo como a 3 meses a partir de ahora y la ventana emergente de permisos apareció nuevamente! ¡Gracias!
marcshilling 01 de
Publicación anterior, pero me alegra ver que todavía es de ayuda. Buena suerte :)
Vincent Cohen
5

Estoy de acuerdo con micmdk ... Tenía una configuración de entorno de desarrollo con notificaciones push y necesitaba una forma de restablecer mi teléfono para que pareciera una instalación inicial ... y solo estos pasos precisos funcionaron para mí ... requiere DOS reinicios del dispositivo:

De APPLE TECH DOC:

Restablecimiento de la alerta de permisos de notificaciones push en iOS La primera vez que una aplicación habilitada para push se registra para recibir notificaciones push, iOS le pregunta al usuario si desea recibir notificaciones para esa aplicación. Una vez que el usuario ha respondido a esta alerta, no se vuelve a presentar a menos que el dispositivo se restaure o la aplicación se haya desinstalado durante al menos un día.

Si desea simular una primera ejecución de su aplicación, puede dejar la aplicación desinstalada por un día. Puede lograr esto último sin esperar realmente un día siguiendo estos pasos:

  1. Elimina tu aplicación del dispositivo.

  2. Apague el dispositivo por completo y vuelva a encenderlo.

  3. Vaya a Configuración> General> Fecha y hora y configure la fecha un día o más.

  4. Apague el dispositivo completamente de nuevo y vuelva a encenderlo.

lepert
fuente
Esto se ha mencionado como ya no funciona en otra respuesta.
Beau Nouvelle
Funciona bien Lo que dejó de funcionar en IOS 5.1 fue la antigua versión de esa otra respuesta, lo que dejó a cabo el reinicio entre borrar la aplicación y el ajuste del reloj por delante.
dgatwood
3

Me he preguntado sobre esto en el pasado y llegué a la conclusión de que en realidad no era un caso de prueba válido para mi código. No creo que el código de su aplicación pueda notar la diferencia entre alguien que rechaza las notificaciones la primera vez o más tarde deshabilitándolo de la configuración de notificaciones del iPhone. Es cierto que la experiencia del usuario es diferente, pero eso está oculto dentro de la llamada a registerForRemoteNotificationTypes.

Llamar a unregisterForRemoteNotifications no elimina completamente la aplicación de la configuración de notificaciones, aunque sí elimina el contenido de la configuración de esa aplicación. Por lo tanto, esto aún no hará que el diálogo se presente por segunda vez al usuario la próxima vez que se ejecute la aplicación (al menos no en la v3.1.3 con la que estoy probando actualmente). Pero como digo más arriba, probablemente no deberías preocuparte por eso.

kharrison
fuente
Esperaba una mejor respuesta, pero supongo que simplemente no la hay. ¡Gracias de cualquier manera!
Hanno
3

La misma nota técnica a la que se hace referencia en la respuesta aceptada ( TN2265 - Solución de problemas de notificaciones push) se ha actualizado con una solución para iOS 5 y superior.

En resumen: cree una copia de seguridad y restaure desde allí cada vez.

En iOS 5 y posterior, restablezca la alerta de permisos de notificaciones push restaurando el dispositivo desde una copia de seguridad (r. 11450187). Estos son los pasos para hacer esto de manera eficiente:

  1. Use Xcode Organizer para instalar su aplicación en el dispositivo. La clave es instalar la aplicación por primera vez sin ejecutarla.
  2. Use iTunes para hacer una copia de seguridad del dispositivo.
  3. Ejecuta la aplicación. Se presentará la alerta de permisos de notificaciones push.
  4. Cuando desee restablecer la alerta de permisos de notificaciones push, restaure el dispositivo desde la copia de seguridad que creó en el primer paso.
David Rönnqvist
fuente
Podría haberlo recomendado alguna vez, pero ya no lo hace. La recomendación actual es eliminar la aplicación, reiniciar, configurar el reloj hacia adelante, reiniciar, opcionalmente configurar el reloj a la fecha y hora correctas, y ejecutar la aplicación.
dgatwood
2

La nota técnica de Apple también describe que puede restaurar el dispositivo para restablecer el cuadro de diálogo de notificación push.

No dice que también puede usar la opción "General -> Restablecer -> Borrar todo el contenido y la configuración" en el dispositivo (iOS 5.x).

Sr. Zystem
fuente
1
Por lo que vale: acabo de intentar 'borrar todas las configuraciones', y eso no funcionó. Probar todo el contenido y todas las configuraciones ...
Groxx
8
Y "todo el contenido y la configuración" realmente funciona, ¡gracias! ¡Pero sagrada opción nuclear, Batman! Eso es absolutamente una locura.
Groxx
94
¡Escuché que comprar un nuevo dispositivo también borra la advertencia de notificación push!
samvermette
Intenté comprar un nuevo dispositivo, pero tampoco funcionó. Después de llevar el nuevo dispositivo a la barra de genios, trabajaron un poco de magia y arreglaron por más dinero ... Me sorprende que después de tantos años Apple todavía no haya proporcionado una forma práctica y simple de restablecer los permisos de inserción. Es ridículo
Chris
1

Además de la respuesta de ianolito.

Tuve el mismo problema con una aplicación que descargué hace un año y negué inicialmente la notificación push. Ahora que quiero volver a recibir notificaciones push, estos pasos funcionaron para mí en iOS 7 beta. No estoy seguro de qué punto (s) lo activaron exactamente.

  • Cierra y elimina la aplicación.
  • Vaya a la configuración de iCloud y elimine la aplicación de iCloud. Haga esto en todos los demás dispositivos donde tenga habilitada la copia de seguridad de iCloud para aplicaciones. Después de desactivar y eliminar hacer una copia de seguridad nueva. La aplicación ya no debería aparecer en las copias de seguridad. (Esta es quizás la razón por la cual la Nota técnica de Apple descrita por ianolito dejó de funcionar en iOS 5, ya que iCloud se introdujo en iOS 5 y muchos tienen la copia de seguridad de iCloud para aplicaciones habilitada).
  • Vaya a su configuración de tiempo y establezca el tiempo con más de 1 mes de anticipación.
  • Apague el iPhone (sin reinicio).
  • Espere un minuto, enciéndalo nuevamente y descargue la aplicación nuevamente.
  • Inicie la aplicación y se me presentó el cuadro de diálogo nuevamente.
  • Habilite la copia de seguridad de la aplicación nuevamente, ya que todavía está desactivada. Corregir el tiempo.

Gracias a Dios no tuve que "Borrar todo el contenido y la configuración". Quizás ayude a alguien.

Masa
fuente
1

Recientemente me encontré con un problema similar con la aplicación react-native. La versión del iPhone OS era 13.1 Desinstalé la aplicación e intenté instalarla y noté que no se solicitaban los permisos de ubicación y notificación.

Al verificar la configuración, pude ver que mi aplicación estaba habilitada para la ubicación (desde la instalación anterior), sin embargo, no hubo una entrada correspondiente contra la notificación Intenté desinstalar y reiniciar sin configurar la hora, no funcionó. Por cierto, también intenté descargar la aplicación Appstore, que sigue siendo el mismo comportamiento.

El problema se resolvió solo después de configurar la hora del dispositivo.

RUppal
fuente
0

Después de horas de búsqueda, y sin suerte con las sugerencias anteriores, esto funcionó de maravilla para 3.x +

override func viewDidLoad() {
        super.viewDidLoad()


            requestAuthorization()

}

func requestAuthorization() {

        if #available(iOS 10.0, *) {

            UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { (granted, error) in
                print("Access granted: \(granted.description)")
            }

        } else {
            // Fallback on earlier versions
        }

    }
Felecia Genet
fuente