2017-06-05 2 views
1

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

Antwort

0

Sie müssen nur den Timer ungültig machen und erneut einplanen. Versuche dies.

func startTimer(){ 
    stopTimer() 
    let timeInterval = 30.0 
    if isGrantedAccess { //allowed notification and timer off 
     timer = Timer.scheduledTimer(withTimeInterval: timeInterval, repeats: true, block: { (timer) in 
      self.sendNotification() 
     }) 
    } 
} 
+0

Dies funktionierte. Ich kann nicht glauben, dass es so einfach war. Es scheint, dass es beim Kodieren von Überlegen Norm ist –

Verwandte Themen