2017-04-20 7 views
2

Ich möchte meine lokale Benachrichtigungsfunktion erweitern, indem ich die Aktion "Später erinnern" hinzufüge. Mit anderen Worten, ich möchte eine Benachrichtigung nach einer bestimmten Zeit erneut anzeigen, wenn der Benutzer auf die Schaltfläche "Erinnere mich später" klickt.Funktion "Erinnere mich später" für lokale Benachrichtigungen

Auch wenn in meiner App alles korrekt verkabelt sein sollte (Überprüfung der Benachrichtigungen, Einstellung der Benachrichtigungskategorie und Delegierung, Funktion zur Erinnerung später erinnern), wird die nach dem Antippen der Schaltfläche Später erinnern eingeplante Benachrichtigung nicht angezeigt überhaupt.

Einstellung alles bis (Überprüfung von Berechtigungen, die Einrichtung von Kategorie)

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool { 

    UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound]) {(accepted, error) in 
     if !accepted { 
      print("Notification access denied.") 
     } 
    } 

    let action = UNNotificationAction(identifier: "remindLater", title: "Remind me later", options: []) 
    let category = UNNotificationCategory(identifier: "myCategory", actions: [action], intentIdentifiers: [], options: []) 
    UNUserNotificationCenter.current().setNotificationCategories([category]) 

    return true 
} 

Hahn Handling auf "Später erinnern"

@available(iOS 10.0, *) 
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping() -> Void) { 

    if response.actionIdentifier == "remindLater" { 
     let newDate = Date(timeInterval: 10, since: Date()) 
     scheduleNotification(at: newDate, withCompletionHandler: { 
      completionHandler() 
     }) 
    } 
} 

Actual-Code, der eine lokale Meldung einrichtet:

func scheduleNotification(at date: Date) { 
    let calendar = Calendar(identifier: .gregorian) 
    let components = calendar.dateComponents(in: .current, from: date) 
    let newComponents = DateComponents(calendar: calendar, timeZone: .current, month: components.month, day: components.day, hour: components.hour, minute: components.minute) 

    let trigger = UNCalendarNotificationTrigger(dateMatching: newComponents, repeats: false) 

    let content = UNMutableNotificationContent() 
    content.title = "Tutorial Reminder" 
    content.body = "Just a reminder to read your tutorial over at appcoda.com!" 
    content.sound = UNNotificationSound.default() 
    content.categoryIdentifier = "myCategory" 

    let request = UNNotificationRequest(identifier: date.description, content: content, trigger: trigger) 

    UNUserNotificationCenter.current().delegate = self 
    UNUserNotificationCenter.current().removeAllPendingNotificationRequests() 
    UNUserNotificationCenter.current().add(request) {(error) in 
     if let error = error { 
      print("Uh oh! We had an error: \(error)") 
     } 
    } 
} 

Was mache ich falsch? I am using AppCoda iOS 10 user notifications guide. und this is the sample code.

+0

Das Problem besteht darin, dass Sie für jede Benachrichtigung, die Sie planen, einen eindeutigen Bezeichner verwenden müssen. Sie können die Trigger-Datum Beschreibung –

+0

Dank @LeoDabus verwenden. Die Verwendung eindeutiger Bezeichner, wie die von Ihnen vorgeschlagene Beschreibung des Auslöserdatums, hat überhaupt nichts geändert. Es wird keine neue Benachrichtigung angezeigt. – Cesare

+0

Sie müssen Ihre App schließen, um die Benachrichtigung zu erhalten –

Antwort

2

Das Problem besteht darin, dass Sie für jede Benachrichtigung, die Sie planen, einen eindeutigen Bezeichner verwenden müssen. Sie können die Beschreibung des Auslöserdatums verwenden. Vergiss nicht, dass du deine App schließen musst, um die Benachrichtigung zu erhalten.

Verwandte Themen