2017-07-28 6 views
0

J'essaie d'implémenter la fonctionnalité dont il a besoin pour détecter si le périphérique se trouve dans la zone cible (geofence) ou non. S'il se trouve à l'intérieur de la région, il doit exécuter une tâche quel que soit son premier plan ou son arrière-plan.iOS RegionMonitoring sans modification significative de l'emplacement après le redémarrage du périphérique

J'ai été capable de comprendre la plupart des pièces et mis en œuvre.

Cependant, le défi est le cas où l'utilisateur redémarre le périphérique alors qu'il se trouve déjà à l'intérieur de la région et n'effectue aucune modification significative de l'emplacement.

Dans ce cas, il semble que iOS ne détecte pas si c'est à l'intérieur ou à l'extérieur. Ainsi, mon application ne fait rien au lieu d'exécuter la tâche.

Y at-il un moyen pour iOS de détecter automatiquement s'il se trouve à l'intérieur de geofence ou non après le redémarrage sans modification significative de l'emplacement?

Répondre

0

Vous devez d'abord appeler requestState(for:) sur la région que vous souhaitez consulter, notez ce fera une asynchrone qui consulte la réponse sera alors attraper par locationManager(_:didDetermineState:for:) (locationManager(_:didEnterRegion:) et locationManager(_:didExitRegion:)) donc si vous consultez un tableau de régions prennent cela en Compte.

var locationManager = CLLocationManager() 
// Do all proper setting for locationManager 
... 
// Here you make the asynchronous request for the state of a region 
locationManager.requestState(for: CLRegion()) // Your region 

func locationManager(_ manager: CLLocationManager, didDetermineState state: CLRegionState, forRegion region: CLRegion) { 
    switch state { 
     case .inside: 
     // It's inside the region 
     case .outside: 
     // It's outside 
     default: 
     // It's unknown 
    } 
} 

En résumé, requestState(for:) est l'équivalent de forcer un changement significatif sans bouger l'appareil afin que tous les autres délégués seront appelés ainsi, mais votre point d'intérêt est locationManager(_:didDetermineState:for:)

Source: https://developer.apple.com/documentation/corelocation/cllocationmanager/1423804-requeststate

+0

Merci pour la réponse, mais cette fonction de rappel n'est appelée que lorsque le périphérique iOS détecte un changement de position significatif. – androisojavaswift

+0

@androisojavaswift Essayez ma nouvelle approche maintenant et faites le moi savoir. –

+0

Merci pour les informations détaillées. Oui tu as raison. l'approche que vous suggérez fonctionne bien et j'utilise aussi la même approche que la vôtre. Mais l'approche ne fonctionne plus après le redémarrage de l'appareil car iOS ne lance pas automatiquement l'application en arrière-plan et déclenche requestState (pour :). J'ai donc besoin de comprendre comment déclencher requestState (pour :) en arrière-plan après le redémarrage de l'appareil mais sans relancer l'application par l'utilisateur. – androisojavaswift