2016-07-28 23 views
0

Ich konnte hier auf SO oder anderswo keine Hilfe für mein Problem finden, also hoffe ich, dass jemand von euch mir helfen kann.Benutzer nach lokalen Benachrichtigungen fragen und Aufgaben danach ausführen - Swift 2.0

Ich versuche, die Funktionalität einer Erinnerung in meiner iOS App zu implementieren, die der Benutzer selbst aktiviert. Die Erinnerung ist eine lokale Benachrichtigung.

Ich frage den Benutzer nicht um Erlaubnis für lokale Benachrichtigungen, bis er die Erinnerung aktiviert. Danach muss ich überprüfen, ob der Benutzer die Berechtigungen erteilt und eine Benachrichtigung geplant hat.

Das Kernproblem hier ist, dass der Code die Ausführung der Methode "registerUserNotificationSettings" nicht beendet und auf das Ergebnis des kommenden UIAlertControllers wartet. Daher kann ich direkt nach dem Aufruf der Methode nicht nach Berechtigungen suchen. Ich möchte auch nicht beim ersten Start der App um Erlaubnis fragen, weil der Benutzer nicht weiß, warum meine App Benachrichtigungen senden sollte und ich denke, dass dies für den ersten Start und für eine optionale Funktion zu viel wäre.

Ich weiß von der Appdelegate Nachricht didRegisterUserNotificationSettings, die gesendet wird, nachdem die Frage beantwortet wurde. Eine Idee besteht darin, zuerst die Benachrichtigung in einer globalen Variablen zu speichern und sie zu planen, wenn die Berechtigung erteilt wurde. Aber das wäre zu viel Code, der ausgeführt wird, wenn die Benachrichtigung nicht einmal am Ende geplant ist.

Also suche ich nach einer Lösung, um den Benutzer um Erlaubnis zu fragen und dann zu entscheiden, ob ich die Benachrichtigung erstellen und planen soll oder nicht.

Das ist mein problematisch Stück Code in dem'value changed'-Ereignisse eines UISwitch, die nicht wie erwartet funktionieren:

//check if the app is allowed to send notifications or ask the user 
    var settingTypes = UIApplication.sharedApplication().currentUserNotificationSettings()?.types 
    if (settingTypes?.contains(.Alert) == false) { 
     let notificationSettings = UIUserNotificationSettings(forTypes: [.Alert, .Sound], categories: nil) 
     UIApplication.sharedApplication().registerUserNotificationSettings(notificationSettings) 

//get NotificationSettings again after the user was asked 
    settingTypes = UIApplication.sharedApplication().currentUserNotificationSettings()?.types 
    } 


//now check if if notifications are finally permitted 
    if (settingTypes?.contains(.Alert) == true) { 
     let notification = UILocalNotification() 
     * create notification * 
     UIApplication.sharedApplication().scheduleLocalNotification(notification) 
    } 
    else { 
     switchNotification.on = false 
    } 

Hat jemand eine Idee? Vielen Dank im Voraus

Antwort

1

Deklarieren ein Closure in AppDelegate

var userNotificationChanged: ((settings: UIUserNotificationSettings) -> Void)? 

und rufen Sie die closure wenn Benutzer registriert für notification

Ihre AppDelegatedidRegisterUserNotificationSettings unter

in
func application(application: UIApplication, didRegisterUserNotificationSettings notificationSettings: UIUserNotificationSettings) { 
    if (userNotificationChanged != nil) { 
     userNotificationChanged!(settings: notificationSettings) 
    } 
} 

Jetzt würde so aussehen Ihre.210 Fall UISwitch stellen Sie den closure und führen Sie Ihre gewünschte Aktion im Inneren:

(UIApplication.sharedApplication().delegate as! AppDelegate).userNotificationChanged = { (settings: UIUserNotificationSettings) -> Void in 

     //Schedule your notification here 
    } 
+0

Thank you very much! Das ist genau das, wonach ich gesucht habe. Ich bin neu zu schnell und habe schon über Schließungen gelesen, wusste aber nicht wirklich, wann ich sie benutzen sollte. Ich denke, ich kann sie jetzt auch in anderen Situationen verwenden. – Martin

-1

Setzen Sie diese einfachen Code in didFinishLaunchingWithOptions

if #available(iOS 8.0, *) 
{ 

    if application.respondsToSelector("isRegisteredForRemoteNotifications") 
    { 

     let types:UIUserNotificationType = ([.Alert, .Sound, .Badge]) 

     let settings:UIUserNotificationSettings = UIUserNotificationSettings(forTypes: types, categories: nil) 

     application.registerUserNotificationSettings(settings) 
     application.registerForRemoteNotifications() 
    } 

} 
else{ 
     let types: UIRemoteNotificationType = [.Alert, .Badge, .Sound] 
     application.registerForRemoteNotificationTypes(types) 
} 
+1

Ich verstehe nicht wirklich den ganzen Code, aber hast du meine ganze Frage gelesen? Ich habe geschrieben, dass ich den Nutzer beim ersten App-Start nicht um Erlaubnis fragen möchte. Es scheint, dass dies genau das ist, was dein Code macht, oder? Sonst kannst du bitte deinen Code ein wenig erklären? Vielen Dank – Martin