subir sobre leyes las falta exportación documentación cumplimiento application apple app objective-c xcode ios8 badge

objective-c - sobre - testflight



Intentando identificar el ícono de la aplicación pero no ha recibido permiso del usuario para identificar la aplicación: iOS 8 Xcode 6 (11)

Apple crea una nueva API para registrar notificaciones y trabajar con credenciales.

Vea el video de la sesión de la WWDC 2014: https://developer.apple.com/videos/wwdc/2014/?id=713 , http://asciiwwdc.com/2014/sessions/713 (versión de texto) y https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplication_Class/index.html#//apple_ref/occ/instm/UIApplication/registerUserNotificationSettings :

El usuario puede cambiar los permisos para cada UIUserNotificationType (UIUserNotificationTypeBadge, UIUserNotificationTypeSound, UIUserNotificationTypeAlert) en Configuración.

Antes de cambiar la credencial debes comprobar los permisos.

Ejemplo de código de mi AppDelegate:

- (BOOL)checkNotificationType:(UIUserNotificationType)type { UIUserNotificationSettings *currentSettings = [[UIApplication sharedApplication] currentUserNotificationSettings]; return (currentSettings.types & type); } - (void)setApplicationBadgeNumber:(NSInteger)badgeNumber { UIApplication *application = [UIApplication sharedApplication]; if(SYSTEM_VERSION_LESS_THAN(@"8.0")) { application.applicationIconBadgeNumber = badgeNumber; } else { if ([self checkNotificationType:UIUserNotificationTypeBadge]) { NSLog(@"badge number changed to %d", badgeNumber); application.applicationIconBadgeNumber = badgeNumber; } else { NSLog(@"access denied for UIUserNotificationTypeBadge"); } } } #define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)

El método currentUserNotificationSettings está disponible en la instancia de la aplicación UI y le dará las preferencias de notificación de usuario más actualizadas.

Trabajando con número de placa:

[self setApplicationBadgeNumber:0];

en lugar de

application.applicationIconBadgeNumber = 0;

Estoy comprobando la compatibilidad de mi aplicación con iOS 8, obtengo lo siguiente: Iniciar sesión en la consola "Intentando identificar el icono de la aplicación pero no he recibido permiso del usuario para identificar la aplicación" . ¿Alguien puede por favor ayudarme a deshacerme de esta advertencia. Y sí, mi aplicación muestra insignias en el icono de la aplicación y el icono de la barra de herramientas.


En lugar de verificar la versión de IOS, verificaría si el UIUserNotificationSettings existe y se registrará en BadgeType, como solíamos hacer con las notificaciones remotas.

Class userNotification = NSClassFromString(@"UIUserNotificationSettings"); if (userNotification) { UIUserNotificationSettings* notificationSettings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil]; [[UIApplication sharedApplication] registerUserNotificationSettings:notificationSettings]; }


Encontré esta respuesta mientras buscaba una solución en Swift. He hecho lo siguiente (asumiendo iOS 8):

UIApplication.sharedApplication().registerUserNotificationSettings(UIUserNotificationSettings(forTypes: UIUserNotificationType.Sound | UIUserNotificationType.Alert | UIUserNotificationType.Badge, categories: nil)) UIApplication.sharedApplication().registerForRemoteNotifications()


Esto es lo que hice en mi AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // registering for remote notifications [self registerForRemoteNotification]; return YES; } - (void)registerForRemoteNotification { if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) { UIUserNotificationType types = UIUserNotificationTypeSound | UIUserNotificationTypeBadge | UIUserNotificationTypeAlert; UIUserNotificationSettings *notificationSettings = [UIUserNotificationSettings settingsForTypes:types categories:nil]; [[UIApplication sharedApplication] registerUserNotificationSettings:notificationSettings]; } else { [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)]; } } #ifdef __IPHONE_8_0 - (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings { [application registerForRemoteNotifications]; } #endif


Lo único que necesitas es

if (floor(NSFoundationVersionNumber) >= NSFoundationVersionNumber_iOS_8_0) { // here you go with iOS 8 } else { }


Puedes usar

if(SYSTEM_VERSION_LESS_THAN(@"8.0")) { [[UIApplication sharedApplication] registerForRemoteNotificationTypes: (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)]; } else { [[UIApplication sharedApplication] registerForRemoteNotifications]; } .... #define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)

Para la notificación push, creo que lo resolverá, en mi caso en el simulador recibo esta advertencia ya que no es compatible con push y si el usuario rechaza el permiso, volverá a tener esa advertencia. Gracias.


Puedes usar

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)]) { [[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]]; [[UIApplication sharedApplication] registerForRemoteNotifications]; } else { [[UIApplication sharedApplication] registerForRemoteNotificationTypes: (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)]; } #else [[UIApplication sharedApplication] registerForRemoteNotificationTypes: (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)]; #endif


Si desea utilizar la Notificación local, utilice el Código A continuación:

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 [[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]]; [[UIApplication sharedApplication] registerForRemoteNotifications]; #else [[UIApplication sharedApplication] registerForRemoteNotificationTypes: (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)]; #endif


iOS 8 tiene un método de aplicación llamado registerUserNotificationSettings: Una parte de los documentos dice: "Si su aplicación muestra alertas, reproduce sonidos o marca su icono mientras está en segundo plano, debe llamar a este método durante su ciclo de inicio para solicitar permiso para alertar al usuario de esa manera".


para "swifters" el código anterior:

final func checkNotificationType(type : UIUserNotificationType) -> Bool { let application = UIApplication.sharedApplication() if application.respondsToSelector(Selector("registerUserNotificationSettings:")) { // iOS8 and above let currentSettings : UIUserNotificationSettings = application.currentUserNotificationSettings() let types = currentSettings.types return types.rawValue & type.rawValue > 0 }else{ return true } }


+ (BOOL)canBadgeTheApp { BOOL canBadgeTheApp; if ([UIDevice currentDevice].systemVersion.doubleValue >= 8) { UIUserNotificationType types = [[[UIApplication sharedApplication] currentUserNotificationSettings] types]; canBadgeTheApp = ((types & UIRemoteNotificationTypeBadge) != 0); } else { canBadgeTheApp = YES; } return canBadgeTheApp; }