Wenn der Startknopf gedrückt wird, wird meine Benachrichtigung weiterhin alle 30 Sekunden deaktiviert. Ich möchte es so machen, dass jedes Mal, wenn der Benutzer den Startknopf drückt, der Countdown zurückgesetzt wird und die Benachrichtigung nur in den 30 Sekunden nach dem Start des Knopfes erscheint. Wenn der Benutzer die Startschaltfläche vor Ablauf der 30 Sekunden unendlich oft drückt, wird der Benutzer die Benachrichtigung nie sehen.Verzögerung/Entprellen der Benachrichtigung beim Timer (swift3)
import UIKit
import UserNotifications
class ViewController: UIViewController,UNUserNotificationCenterDelegate {
var isGrantedAccess = false
private var timer = Timer()
func startTimer(){
let timeInterval = 30.0
if isGrantedAccess && !timer.isValid { //allowed notification and timer off
timer = Timer.scheduledTimer(withTimeInterval: timeInterval, repeats: true, block: { (timer) in
self.sendNotification()
})}}
func stopTimer(){
//shut down timer
timer.invalidate()
//clear out any pending and delivered notifications
UNUserNotificationCenter.current().removeAllPendingNotificationRequests()
UNUserNotificationCenter.current().removeAllDeliveredNotifications()
}
func sendNotification(){
if isGrantedAccess{
let content = UNMutableNotificationContent()
content.title = "HIIT Timer"
content.body = "30 Seconds Elapsed"
content.sound = UNNotificationSound.default()
content.categoryIdentifier = "timer.category"
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 0.001, repeats: false)
let request = UNNotificationRequest(identifier: "timer.request", content: content, trigger: trigger)
UNUserNotificationCenter.current().add(request) { (error) in
if let error = error{
print("Error posting notification:\(error.localizedDescription)")
}}}}
@IBAction func startButton(_ sender: UIButton) {
startTimer()
}
func timeString(time:TimeInterval) -> String {
let minutes = Int(time)/60 % 60
let seconds = Int(time) % 60
return String(format: " %02i : %02i", minutes, seconds)
}
override func viewDidLoad() {
super.viewDidLoad()
UNUserNotificationCenter.current().delegate = self
UNUserNotificationCenter.current().requestAuthorization(options: [.alert,.sound]) { (granted, error) in
self.isGrantedAccess = granted
}
let stopAction = UNNotificationAction(identifier: "stop.action", title: "Stop", options: [])
let timerCategory = UNNotificationCategory(identifier: "timer.category", actions: [stopAction], intentIdentifiers: [], options: [])
UNUserNotificationCenter.current().setNotificationCategories([timerCategory])
}
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping() -> Void) {
if response.actionIdentifier == "stop.action"{
stopTimer()
}
completionHandler()
}
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
completionHandler([.alert,.sound])
}}
Dies funktionierte. Ich kann nicht glauben, dass es so einfach war. Es scheint, dass es beim Kodieren von Überlegen Norm ist –