Отмена UILocalNotification - PullRequest
       8

Отмена UILocalNotification

47 голосов
/ 01 июля 2010

У меня проблема с моим 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 в моем объекте «Note» и получить его таким образом, и когда я сохраняю в своей базе данных SQLite сериализацию объекта и так далее ... есть ли более разумный способ?

Ответы [ 10 ]

93 голосов
/ 03 февраля 2011

Мое решение - использовать словарь UILocalNotification userInfo . На самом деле я создаю уникальный идентификатор для каждого из моих уведомлений (конечно, этот идентификатор я могу получить позже), затем, когда я хочу отменить уведомление, связанное с данным ID . Я просто проверю все доступные уведомления, используя массив:

[[UIApplication sharedApplication] scheduledLocalNotifications]

и затем я пытаюсь сопоставить уведомления, исследуя ID . E.g.:


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

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

Редактировать: отсутствовал кронштейн

57 голосов
/ 01 июля 2010

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

  [[UIApplication sharedApplication] cancelAllLocalNotifications];
13 голосов
/ 26 июля 2010

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

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:notice];

и

UILocalNotification *notice = [NSKeyedUnarchiver unarchiveObjectWithData:data];
6 голосов
/ 30 июля 2010

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

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

 [[UIApplication sharedApplication] scheduleLocalNotification:localNotif]; 
3 голосов
/ 06 января 2016

В swift вы сначала добавляете диктовку к уведомлениям 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)
                }
            }
        }
    }
}
2 голосов
/ 14 февраля 2016

Swift версия:

UIApplication.sharedApplication().cancelAllLocalNotifications()
1 голос
/ 19 мая 2019

Swift 5:

UNUserNotificationCenter.current().removePendingNotificationRequests(withIdentifiers: arrayContainingIdentifiers)
1 голос
/ 25 июня 2015

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

Спасибо @ 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++
}
0 голосов
/ 15 июня 2012

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

-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. Затем это помогает перейти в нужное место в приложении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...