licencia español downloads development developer descargar desarrollo desarrollador cuenta apple app iphone cocoa-touch notifications ios4

iphone - español - licencia de desarrollo ios



Cancelar UILocalNotification (9)

Tengo un problema con mi UILocalNotification.

Estoy programando la notificación con mi método.

- (void) sendNewNoteLocalReminder:(NSDate *)date alrt:(NSString *)title { // some code ... UILocalNotification *localNotif = [[UILocalNotification alloc] init]; if (localNotif == nil) return; localNotif.fireDate = itemDate; localNotif.timeZone = [NSTimeZone defaultTimeZone]; localNotif.alertAction = NSLocalizedString(@"View Details", nil); localNotif.alertBody = title; localNotif.soundName = UILocalNotificationDefaultSoundName; localNotif.applicationIconBadgeNumber = 0; NSDictionary *infoDict = [NSDictionary dictionaryWithObject:stringID forKey:@"id"]; localNotif.userInfo = infoDict; [[UIApplication sharedApplication] scheduleLocalNotification:localNotif]; [localNotif release]; }

Funciona bien y recibo correctamente la notificación. El problema es cuando debería cancelar la notificación. Estoy usando este método.

- (void) deleteNewNoteLocalReminder:(NSString*) reminderID noteIDe:(NSInteger)noteIDE { [[UIApplication sharedApplication] cancelLocalNotification:(UILocalNotification *)notification ???? }

No estoy seguro de qué hacer aquí, pero mis preguntas son:

¿Cómo sé qué objeto UILocalNotification debo eliminar?
¿Hay alguna manera de enumerar todas las notificaciones?

Lo único que tengo es la identificación del recordatorio que debería eliminar.
Estaba pensando en guardar el objeto UILocalNotification en mi objeto "Nota" y obtenerlo de esa manera, y cuando guardo en mi base de datos SQLite serializar el objeto y así sucesivamente ... ¿hay alguna manera más inteligente?


En breve, primero agrega un dict a notificaciones userInfo por:

let dict:NSDictionary = ["ID" : "someString"] notification.userInfo = dict as! [String : String]

Luego, desea obtener una serie de notificaciones existentes (2) e iterar a través de cada una (3) hasta que encuentre la que está buscando. Una vez que lo encuentre, cancélelo (4).

// 1. Pass in the string you want to cancel func cancelLocalNotification(uniqueId: String){ // 2. Create an array of notifications, ensuring to use `if let` so it fails gracefully if let notifyArray = UIApplication.sharedApplication().scheduledLocalNotifications { // 3. For each notification in the array ... for notif in notifyArray as [UILocalNotification] { // ... try to cast the notification to the dictionary object if let info = notif.userInfo as? [String: String] { // 4. If the dictionary object ID is equal to the string you passed in ... if info["ID"] == uniqueId { // ... cancel the current notification UIApplication.sharedApplication().cancelLocalNotification(notif) } } } } }


Gracias @ viggio24 por la buena respuesta, esta es una versión rápida

var notifyCancel = UILocalNotification() var notifyArray=UIApplication.sharedApplication().scheduledLocalNotifications var i = 0 while(i<notifyArray.count){ if let notify = notifyArray[i] as? UILocalNotification{ if let info = notify.userInfo as? Dictionary<String,String> { if let s = info["name"] { if(name==s){//name is the the one you want cancel notifyCancel = notify break } } } } i++ }


Mi solución es archivar el objeto UILocalNotification que ha programado con NSKeyedArchiver y almacenarlo en algún lugar (en un plist es preferible). Y luego, cuando desee puede cancelar la notificación, busque los datos correctos en la lista y use NSKeyedUnarchiver para desarchivar. El código es bastante fácil:

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:notice];

y

UILocalNotification *notice = [NSKeyedUnarchiver unarchiveObjectWithData:data];


Mi solución es eliminar todas las notificaciones programadas en estos métodos.

-applicationDidFinishLaunchingWithOptions: - (void)applicationDidBecomeActive:(UIApplication *)application; - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification;

con

[[UIApplication sharedApplication] cancelAllLocalNotifications];

Aún puede acceder al objeto LocalNotification que activó su aplicación utilizando.

UILocalNotification *localNotif = [launchOptions objectForKey: UIApplicationLaunchOptionsLocalNotificationKey];

Luego reprogramaré nuevas notificaciones en

- (void)applicationDidEnterBackground:(UIApplication *)application;

Esto evita tener contabilidad para todas las notificaciones. También envío información de contexto en el diccionario userInfo. Esto luego ayuda a saltar al lugar correcto en la aplicación.


Mi solución es usar el diccionario UILocalNotification UILocalNotification . De hecho, lo que hago es generar una identificación única para cada una de mis notificaciones (por supuesto, esta identificación es algo que puedo recuperar más adelante), cuando quiero cancelar la notificación asociada a una identificación dada, simplemente escaneo todo notificaciones disponibles usando la matriz:

[[UIApplication sharedApplication] scheduledLocalNotifications]

y luego trato de hacer coincidir las notificaciones investigando la ID . P.ej:

NSString *myIDToCancel = @"some_id_to_cancel"; UILocalNotification *notificationToCancel=nil; for(UILocalNotification *aNotif in [[UIApplication sharedApplication] scheduledLocalNotifications]) { if([[aNotif.userInfo objectForKey:@"ID"] isEqualToString:myIDToCancel]) { notificationToCancel=aNotif; break; } } if(notificationToCancel) [[UIApplication sharedApplication] cancelLocalNotification:notificationToCancel];

No sé si este enfoque es mejor o no con respecto a Archiving / Unarchving, sin embargo, funciona y limita los datos que se guardan en solo un ID.

Editar: faltaba un bracket


Mi solución es usted cuando crea UILocalNotification en ese momento crea un NSMutableDictionary y almacena esa notificación como un valor para la clave como su ID y pone este NSMutableDictionay a su NSUserDefaults

Entonces, cuando desee cancelar una notificación local en particular en ese momento, escriba [dictionary valueforkey @"KEY"] donde como clave pasa su identificación para que obtenga esa notificación local particular y la pase a

[[UIApplication sharedApplication] scheduleLocalNotification:localNotif];



Versión Swift :

UIApplication.sharedApplication().cancelAllLocalNotifications()


Versión Swift para cancelar una "Notificación Local" particular usando userinfo .:

func cancelLocalNotification(UNIQUE_ID: String){ var notifyCancel = UILocalNotification() var notifyArray = UIApplication.sharedApplication().scheduledLocalNotifications for notifyCancel in notifyArray as! [UILocalNotification]{ let info: [String: String] = notifyCancel.userInfo as! [String: String] if info[uniqueId] == uniqueId{ UIApplication.sharedApplication().cancelLocalNotification(notifyCancel) }else{ println("No Local Notification Found!") } } }