2017-07-28 9 views
0

Ich habe ein lokales Benachrichtigungssystem eingerichtet, sodass ich jeden Tag zu einer bestimmten Zeit eine Benachrichtigung auslösen kann. Diese Zeit wird vom Benutzer bestimmt und ich speichere sie als String. Ich werde alle Schritte, die ich im Code ausgeführt habe, aufschlüsseln, aber im Grunde ist mein Problem, dass die Benachrichtigung nicht ausgelöst wird.Kalenderbasierte lokale Benachrichtigung funktioniert nicht - Swift 3

Schritt 1: In diesem Schritt, den ich Setup eine Warnung Erlaubnis zu bitten, eine Benachrichtigung zu senden:

let center = UNUserNotificationCenter.current() 
let options: UNAuthorizationOptions = [.alert, .badge, .sound] 
center.requestAuthorization(options: options) { (granted, error) in 
    if granted { 
     application.registerForRemoteNotifications() 
    } 
} 

Schritt 2: In diesem Schritt, den ich Setup die Funktion nenne ich eine Benachrichtigung senden:

static func sendNotification(stringDate: String) { 
     let dateFormatter = DateFormatter() 
     dateFormatter.dateFormat = "HH:mm" 

     let content = UNMutableNotificationContent() 
     content.title = "Title" 
     content.body = "Detail" 
     content.badge = 1 

     if let date = dateFormatter.date(from: stringDate) { 
      let calendar = Calendar.current 

      let hour = calendar.component(.hour, from: date) 
      let minute = calendar.component(.minute, from: date) 

      var dateComponents = DateComponents() 
      dateComponents.hour = hour 
      dateComponents.minute = minute 

      let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponents, repeats: true) 
      let request = UNNotificationRequest(identifier: "dateDone", content: content, trigger: trigger) 

      UNUserNotificationCenter.current().add(request, withCompletionHandler: nil) 
     } 
    } 

Schritt 3: ich diese Funktion rufen Sie dann in meine app-Delegaten-Datei wie folgt:

func applicationDidEnterBackground(_ application: UIApplication) { 
    let defaults = UserDefaults.standard 
    if defaults.object(forKey: "currentUser") != nil { 
     if User.current.desiredTimeForNews.characters.contains("A") { 
      let stringToBeConverted = User.current.desiredTimeForNews.replacingOccurrences(of: "AM", with: "") 
      HelperFunctions.sendNotification(stringDate: stringToBeConverted) 

     } else { 
      let stringToBeConverted = User.current.desiredTimeForNews.replacingOccurrences(of: "PM", with: "") 
      HelperFunctions.sendNotification(stringDate: stringToBeConverted) 
     } 
    } 
} 

WICHTIG: Wie Sie in meiner Funktion sehen können, nehme ich einen Parameter "stringDate". Diese Variable hat einen String-Wert meines Datums. Ich wandle das dann in einen Datumswert um. Durch die Verwendung von Haltepunkten und Druckanweisungen habe ich gesehen, dass alle meine Werte, einschließlich Datum, Stunde, Minute usw., allesamt NULL sind.

Insgesamt ist mein Problem, dass die Benachrichtigung nie gesendet wird. Ich weiß jedoch, dass es aufgerufen wird, da ich Breakpoints benutzt habe, um das zu beweisen. Jede Hilfe wäre willkommen!

+0

Nach der Benachrichtigung hinzufügen, sollten Sie 'UNUserNotificationCenter.current() getPendingRequests' aufrufen und überprüfen, ob Ihre Anmeldung zusammen mit der Überprüfung der nächsten hinzugefügt tatsächlich wurde fireoate der Benachrichtigung. –

+0

Es wurde hinzugefügt. Nach dem Hinzufügen zeigte es mir die korrekte Anfrage mit dem korrekten Stunden- und Minutenwert. Könnte das Problem sein, dass ich das auf einem Simulator ausführe? –

+0

Ich habe viele Tests auf dem Simulator ausgeführt und sie funktionieren, obwohl zeitweise es nicht funktioniert. Um klar zu sein, wie lauten die Benachrichtigungseinstellungen in der App "Einstellungen"? – AlexK

Antwort

0

Für mich persönlich, ich lief es auf einem echten Gerät und es hat funktioniert. Obwohl es an einem Simulator funktionieren sollte, tat es das nicht für mich. Also würde ich versuchen, es auf einem echten Gerät laufen zu lassen, bevor ich etwas anderes ansehe!

0

Der Code scheint in Ordnung zu sein. Sollte am Gerät und auch am Simulator funktionieren. Meine Vermutung ist, dass Sie ein Zeitzonenproblem entweder mit der calendar.timezone oder dateformatter.timezone haben. Dann passiert die Auslösezeit nur zu einer anderen Zeit, dann was Sie erwarten würden. Fügen Sie diese Überprüfung unten nach dem Setup, um die Details zu sehen.

UNUserNotificationCenter.current() 
.getPendingNotificationRequests(completionHandler: { requests in 
    for (index, request) in requests.enumerated() { 
    print("notification: \(index) \(request.identifier) \(request.trigger)") 
    } 
    }) 
Verwandte Themen