web-dev-qa-db-ja.com

UserNotificationsがキャンセル、Swift3

ユーザーが毎日のローカル通知の時間を設定できるアプリに取り組んでいます。次に、これらの通知を有効または無効にするオプションがあります。すでに設定されている通知を無効化/キャンセルするにはどうすればよいですか?

この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")
        }
    })

ありがとう。

10
deniskakacka

保留中のすべての通知をキャンセルするには、次を使用できます。

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)
}
31
KrishnaCA

同じUNNotificationを識別する方法は、identifierを作成するときに渡されるUNNotificationRequestに基づいています。

上記の例では、

let request = UNNotificationRequest(identifier: "myNotif", content: notif, trigger: dateTrigger)

実際には、identifier"myNotif"にハードコーディングしました。このようにして、すでに設定されている通知を削除したいときはいつでも、これを行うことができます。

UNUserNotificationCenter.current().removePendingNotificationRequests(withIdentifiers: "myNotif")

ただし、識別子をハードコーディングする場合、requestUNUserNotificationCenterに追加するたびに、通知が実際に置き換えられることに注意してください。

たとえば、1分後に"myNotif"requestセットをスケジュールしたが、別の関数を呼び出して1時間後に"myNotif"をスケジュールした場合は置き換えられます。したがって、1時間後の最新の"myNotif"のみがpendingNotificationRequestに含まれます。

8
Zac Kwan