react que notification developer apple ios push-notification apple-push-notifications

ios - que - Cómo saber si ya se ha mostrado la alerta de permiso de notificación de inserción



push notifications ios react native (3)

Quiero implementar una pantalla personalizada que informe a mis usuarios por qué estoy a punto de solicitar permisos de notificación de inserción. Después de presionar un botón en esa pantalla personalizada, presento el diálogo de permiso de notificación push de iOS con [[UIApplication sharedApplication] registerForRemoteNotificationTypes:

Solo quiero mostrar esta pantalla personalizada una vez si el usuario no ha visto el cuadro de diálogo de permiso de notificación de inserción. No puedo usar [[UIApplication sharedApplication] enabledRemoteNotificationTypes] == UIRemoteNotificationTypeNone ya que esto también devolverá ''none'' si el usuario decidió no permitir las notificaciones push.

¿Alguna idea a alguien?


Esto es solo una alternativa, pero funcionará en la mayoría de los casos.

Cuando iOS solicita al usuario que permita las notificaciones push, se llama a applicationWillResignActive.

Después de llamar a registerForRemoteNotificationTypes ... inicie un temporizador (o dispatch_after) que mostrará una nueva alerta al usuario y le explicará que necesitará usar la aplicación Configuración para habilitar las notificaciones. Luego en applicationWillResignActive cancela el temporizador. De esta manera, la alerta de explicación solo se mostrará si nunca se llama a applicationWillResignActive.

El único problema que veo con esto es si la aplicación renuncia activa por otras razones en el momento exacto en que el temporizador está funcionando ... pero esto no te pone en una situación peor en la que ya estás y tiene la ventaja de trabajar en La mayoría de los casos.


La solución que he encontrado es un poco hack, pero funciona. Debe llamar a registerUserNotificationSettings para dos configuraciones diferentes de notificación: una sin una categoría de notificación y otra con una categoría de notificación:

//Request notification permission UIUserNotificationSettings *notificationSettings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil]; [[UIApplication sharedApplication] registerUserNotificationSettings:notificationSettings]; //Request notification permission again, but with a category with no actions UIMutableUserNotificationCategory *category = [[UIMutableUserNotificationCategory alloc] init]; category.identifier = @"com.xyz.markNotificationPopupShownCategoryIdentifier"; UIUserNotificationSettings *notificationSettingsWithCategory = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:[NSSet setWithObject:category]]; [[UIApplication sharedApplication] registerUserNotificationSettings:notificationSettingsWithCategory];

El didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings en el delegado de la aplicación se llamará dos veces, e independientemente de la respuesta del usuario en la notificación de permisos, después de la segunda llamada, la configuración de notificación actual contendrá la categoría. Mientras el recuento de categorías sea mayor que 0, puede estar seguro de que se ha mostrado el cuadro de diálogo de permiso de notificaciones:

if ([UIApplication sharedApplication].currentUserNotificationSettings.categories.count > 0) { NSLog(@"Notifications permission has been asked"); } else { NSLog(@"Notifications permission hasn''t been asked"); }


Puedes usar NSUserDefaults:

#define kPushNotificationRequestAlreadySeen @"PushNotificationRequestAlreadySeen" if(![[NSUserDefaults standardUserDefaults] boolForKey:kPushNotificationRequestAlreadySeen]) { // Notify the user why you want to have push notifications UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:... delegate:self ...]; [alertView show]; [[NSUserDefaults standardUserDefaults] setBool:YES forKey:kPushNotificationRequestAlreadySeen]; } else { // Already allowed -> register without notifying the user [[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound]; }

Y

- (void)alertView:(UIAlertView*)alertView didDismissWithButtonIndex:(NSInteger)index { // Actually registering to push notifications [[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound]; }