2016-11-12 75 views
4

我正在開發應用程序,其中用戶可以爲每天的本地通知設置時間,然後我可以選擇啓用或禁用這些通知。我的問題如何禁用/取消已設置的通知?UserNotifications cancel,swift3

在這裏,在這個國際單項體育聯合會,我需要取消通知符

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 
} 

這裏一個是進度和按鈕的功能在那裏我設置通知符。

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

謝謝。

+0

嗨,你可以檢查我的答案。隨意評論任何有關這個問題或我的回答的討論 – KrishnaCA

回答

16

取消所有待處理的通知,您可以使用此:

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) 
} 
+0

這可以幫助我很多,謝謝! – deniskakacka

+0

@deniskakacka,我希望這能回答你的問題 – KrishnaCA

+0

是的它現在工作。再次感謝 – deniskakacka

-3

如前所述here你可以取消所有通知用下面的代碼:

UIApplication.sharedApplication().cancelAllLocalNotifications()

5

方式相同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"它將被替換。因此,在一小時後只有最新的"myNotif"將在pendingNotificationRequest

+0

非常感謝。 – deniskakacka