2012-02-12 13 views
6

He configurado una notificación local que se repite cada minuto; sin embargo, necesito que el número de la credencial de la aplicación aumente cada vez. Cuando lo ejecuto en este momento no parece aumentar, solo queda en 1. ¿Por favor alguien puede ayudarme?Cómo aumentar el número de la credencial de la aplicación para la notificación local recurrente (iPhone)

Aquí es cómo crear las notificaciones:

// Create the UILocalNotification 
UILocalNotification *myNotification = [[UILocalNotification alloc] init]; 
myNotification.alertBody = @"Blah blah blah..."; 
myNotification.alertAction = @"Blah"; 
myNotification.soundName = UILocalNotificationDefaultSoundName; 
myNotification.applicationIconBadgeNumber++; 
myNotification.timeZone = [NSTimeZone defaultTimeZone]; 
myNotification.repeatInterval = NSMinuteCalendarUnit; 
myNotification.fireDate = [[NSDate date] dateByAddingTimeInterval:30]; 
[[UIApplication sharedApplication] scheduleLocalNotification:myNotification]; 
+0

Se puede publicar algo de código? – HeikoG

+0

@HeikoG He agregado el código que uso para crear las notificaciones. –

+0

@TheCrazyChimp ¿alguna vez encontró una solución para este problema? –

Respuesta

18

Después de hacer mucho de la investigación me di cuenta de que la solución es que no hay una solución:

iPhone: Incrementing the application badge through a local notification

No es posible actualizar dinámicamente el número de placa con las notificaciones locales, mientras que su aplicación está en el fondo. Tienes que usar notificaciones push.

+5

Si bien esta respuesta es técnicamente correcta, en realidad se puede lograr lo que The Crazy Chimp quiere hacer con un poco de trabajo adicional utilizando la instancia de UIApplication compartida. Cada vez que programe una nueva notificación local o cargue la aplicación, puede usar la propiedad 'scheduledLocalNotifications' y la propiedad 'cancelAllLocalNotifications' para cancelar todas las futuras notificaciones y reasignar las cuentas de distintivos a futuras notificaciones locales enumerando a través de ellas en orden cronológico & incrementando el número de placa que asigna. Def no es tan fácil como escribir applicationBadgeNumber ++, pero funciona. – BFar

+0

+1 a este comentario del usuario. Probé este enfoque y funciona. Aquí hay una explicación más completa de la implementación: http://stackoverflow.com/a/15461328/2546416 –

+1

sí, pero eso no funcionará si está utilizando repeatInterval ... si su aplicación nunca se inicia nuevamente y usted no puede predecir el valor de la insignia (porque está teniendo un intervalo de repetición diario), entonces no puede incrementar ... –

-1

intentar algo como:

int plusOne = [myNotification.applicationIconBadgeNumber intValue]; 
plusOne++; 

myNotification.applicationIconBadgeNumber = plusOne; 
+0

Lamentablemente esto no funcionó para mí, gracias por la sugerencia. –

-1

esto debería funcionar.

myNotification.applicationIconBadgeNumber = [[UIApplication sharedApplication] applicationIconBadgeNumber] + 1; 
+1

No, hombre. Funciona rara vez – fnc12

0

Si bien no hay método simple applicationIconBadgeNumber++, como se ha mencionado BFAR, se puede lograr lo que preguntas mediante la actualización de todos los applicationIconBadgeNumbers UILocalNotifications programados cada vez que se añade o elimina una notificación.

Mientras esto no funcionará si tiene avisos de que el uso repeatInterval,, siempre y cuando se llama a scheduleNotification y decrementBadgeNumber en el momento adecuado, la clase de abajo debe hacer el truco.

@implementation NotificationScheduler 

+ (void) scheduleNotification:(NSString*)message date:(NSDate*)date { 
    UIApplication *app = [UIApplication sharedApplication]; 
    UILocalNotification *notification = [[UILocalNotification alloc] init]; 
    if (notification) { 
     notification.fireDate = date; 
     notification.timeZone = [NSTimeZone defaultTimeZone]; 

     notification.alertBody = message; 
     notification.soundName = UILocalNotificationDefaultSoundName; 
     notification.applicationIconBadgeNumber = [self getExpectedApplicationIconBadgeNumber:date]; 

     [app scheduleLocalNotification:notification]; 
     [self updateBadgeCountsForQueuedNotifiations]; 
    } 
} 

+ (void) decrementBadgeNumber:(long)amount { 
    [self setCurrentBadgeNumber:([self getCurrentBadgeNumber] - amount)]; 
    [self updateBadgeCountsForQueuedNotifiations]; 
} 

+ (long) getExpectedApplicationIconBadgeNumber:(NSDate*)notificationDate { 
    long number = [self getCurrentBadgeNumber]; 
    for (UILocalNotification *notice in [self getScheduledLocalNotifications]) { 
     if (notice.fireDate <= notificationDate) { 
      number++; 
     } 
    } 
    return number; 
} 

+ (void) updateBadgeCountsForScheduledNotifiations { 
    long expectedBadgeNumber = [self getCurrentBadgeNumber]; 
    NSArray *allLocalNotifications = [self getScheduledLocalNotifications]; 
    for (UILocalNotification *notice in allLocalNotifications) { 
     expectedBadgeNumber++; 
     notice.applicationIconBadgeNumber = expectedBadgeNumber; 
    } 
    [[UIApplication sharedApplication] setScheduledLocalNotifications:allLocalNotifications]; 
} 

+ (long) getCurrentBadgeNumber { 
    return [UIApplication sharedApplication].applicationIconBadgeNumber; 
} 

+ (void) setCurrentBadgeNumber:(long)number { 
    [UIApplication sharedApplication].applicationIconBadgeNumber = number; 
} 

+ (NSArray*) getScheduledLocalNotifications { 
    NSSortDescriptor * fireDateDesc = [NSSortDescriptor sortDescriptorWithKey:@"fireDate" ascending:YES]; 
    return [[[UIApplication sharedApplication] scheduledLocalNotifications] sortedArrayUsingDescriptors:@[fireDateDesc]]; 
} 

@end 
+0

falta la implementación del método updateBadgeCountsForQueuedNotifiations ... actualícelo ... –

1

Si utiliza un servicio externo como Parse for Push, esto debería hacerse fácilmente. Simplemente incremente el número de la insignia de Parses cuando se active una notificación local. Aunque, este es un caso especial.

-1

probar este ... que trabajó para mí en el escenario simple ...

notification.applicationIconBadgeNumber = [UIApplication sharedApplication].scheduledLocalNotifications.count + 1; 

Y no se olvide de fijar el icono insignia de nuevo a 0 cuando el lanzamiento de aplicaciones.

0

que era capaz de hacerlo mediante la siguiente línea, mientras que programar la notificación local de

localNotification.applicationIconBadgeNumber = [UIApplication sharedApplication].applicationIconBadgeNumber + 1; 

y en el otro extremo en el AppDelegate

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification { 

    application.applicationIconBadgeNumber -= 1; 
} 
Cuestiones relacionadas