ios - heuer - rastrear la elección del usuario para la notificación de inserción
caratulas tag heuer connected (2)
Parece que no hay forma de determinar si se ha mostrado el pop-up de permiso. Confío en los valores predeterminados del usuario para realizar un seguimiento de esto:
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
BOOL didRegisterForPush = [[NSUserDefaults standardUserDefaults] boolForKey:@"didRegisterForPush"];
if (!didRegisterForPush) {
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"didRegisterForPush"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
// .. send deviceToken to server
}
Ahora puede determinar el estado de autorización usando:
- (PushAuthorizationStatus)pushAuthorizationStatus
{
UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
if (types) {
return kPushAuthorizationStatusAuthorized;
}
BOOL didRegisterForPush = [[NSUserDefaults standardUserDefaults] boolForKey:@"didRegisterForPush"];
if (didRegisterForPush) {
return kPushAuthorizationStatusDenied;
}
return kPushAuthorizationStatusNotDetermined;
}
Al usar esto, puede enviar el estado No determinado al servidor en lugar de Denied
.
Cuando una aplicación necesita registrarse para la notificación de inserción (UIApplication registerForRemoteNotificationTypes), una ventana emergente muestra Permitir / No elegir.
¿Hay alguna manera de rastrear cuándo el usuario toma esta decisión?
Porque la solución:
NSUInteger rntypes = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
está bien, pero hasta que el usuario toque algo es NO por defecto. Solo debería verificar esta configuración después de que el usuario haga una elección.
La consecuencia es que en mi servidor EasyAPNS la mayoría de las aplicaciones están en modo "deshabilitado" hasta que el usuario las reinicia (porque la segunda vez que se transfiere la configuración correcta a mi servidor). Por lo tanto, con el primer lanzamiento, la elección real del usuario probablemente no se tenga en cuenta (si acepta muy rápidamente, antes de que mi aplicación se registre en EasyAPNS, su elección se refleja en el servidor en el primer lanzamiento)
Alguna idea ?
En iOS 8 y versiones posteriores, el procedimiento es un poco diferente. En iOS 8, el método enabledRemoteNotificationTypes
fue reemplazado por isRegisteredForRemoteNotifications
.
Sin embargo, isRegisteredForRemoteNotifications
siempre devuelve YES
si la aplicación intentó registrarse para notificaciones, independientemente de si el usuario las permitió o no.
Para determinar si el usuario realmente permitió las notificaciones, use la función provista por @Lefteris aquí :
- (BOOL)pushNotificationsEnabled {
if ([[UIApplication sharedApplication] respondsToSelector:@selector(currentUserNotificationSettings)]) {
UIUserNotificationType types = [[[UIApplication sharedApplication] currentUserNotificationSettings] types];
return (types & UIUserNotificationTypeAlert);
}
else {
UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
return (types & UIRemoteNotificationTypeAlert);
}
}