取消UILocalNotification

我的UILocalNotification有问题。

我正在用我的方法安排通知。

- (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]; } 

它的工作正常,我正确地收到通知。 问题是什么时候我应该取消通知。 我使用这种方法。

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

林不知道该怎么做,但我的问题是:

我怎么知道我应该删除哪个UILocalNotification对象?
有没有办法列出所有的通知?

我唯一拥有的是我应该删除的提醒的ID。
我正在考虑将UILocalNotification对象保存在我的“Note”对象中,并以此方式保存,并且当我保存到SQLite数据库时,将对象序列化等等…是否有更智能的方法?

您可以从scheduledLocalNotifications获取所有计划通知的列表,或者您可以全部取消它们:

  [[UIApplication sharedApplication] cancelAllLocalNotifications]; 

我的解决scheme是使用UILocalNotification userInfo字典。 实际上,我所做的是为每个通知生成一个唯一的ID (当然,这个ID是我以后可以检索的),那么当我想取消与给定ID相关的通知时,我将只扫描所有使用数组的可用通知:

 [[UIApplication sharedApplication] scheduledLocalNotifications] 

然后我尝试通过调查ID来匹配通知。 例如:

 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]; 

我不知道这种方法对于存档/取消存档是否更好,但它的作用是将数据保存为一个ID。

编辑:有一个失踪的球员

我的解决scheme是存档您使用NSKeyedArchiver计划的UILocalNotification对象,并将其存储在某处(首选plist)。 然后,当您想要取消通知时,请查找plist以获取正确的数据,并使用NSKeyedUnarchiver将其解压。 代码很简单:

 NSData *data = [NSKeyedArchiver archivedDataWithRootObject:notice]; 

 UILocalNotification *notice = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 

我的解决scheme是当你创buildUILocalNotification的时候,你创build一个NSMutableDictionary并将该通知存储为键的值作为你的ID并把这个NSMutableDictionay放到你的NSUserDefaults

所以当你想取消任何特定的localnotification当你写[dictionary valueforkey @"KEY"]作为一个关键你传递你的ID,所以你得到特定的本地通知,并传递给

  [[UIApplication sharedApplication] scheduleLocalNotification:localNotif]; 

在迅速,你首先添加一个字典通知userInfo通过:

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

然后,你想得到一个现有的通知数组(2),并遍历每一个(3),直到find你正在寻找的。 一旦find它,取消它(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) } } } } } 

Swift版本使用用户信息取消特定的“本地通知”。

 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!") } } } 

Swift版本:

 UIApplication.sharedApplication().cancelAllLocalNotifications() 

我的解决scheme是删除这些方法的所有计划通知。

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

[[UIApplication sharedApplication] cancelAllLocalNotifications];

您仍然可以通过使用来获得激活您的应用程序的LocalNotification对象。

  UILocalNotification *localNotif = [launchOptions objectForKey: UIApplicationLaunchOptionsLocalNotificationKey]; 

然后我重新安排新的通知

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

这避免了所有的通知簿记。 我还在userInfo字典中发送了一些上下文信息。 这有助于跳转到应用程序的正确位置。

感谢@ viggio24的好回答,这是一个很快的版本

 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++ }