Отменить 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 я должен удалить?
Есть ли способ перечислить все уведомления?

Единственное, что у меня есть, это идентификатор напоминания, который я должен удалить.
Я думал о том, чтобы сохранить объект UILocalNotification в моем объекте «Заметка» и получить его таким образом, а когда я сохраняю в моей базе данных SQLite сериализацию объекта и т. Д. … есть ли более разумный способ?

Вы можете получить список всех запланированных уведомлений из запланированныхLocalNotifications или вы можете отменить их все:

  [[UIApplication sharedApplication] cancelAllLocalNotifications]; 

Мое решение заключается в использовании пользовательского UILocalNotification UILocalNotification . На самом деле то, что я делаю, это создать уникальный идентификатор для каждого из моих уведомлений (конечно, этот идентификатор – это то, что я могу получить позже), а затем, когда я хочу отменить уведомление, связанное с данным 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]; 

Я не знаю, лучше ли этот подход или нет в отношении Архивирования / Развертывания, однако он работает и ограничивает данные для сохранения только с идентификатором.

Редактировать: отсутствовала рамка

Мое решение состоит в том, чтобы архивировать объект UILocalNotification, который вы запланировали с помощью NSKeyedArchiver, и хранить его где-нибудь (предпочтительным является plist). И затем, когда вы захотите отменить уведомление, посмотрите на plist для получения правильных данных и используйте NSKeyedUnarchiver для разблокировки. Код довольно прост:

 NSData *data = [NSKeyedArchiver archivedDataWithRootObject:notice]; 

а также

 UILocalNotification *notice = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 

Мое решение – это когда вы создаете UILocalNotification в то время, когда вы создаете один NSMutableDictionary и сохраните это уведомление как значение для ключа в качестве вашего идентификатора и поместите этот NSMutableDictionay в NSUserDefaults

Поэтому, когда вы хотите отменить какую-либо конкретную локальную модификацию в это время, вы пишете [dictionary valueforkey @"KEY"] где в качестве ключа вы передаете свой идентификатор, чтобы получить это конкретное локальное уведомление и передать его

  [[UIApplication sharedApplication] scheduleLocalNotification:localNotif]; 

В swift вы сначала добавляете dict для уведомлений userInfo по:

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

Затем вы хотите получить массив существующих уведомлений (2) и выполнить итерацию каждого из них (3), пока не найдете тот, который вы ищете. Как только вы его найдете, отмените его (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) } } } } } 

Быстрая версия для отмены определенного «Локального уведомления» с помощью 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!") } } } 

Быстрая версия:

 UIApplication.sharedApplication().cancelAllLocalNotifications() 

Мое решение – удалить все запланированные уведомления об этих методах.

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

с

[[UAppication 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 { if let s = info["name"] { if(name==s){//name is the the one you want cancel notifyCancel = notify break } } } } i++ } в var notifyCancel = UILocalNotification() var notifyArray=UIApplication.sharedApplication().scheduledLocalNotifications var i = 0 while(i { if let s = info["name"] { if(name==s){//name is the the one you want cancel notifyCancel = notify break } } } } i++ } 
Interesting Posts

Существуют ли KVM для нескольких мониторов?

Как я могу снова включить веб-интерфейс маршрутизатора dd-wrt без подключения к SSH или telnet?

Как использовать заголовок X-DocuSign-Authentication для REST и SOAP?

Программа для анализа времени запуска

Случайно удалил все файлы cookie Chrome, пытаясь просмотреть некоторые

Ошибка шифрования на Android 4.2

Как избежать «локальная переменная, возможно, не была инициализирована»?

Данные Spring jpa- Определен бит bean с именем ‘entityManagerFactory’; Инъекция автоуведомленных зависимостей не удалась

Windows-7 Ultimate 64 бит не будет подключаться к моим проводным / беспроводным сетям

Запуск Skype из программы Programmatically & Pass Number – Android

Каковы эти особые имена и как они работают?

Visual Studio блокирует выходной файл на сборке

Изменение существующего содержимого файла в Java

Утилита Windows Split Desktop

MongoDB: уникальный индекс для свойства элемента массива

Давайте будем гением компьютера.