2017-04-22 3 views
2

Je crée une application qui utilise des régions circulaires pour les géofences. Lorsque le téléphone est actif ou que l'application est ouverte, les notifications geofence fonctionnent correctement à la fois sur le simulateur et sur l'appareil (iPhone 6 10.3.1).Les alertes Geofence/les notifications locales ne réveillent pas le téléphone verrouillé lorsqu'il est déclenché

Dans le simulateur, cela fonctionne très bien; Lorsque l'utilisateur entre dans une région, il se réveille, émet un son et affiche une alerte sur l'écran de verrouillage. Sur le téléphone, les appels de délégué "didEnterRegion" sont effectués lors de la saisie de la région (j'enregistre certains messages) mais le téléphone ne fait pas d'alerte et se réveille. Lorsque j'appuie sur le bouton d'accueil une fois, je peux voir l'alerte sur l'écran de verrouillage, mais je veux qu'il se réveille et affiche l'alerte instantanément - comme quand je reçois un message. Cela fonctionne dans le simulateur, donc je me demande ce qui pourrait être faux? Il a fonctionné pour moi plusieurs fois, où l'alerte a été montrée sur le téléphone et ma montre, mais 95% du temps cela ne fonctionne pas - les notifications sont générées mais seulement visibles si je réveille manuellement le téléphone.

Comment résoudre ce problème?

Voici le code que j'utilise pour créer la notification locale:

 // https://blog.codecentric.de/en/2016/11/setup-ios-10-local-notification/ 


     let location = CLLocation(latitude: item.coordinate.latitude, longitude: item.coordinate.longitude) 
     GeoTools.decodePosition(location: location) { 
      (address, city) in 
      let content = UNMutableNotificationContent() 
      content.title = "Camera nearby!" 
      content.subtitle = item.id 
      content.body = "\(address), \(city)" 
      content.categoryIdentifier = Constants.notificationCategoryId 
      content.sound = UNNotificationSound.default() 
      content.threadIdentifier = item.id 

      // FIXME make action for clicking notification 

      let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 0.001, repeats: false) // FIXME HACK 

      let request = UNNotificationRequest(identifier: "camNotification", content: content, trigger: trigger) 

      let unc = UNUserNotificationCenter.current() 
      unc.removeAllPendingNotificationRequests() 
      unc.add(request, withCompletionHandler: { (error) in 
       if let error = error { 
        print(error) 
       } 
       else { 
        print("completed") 
       } 

      }) 

     } 

Répondre

1

Voici un code que je viens de vérifier réveille l'appareil lorsque la notification est présentée:

let message = "CLRegion event" 
// Show an alert if application is active: 
if UIApplication.shared.applicationState == .active { 
    if let viewController = UIApplication.shared.keyWindow?.rootViewController { 
     showSimpleAlertWithTitle(nil, message: message, viewController: viewController) 
    } 
} 
else { 
    // Otherwise app is in background, present a local notification: 
    let content = UNMutableNotificationContent() 
    content.body = message 
    content.sound = UNNotificationSound.default() 
    content.categoryIdentifier = "message" 

    let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 1.0, repeats: false) 
    let request = UNNotificationRequest(identifier: "com.foobar", content: content, trigger: trigger) 
    UNUserNotificationCenter.current().add(request, withCompletionHandler: nil) 
} 

Vraiment le seul diff est que je n'appelle pas removeAllPendingNotifications() donc si vous devez supprimer les notifications je me demande si removePendingNotificationRequests(withIdentifiers identifiers: [String]) pourrait être plus précis?