2017-01-17 1 views
0

Ich starte meine App und plane meine lokalen Benachrichtigungen. Dies ist eine vereinfachte Version des Codes, den ich benutze:Lokale Benachrichtigungen nach Neustart des Geräts

Sie auslösen, während meine App im Hintergrund ist. So weit, ist es gut.

Dann starte ich das Gerät neu. Ich zwinge nicht, die App zu beenden.
Und jetzt werden die Benachrichtigungen nicht mehr ausgelöst. Ich muss die App erneut öffnen.

Gibt es eine Möglichkeit, meine Zeitpläne den Neustart überleben zu lassen?

+1

Keine Möglichkeit – Vyacheslav

+0

Durch den Neustart des Geräts erzwingen Sie das Beenden der App. Sobald die App geschlossen wird, funktionieren lokale Benachrichtigungen nicht mehr. Sie müssen Push-Benachrichtigungen für dieses Szenario verwenden. – dlbuckley

+0

Sie haben vergessen zu erwähnen, _ welcher Teil Ihrer App_ die Benachrichtigung einrichtet; und ich gehe davon aus, dass deine App die lokale Benachrichtigung nicht setzt, wenn die App beendet wird - nur wenn sie in den Hintergrund wechselt. Es wäre großartig, wenn Sie Ihr OP erweitern und das bitte klären würden. – holex

Antwort

1

Die UNLocationNotificationTrigger ist eine neue Helper-Klasse, die in iOS10 hinzugefügt wurde, um das Auslösen von Benachrichtigungen basierend auf Beacon- oder Geofence-Erkennungen zu erleichtern. Gemäß der Dokumentation ist es entworfen, nur verwendet werden, wenn die Anwendung im Einsatz ist:

Apps Zugriff auf standortbezogene Dienste anfordern müssen und wenn in Use Rechte, um diese Klasse zu verwenden. Um die Berechtigung zur Verwendung von Standortdiensten anzufordern, rufen Sie die requestWhenInUseAuthorization() - Methode von CLLocationManager auf, bevor Sie standortbasierte Auslöser planen.

https://developer.apple.com/reference/usernotifications/unlocationnotificationtrigger

auf den obigen Berechtigungen Basierend, wird die App auslösen nur im Einsatz, wenn. Die Dokumentation sagt nicht explizit, dass es im Hintergrund nicht funktioniert, also versuchen Sie bitte immer Positionserlaubnis mit der requestAlwaysAuthorization() statt requestWhenInUseAuthorization() (achten Sie darauf, dass Sie den richtigen Schlüssel in Ihrem Plist, wenn Sie dies tun) , um zu sehen, ob das hilft.

Eine Alternative wäre nicht diese Hilfsklasse zu verwenden und CoreLocation und Bakenüberwachung zu starten, anstatt manuell, dann erstellen Sie Ihre eigenen UILocalNotification manuell, wenn Sie die Region Eintrag Rückruf erhalten:

func locationManager(_ manager: CLLocationManager, didEnterRegion region: CLRegion) { 
    if let region = region as? CLBeaconRegion { 
    let notificationMessage = "Wild IBEACON appeared!" 
    let notification = UILocalNotification() 
    notification.alertBody = notificationMessage 
    notification.alertAction = "OK" 
    UIApplication.shared.presentLocalNotificationNow(notification) 
    } 
} 

Der obige Ansatz ist bekannt über App-Neustarts hinweg funktionieren.

+0

WhenInUseAuthorization ist ausreichend, da der Benachrichtigungstrigger die App nicht startet . Und mein Code funktioniert bereits nach einem _app_ Neustart, aber nicht nach einem _device_ Neustart. In diesem Fall funktioniert weder mein Code noch dein Code. –

+0

Schließlich funktioniert es, aber es ist instabil.Manchmal dauert es einige Minuten und einige Bluetooth-Deaktivierungszyklen, bis es ausgelöst wird. –

Verwandte Themen