iphone - UILocalNotification cada 30 segundos
ios objective-c (5)
Actualmente no hay forma de lograr repeticiones personalizadas con intervalos.
Sin embargo, el sistema de notificación puede poner en cola hasta 64 notificaciones, por lo que lo más cercano que puede hacer es configurar manualmente tantas notificaciones como necesite (cada una de ellas con un número diferente para la insignia y una fireDate diferente) y luego tener su lista de notificaciones actualizado al establecer nuevos cuando se está quedando sin ellos.
Esto devolverá la cantidad de notificaciones que tiene en cola:
[[[UIApplication sharedApplication] scheduledLocalNotifications] count]
También hay esta publicación que recomendaría que leyeras para obtener más ayuda:
Actualización en vivo del número de placa de iOS
¡Buena suerte!
Estoy tratando de configurar una UILocalNotification
para que se ejecute cada 30 segundos con la siguiente lógica, sin embargo, parece que se está portando mal. Hay 2 problemas:
- Cuando las notificaciones se activan, parece que hay muchas todas a la vez, en lugar de 1 cada 30 segundos.
- El número de la insignia del icono de la aplicación no parece aumentar. Simplemente se queda en 1.
¿Puede alguien ayudarme a resolver lo que hice mal?
// Create ''base'' notification we can use
UILocalNotification *baseNotification = [[UILocalNotification alloc] init];
baseNotification.timeZone = [NSTimeZone defaultTimeZone];
baseNotification.repeatInterval = NSMinuteCalendarUnit;
baseNotification.alertBody = @"My Message.";
baseNotification.alertAction = @"My Alert Action";
baseNotification.soundName = UILocalNotificationDefaultSoundName;
UILocalNotification *alertOne = [baseNotification copy];
alertOne.applicationIconBadgeNumber++;
alertOne.fireDate = [[NSDate date] dateByAddingTimeInterval:30];
[[UIApplication sharedApplication] scheduleLocalNotification:alertOne];
UILocalNotification *alertTwo = [baseNotification copy];
alertTwo.applicationIconBadgeNumber++;
alertTwo.fireDate = [[NSDate date] dateByAddingTimeInterval:60];
[[UIApplication sharedApplication] scheduleLocalNotification:alertTwo];
Con respecto al segundo punto, está aumentando el número de la credencial de la copia, no la notificación original. Y dado que el original tiene un número de placa cero, siempre obtendrá una copia con el número cero de la credencial y aumentarla lo hará siempre 1.
La solución es aumentar la insignia de la notificación original justo antes de hacer la copia:
...
baseNotification.applicationIconBadgeNumber++;
UILocalNotification *alertOne = [baseNotification copy];
alertOne.fireDate = [[NSDate date] dateByAddingTimeInterval:30];
[[UIApplication sharedApplication] scheduleLocalNotification:alertOne];
baseNotification.applicationIconBadgeNumber++;
UILocalNotification *alertTwo = [baseNotification copy];
alertTwo.fireDate = [[NSDate date] dateByAddingTimeInterval:60];
[[UIApplication sharedApplication] scheduleLocalNotification:alertTwo];
Creo que recibes muchas notificaciones cada 30 segundos porque no cancelaste las notificaciones anteriores. Agregue esta línea en la parte superior de su código.
[[UIApplication sharedApplication] cancelAllLocalNotifications];
Prueba este.
UILocalNotification *baseNotification = [[UILocalNotification alloc] init];
baseNotification.timeZone = [NSTimeZone defaultTimeZone];
baseNotification.repeatInterval = NSMinuteCalendarUnit;
baseNotification.alertBody = @"My Message.";
baseNotification.alertAction = @"My Alert Action";
baseNotification.soundName = UILocalNotificationDefaultSoundName;
UILocalNotification *alertOne = [baseNotification copy];
alertOne.fireDate = [[NSDate date] dateByAddingTimeInterval:30];
alertOne.applicationIconBadgeNumber = [[UIApplication sharedApplication]applicationIconBadgeNumber]+1;
UILocalNotification *alertTwo = [baseNotification copy];
alertTwo.fireDate = [[NSDate date] dateByAddingTimeInterval:60];
alertTwo.applicationIconBadgeNumber = [[UIApplication sharedApplication]applicationIconBadgeNumber]+1;
Según la referencia de clase NSObject:
copy - Devuelve el objeto devuelto por copyWithZone:
Y copyWithZone devuelve una copia superficial. Entonces es como que todas las notificaciones tienen las mismas propiedades. Por lo tanto, el número de insignia siempre es "1" y fireDate es el mismo para todas las notificaciones. es decir, el último que aplica. Por lo tanto, las notificaciones se activan al mismo tiempo.
Espero eso ayude.