2017-02-14 1 views
1

J'ai une fonction publique pour la notification locale et je veux appeler cette fonction dans applicationWillTerminate. Quand j'essaye cela, rien ne se passe. Je suis sûr que la fonction de notification locale est ok parce que quand je l'appelle dans viewDidLoad, cela fonctionne correctement.Swift - Appel de la méthode de notification locale dans applicationWillTerminate


Ceci est la fonction pour la notification locale;

func scheduleLocalNotification(second: Double) { 

    if #available(iOS 10.0, *) { 
     let center = UNUserNotificationCenter.current() 

     let content = UNMutableNotificationContent() 
     content.badge = 1 
     content.title = "Title!" 
     content.body = "Message!" 
     content.categoryIdentifier = "id" 
     content.userInfo = ["key": "value"] 
     content.sound = UNNotificationSound.default() 

     let trigger = UNTimeIntervalNotificationTrigger(timeInterval: second, repeats: false) 

     let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: trigger) 
     center.add(request) 
    } else { 
     // Fallback on earlier versions 
    } 
} 

AppDelegate; J'ai recherché SO pour des problèmes similaires et trouvé 2 questions, mais aucune d'entre elles ne résout mon problème.

Send local notification after termination app swift 2

Local notification on application termination


Edit: demande d'autorisation;

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

     let launchedBefore = UserDefaults.standard.bool(forKey: "launchedBefore") 
     if (!launchedBefore) { 
      if #available(iOS 10.0, *) { 
       UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { (granted, error) in 
        if granted { 
         print("Authorization granted!") 
        } else { 
         print("Authorization not granted!") 
        } 
       } 
      } else { 
       let settings = UIUserNotificationSettings(types: [.alert, .badge , .sound], categories: nil) 
       UIApplication.shared.registerUserNotificationSettings(settings) 
      } 

      UserDefaults.standard.set(true, forKey: "launchedBefore") 
     } 

     // Override point for customization after application launch. 
     return true 
    } 
+0

Comment êtes-vous mettre fin à l'application pour tester cela? – Paulw11

+0

@ Paulw11 appuyez deux fois sur le bouton et se débarrasser de l'application. J'utilise aussi un vrai appareil pour tester. – THO

+0

Avez-vous 'requestAuthorization (options: completionHandler:)' quelque part plus tôt dans votre code? – rmp

Répondre

0

Une réponse à la deuxième question que vous avez lié à semble pertinent - applicationWillTerminate n'est pas garanti appelée en cas de système décide de mettre fin à votre application alors qu'il est en arrière-plan.

+0

Je termine l'application alors qu'elle est au premier plan comme d'habitude. – THO

0

juste une note à propos de applicationWillTerminate: comme le dit Apple, et "Uncommon" dit, il n'y a aucune garantie qui est appelée.

Mais je pense est un problème de conception:

a) si vous souhaitez ajouter une notification locale, faites-le dès que l'utilisateur a définir. B) si vous passez par "applicationWillTerminate" pour sauvegarder le temps d'appel du processeur "ajouter une notification" seulement à la sortie, assurez-vous qu'il n'y a pas de grosses notifications de pénalité à chaque fois. Comme un comportement standard, dans iOS, nous devrions tout sauvegarder dès que l'utilisateur est défini.

dans mes applications J'ajoute simplement une notification sur "retour" ou "fermer".

c) Assurez-vous de contrôler/réinitialiser les notifications déjà définies.

Si vous ne testez le comportement iOS, vous êtes en bord de coin, voir « Eskimo » réponse ici:

https://forums.developer.apple.com/thread/13557