Estoy buscando una manera de determinar si el usuario, a través de la configuración, ha habilitado o deshabilitado sus notificaciones push para mi aplicación.
207
Estoy buscando una manera de determinar si el usuario, a través de la configuración, ha habilitado o deshabilitado sus notificaciones push para mi aplicación.
Llamada enabledRemoteNotificationsTypes
y revisa la máscara.
Por ejemplo:
UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
if (types == UIRemoteNotificationTypeNone)
// blah blah blah
iOS8 y superior:
[[UIApplication sharedApplication] isRegisteredForRemoteNotifications]
iOS 8
superiores es incorrecta porque solo se verifica si el usuario se registró para recibir notificaciones remotas. De acuerdo con la documentación:This method reflects only the successful completion of the remote registration process that begins when you call the registerForRemoteNotifications method. This method does not reflect whether remote notifications are actually available due to connectivity issues. The value returned by this method takes into account the user’s preferences for receiving remote notifications.
[[UIApplication sharedApplication] currentUserNotificationSettings];
problema de quantumpotato:
¿Dónde
types
está dado poruno puede usar
en vez de
le permitirá verificar solo si las notificaciones están habilitadas (y no se preocupe por los sonidos, las insignias, el centro de notificaciones, etc.). La primera línea de código (
types & UIRemoteNotificationTypeAlert
) volveráYES
si "Estilo de alerta" está configurado como "Banners" o "Alertas", yNO
si "Estilo de alerta" está configurado como "Ninguno", independientemente de otras configuraciones.fuente
grantedSettings.types.contains(notificationType)
En la última versión de iOS, este método ahora está en desuso. Para admitir el uso de iOS 7 y iOS 8:
fuente
UserNotifications
. No tengo una respuesta completa ahora, desafortunadamente.Código actualizado para swift4.0, iOS11
Código para swift3.0, iOS10
fuente
A continuación encontrará un ejemplo completo que cubre tanto iOS8 como iOS7 (y versiones inferiores). Tenga en cuenta que antes de iOS8 no puede distinguir entre "notificaciones remotas deshabilitadas" y "solo Ver en pantalla de bloqueo habilitada".
fuente
Swift 3+
Versión observable de RxSwift para iOS10 +:
fuente
getNotificationSettings(...)
es asíncrono, por lo que se ignorará el retorno en el interiorAl tratar de admitir tanto iOS8 como versiones anteriores, no tuve mucha suerte usando
isRegisteredForRemoteNotifications
como sugirió Kevin. En cambio, lo usécurrentUserNotificationSettings
, lo que funcionó muy bien en mis pruebas.fuente
isEnabled = NO;
en susif
casos no es necesario, ya que se ha inicializado comoNO
Desafortunadamente, ninguna de estas soluciones proporcionadas realmente resuelve el problema porque, al final del día, las API carecen seriamente cuando se trata de proporcionar la información pertinente. Puede hacer algunas conjeturas, sin embargo, usar
currentUserNotificationSettings
(iOS8 +) simplemente no es suficiente en su forma actual para responder realmente la pregunta. Aunque muchas de las soluciones aquí parecen sugerir que eso oisRegisteredForRemoteNotifications
es una respuesta más definitiva, realmente no lo es.Considera esto:
con
isRegisteredForRemoteNotifications
estados de documentación:Sin embargo, si agrega un
NSLog
delegado simplemente a su aplicación para observar el comportamiento, está claro que esto no se comporta de la manera que anticipamos que funcionará. En realidad, pertenece directamente a las notificaciones remotas que se han activado para esta aplicación / dispositivo. Una vez activado por primera vez, esto siempre volveráYES
. Incluso si se desactivan en la configuración (notificaciones), el resultado será queYES
esto se debe a que, a partir de iOS8, una aplicación puede registrarse para recibir notificaciones remotas e incluso enviarla a un dispositivo sin que el usuario tenga las notificaciones habilitadas, es posible que no hagan Alertas, Insignias y sonido sin que el usuario lo active. Las notificaciones silenciosas son un buen ejemplo de algo que puede seguir haciendo incluso con las notificaciones desactivadas.En la medida en
currentUserNotificationSettings
que indica una de cuatro cosas:Las alertas están activadas Las insignias están activadas El sonido está activado Ninguna activada.
Esto no le da absolutamente ninguna indicación sobre los otros factores o el cambio de notificación en sí.
De hecho, un usuario puede desactivar las insignias, el sonido y las alertas, pero aún así se muestra en la pantalla de bloqueo o en el centro de notificaciones. Este usuario aún debería recibir notificaciones automáticas y poder verlas tanto en la pantalla de bloqueo como en el centro de notificaciones. Tienen el interruptor de notificación activado. PERO
currentUserNotificationSettings
volverá:UIUserNotificationTypeNone
en ese caso. Esto no es realmente indicativo de la configuración real de los usuarios.Algunas conjeturas que uno puede hacer:
isRegisteredForRemoteNotifications
esNO
así, puede suponer que este dispositivo nunca se ha registrado correctamente para notificaciones remotas.application:didRegisterUserNotificationSettings:
contiene la configuración de notificación del usuario en este momento, ya que esta es la primera vez que se registra a un usuario, la configuración debe indicar lo que el usuario seleccionó en términos de la solicitud de permiso. Si la configuración equivale a otra cosa que no sea:UIUserNotificationTypeNone
se otorgó el permiso de inserción, de lo contrario, se rechazó. La razón de esto es que desde el momento en que comienza el proceso de registro remoto, el usuario solo tiene la capacidad de aceptar o rechazar, y la configuración inicial de una aceptación es la configuración que configura durante el proceso de registro.fuente
Para completar la respuesta, podría funcionar algo como esto ...
editar: Esto no está bien. Dado que estas son cosas de bits, no funcionará con un interruptor, así que terminé de usar esto:
fuente
Para iOS7 y anteriores, debe usar
enabledRemoteNotificationTypes
y verificar si es igual (o no igual, según lo que desee)UIRemoteNotificationTypeNone
.Sin embargo, para iOS8 no siempre es suficiente verificar solo con
isRegisteredForRemoteNotifications
tantos estados anteriores. ¡También debe verificar siapplication.currentUserNotificationSettings.types
es igual (o no es igual dependiendo de lo que desee)UIUserNotificationTypeNone
!isRegisteredForRemoteNotifications
podría regresar verdadero aunquecurrentUserNotificationSettings.types
regreseUIUserNotificationTypeNone
.fuente
fuente
Aquí obtenemos el UIRemoteNotificationType de UIApplication. Representa el estado de las notificaciones automáticas de esta aplicación en la configuración, de lo que puede verificar su tipo fácilmente
fuente
Intento admitir iOS 10 y superior utilizando la solución proporcionada por @Shaheen Ghiassy pero encuentro un problema de privación
enabledRemoteNotificationTypes
. Entonces, la solución que encuentro usando enisRegisteredForRemoteNotifications
lugar de laenabledRemoteNotificationTypes
que se desactivó en iOS 8. A continuación se muestra mi solución actualizada que funcionó perfectamente para mí:Y podemos llamar a esta función fácilmente y acceder a su
Bool
valor y podemos convertirlo en el valor de cadena de esta manera:Espero que ayude a otros también :) Feliz codificación.
fuente
Aunque la respuesta de Zac fue perfectamente correcta hasta iOS 7, ha cambiado desde que llegó iOS 8. Debido a que enabledRemoteNotificationTypes ha quedado en desuso desde iOS 8 en adelante. Para iOS 8 y versiones posteriores, debe usar isRegisteredForRemoteNotifications .
fuente
Esta solución Swifty funcionó bien para mí ( iOS8 + ),
Método :
Uso :
Árbitro
fuente
re:
esto es correcto
¡pero seguir también es correcto! (como UIRemoteNotificationTypeNone es 0)
ver lo siguiente
fuente
Aquí se explica cómo hacerlo en Xamarin.ios.
Si es compatible con iOS 10+, solo use el método UNUserNotificationCenter.
fuente
En Xamarin, toda la solución anterior no funciona para mí. Esto es lo que uso en su lugar:
Recibirá una actualización en vivo también después de que haya cambiado el estado de la notificación en Configuración.
fuente
Código completo de copiar y pegar fácil creado a partir de la solución de @ ZacBowling ( https://stackoverflow.com/a/1535427/2298002 )
esto también llevará al usuario a la configuración de su aplicación y le permitirá habilitarlo de inmediato
También agregué una solución para verificar si los servicios de ubicación están habilitados (y también la configuración)
GLHF!
fuente