ios xcode ios8 xcode6

ios - Declaraciones de salida de depuración Debería solicitar permiso de la Placa de aplicación



xcode ios8 (1)

Terminé sin usar la insignia de la aplicación y abandoné el fragmento de código inicial que publiqué aquí mientras tanto. Dado que todavía hay personas que leen y comentan esta pregunta, agregaré aquí también mi solución actual de trabajo. Contiene controles para iOS7 pero no uso el método de devolución de llamada. Además, esta versión ya no solo solicita el permiso de la insignia de la aplicación.

Solución

UIUserNotificationSettings* notificationSettings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil]; [[UIApplication sharedApplication] registerUserNotificationSettings:notificationSettings];

Esto es lo que uso ahora

archivo .h

#import <Foundation/Foundation.h> @interface NotificationPermissionHandler : NSObject + (void)checkPermissions; + (bool)canSendNotifications; @end

archivo .m:

#import "NotificationPermissionHandler.h" @implementation NotificationPermissionHandler static const UIUserNotificationType USER_NOTIFICATION_TYPES_REQUIRED = UIUserNotificationTypeAlert | UIUserNotificationTypeSound; static const UIRemoteNotificationType REMOTE_NOTIFICATION_TYPES_REQUIRED = UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound; + (void)checkPermissions; { bool isIOS8OrGreater = [[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)]; if (!isIOS8OrGreater) { [NotificationPermissionHandler iOS7AndBelowPermissions]; return; } [NotificationPermissionHandler iOS8AndAbovePermissions]; } + (void)iOS7AndBelowPermissions { [[UIApplication sharedApplication] registerForRemoteNotificationTypes:REMOTE_NOTIFICATION_TYPES_REQUIRED]; } + (void)iOS8AndAbovePermissions; { if ([NotificationPermissionHandler canSendNotifications]) { return; } UIUserNotificationSettings* requestedSettings = [UIUserNotificationSettings settingsForTypes:USER_NOTIFICATION_TYPES_REQUIRED categories:nil]; [[UIApplication sharedApplication] registerUserNotificationSettings:requestedSettings]; } + (bool)canSendNotifications; { UIApplication *application = [UIApplication sharedApplication]; bool isIOS8OrGreater = [application respondsToSelector:@selector(currentUserNotificationSettings)]; if (!isIOS8OrGreater) { // We actually just don''t know if we can, no way to tell programmatically before iOS8 return true; } UIUserNotificationSettings* notificationSettings = [application currentUserNotificationSettings]; bool canSendNotifications = notificationSettings.types == USER_NOTIFICATION_TYPES_REQUIRED; return canSendNotifications; } @end

Esta fue mi primera solución

Lo guardé solo como referencia para la discusión inicial. Este código no se mantiene.

UIUserNotificationSettings* notificationSettings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge]; [[UIApplication sharedApplication] registerUserNotificationSettings:notificationSettings];

También puede apilar permisos en una solicitud haciendo esto:

UIUserNotificationSettings* notificationSettings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil]; [[UIApplication sharedApplication] registerUserNotificationSettings:notificationSettings];

También desde iOS 8 es posible descubrir qué tipo de alertas permite el usuario:

UIUserNotificationSettings* notificationSettings = [[UIApplication sharedApplication] currentUserNotificationSettings]; if (notificationSettings.types == UIUserNotificationTypeBadge) { // change the badge }

Terminé usando este código:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; if (![defaults objectForKey:@"first_run"]) { [self setDefaults]; } [self askAlertPermissions]; if ([self canChangeBadge]) { [self setBadge:0]; } return YES; } - (void)setDefaults; { NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults setObject:[NSNumber numberWithBool:NO] forKey:@"alerts_allowed"]; [defaults setObject:[NSDate date] forKey:@"first_run"]; // More defaults if needed [defaults synchronize]; } - (void)askAlertPermissions; { UIUserNotificationSettings* notificationSettings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil]; [[UIApplication sharedApplication] registerUserNotificationSettings:notificationSettings]; } // This will be called only after confirming your settings - (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings; { NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; // There is also a built in method to find out if the user has appropriate settings, you might want to use that instead if you just want to know what the setting is [defaults setObject:[NSNumber numberWithBool:YES] forKey:@"alerts_allowed"]; } - (bool)canChangeBadge; { UIUserNotificationSettings* notificationSettings = [[UIApplication sharedApplication] currentUserNotificationSettings]; return notificationSettings.types == UIUserNotificationTypeBadge; }

Más para leer:

https://developer.apple.com/library/content/releasenotes/General/WhatsNewIniOS/Articles/iOS8.html

https://developer.apple.com/documentation/uikit/uiapplication

Hice una aplicación muy simple que se puede ejecutar en segundo plano mientras se ejecuta un temporizador. Si la aplicación todavía está en segundo plano y el temporizador finaliza, enviará una notificación local y establecerá la insignia de la aplicación en 1. Cuando comienzo la aplicación, siempre la borro. Noté que después de instalar Xcode 6 recibía este mensaje cada vez que comencé la aplicación:

"Intento marcar el icono de la aplicación pero no ha recibido permiso del usuario para identificar la aplicación"

Claramente ese texto es generado por mi aplicación configurando la insignia en 0 para borrarla. ¿Dónde puedo configurar estos permisos o solicitarlos? ¿Ahora se considera una notificación push?

El problema ha sido resuelto y la respuesta se publica a continuación. La conclusión es que debe obtener la confirmación del usuario para cualquier tipo de notificación, mientras que solía ser cierto solo para las notificaciones push.