ユーザーが毎日のローカル通知の時間を設定できるアプリに取り組んでいます。次に、これらの通知を有効または無効にするオプションがあります。すでに設定されている通知を無効化/キャンセルするにはどうすればよいですか?
このIFの1つで、notifをキャンセルする必要があります
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
if (indexPath as NSIndexPath).row == 1 && switchiBtn.isOn == false {
return 0.0
}
if (indexPath as NSIndexPath).row == 2 {
if switchiBtn.isOn == false || dpVisible == true {
return 0.0
}
return 216.0
}
if (indexPath as NSIndexPath).row == 3 {
if switchiBtn.isOn == false || dpVisible == true {
return 0.0
}
return 44
}
return 50.0
}
これが私がnotifを設定しているスケジュールとボタンの機能です。
func scheduleNotif(date: DateComponents, completion: @escaping (_ Success: Bool) -> ()) {
let notif = UNMutableNotificationContent()
notif.title = "Your quote for today is ready."
notif.body = "Click here to open an app."
let dateTrigger = UNCalendarNotificationTrigger(dateMatching: date, repeats: true)
let request = UNNotificationRequest(identifier: "myNotif", content: notif, trigger: dateTrigger)
UNUserNotificationCenter.current().add(request, withCompletionHandler: { error in
if error != nil {
print(error)
completion(false)
} else {
completion(true)
}
})
}
@IBAction func setACTION(_ sender: AnyObject) {
let hour = datePicker.calendar.component(.hour, from: datePicker.date)
let minute = datePicker.calendar.component(.minute, from: datePicker.date)
var dateComponents = DateComponents()
dateComponents.hour = hour
dateComponents.minute = minute
print(dateComponents)
scheduleNotif(date: dateComponents, completion: { success in
if success {
print("SUCCESS")
} else {
print("ERROR")
}
})
ありがとう。
保留中のすべての通知をキャンセルするには、次を使用できます。
UNUserNotificationCenter.current().removeAllPendingNotificationRequests()
特定の通知をキャンセルするには、
UNUserNotificationCenter.current().getPendingNotificationRequests { (notificationRequests) in
var identifiers: [String] = []
for notification:UNNotificationRequest in notificationRequests {
if notification.identifier == "identifierCancel" {
identifiers.append(notification.identifier)
}
}
UNUserNotificationCenter.current().removePendingNotificationRequests(withIdentifiers: identifiers)
}
同じUNNotification
を識別する方法は、identifier
を作成するときに渡されるUNNotificationRequest
に基づいています。
上記の例では、
let request = UNNotificationRequest(identifier: "myNotif", content: notif, trigger: dateTrigger)
実際には、identifier
を"myNotif"
にハードコーディングしました。このようにして、すでに設定されている通知を削除したいときはいつでも、これを行うことができます。
UNUserNotificationCenter.current().removePendingNotificationRequests(withIdentifiers: "myNotif")
ただし、識別子をハードコーディングする場合、request
をUNUserNotificationCenter
に追加するたびに、通知が実際に置き換えられることに注意してください。
たとえば、1分後に"myNotif"
request
セットをスケジュールしたが、別の関数を呼び出して1時間後に"myNotif"
をスケジュールした場合は置き換えられます。したがって、1時間後の最新の"myNotif"
のみがpendingNotificationRequest
に含まれます。