Решение iMOBDEV отлично работает для удаления определенного уведомления (например, после удаления тревоги), но особенно полезно, когда вам нужно выборочно удалить любое уведомление, которое уже сработало и все еще находится в центре уведомлений.
Возможный сценарий: оповещение для будильника срабатывает, но пользователь открывает приложение, не нажимая на это уведомление, и снова планирует этот будильник.
Если вы хотите убедиться, что в центре уведомлений для данного элемента / тревоги может быть только одно уведомление, это хороший подход. Это также позволяет вам не удалять все уведомления при каждом открытии приложения, это лучше всего подходит для приложения.
- После создания локального уведомления используйте
NSKeyedArchiver
, чтобы сохранить его как Data
в UserDefaults
. Вы можете создать ключ, равный тому, что вы сохраняете в словаре userInfo уведомления. Если он связан с объектом Core Data, вы можете использовать его уникальное свойство objectID.
- Получите его с помощью
NSKeyedUnarchiver
. Теперь вы можете удалить его, используя метод cancelLocalNotification.
- Обновите ключ на
UserDefaults
соответственно.
Вот версия Swift 3.1 этого решения (для целей ниже iOS 10):
магазин
// localNotification is the UILocalNotification you've just set up
UIApplication.shared.scheduleLocalNotification(localNotification)
let notificationData = NSKeyedArchiver.archivedData(withRootObject: localNotification)
UserDefaults.standard.set(notificationData, forKey: "someKeyChosenByYou")
Получить и удалить
let userDefaults = UserDefaults.standard
if let existingNotificationData = userDefaults.object(forKey: "someKeyChosenByYou") as? Data,
let existingNotification = NSKeyedUnarchiver.unarchiveObject(with: existingNotificationData) as? UILocalNotification {
// Cancel notification if scheduled, delete it from notification center if already delivered
UIApplication.shared.cancelLocalNotification(existingNotification)
// Clean up
userDefaults.removeObject(forKey: "someKeyChosenByYou")
}