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!
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. –
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? –
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