Ответ 1
Вы можете получить список всех запланированных уведомлений от scheduledLocalNotifications или вы можете отменить их все:
[[UIApplication sharedApplication] cancelAllLocalNotifications];
У меня проблема с моей 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 сериализацию объекта и т.д.... есть ли более разумный способ?
Вы можете получить список всех запланированных уведомлений от scheduledLocalNotifications или вы можете отменить их все:
[[UIApplication sharedApplication] cancelAllLocalNotifications];
Мое решение - использовать словарь UILocalNotification
userInfo. На самом деле то, что я делаю, - это создать уникальный идентификатор для каждого из моих уведомлений (конечно, этот 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];
Я не знаю, лучше ли этот подход или нет в отношении Архивирования/Уничтожения, однако он работает и ограничивает данные для сохранения только с идентификатором.
Изменить: отсутствовала раскладка
Мое решение состоит в том, чтобы архивировать объект 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!")
}
}
}
версия Swift:
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<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++
}
Свифт 5:
UNUserNotificationCenter.current().removePendingNotificationRequests(withIdentifiers: arrayContainingIdentifiers)