iOS Geofence Clcircular Region monitoring. gestionnaire de l'emplacement: didExitRegion ne semble pas fonctionner comme prévu
je suis en train d'essayer d'obtenir mon application pour surveiller des régions particulières en utilisant CoreLocation
cependant je trouve qu'il ne semble pas fonctionner comme prévu, il me semble qu'il ne peut pas fonctionner avec un petit un petit rayon fixé pour chaque endroit c.-à-d. 10m.
j'ai aussi mis en place une petite application de test qui trace le rayon de cercle sur une carte afin que je puisse voir visuellement ce qui se passe.
le code que j'utilise pour la surveillance les emplacements sont les suivants:
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
// Set-up a region
CLLocationDegrees latitude = 52.64915;
CLLocationDegrees longitude = -1.1506367;
CLLocationCoordinate2D centerCoordinate = CLLocationCoordinate2DMake(latitude, longitude);
CLCircularRegion *region = [[CLCircularRegion alloc] initWithCenter:centerCoordinate
radius:10 // Metres
identifier:@"testLocation"];
[self.locationManager startMonitoringForRegion:region];
Je n'ai pas mis en place le code ici pour la région DidEnter
etc comme je sais que cela fonctionne quand je vais plus de 100m loin de la région surveillée.
voici un plan d'écran de l'application quand je suis bien au-dessus de 10 mètres de l'emplacement pourpre sur la carte, les événements de la région de sortie ne fonctionnent pas, cependant si je commute mon emplacement à Londres Il tire et aussi quand je mets mon emplacement retour à l'endroit où le bleu de l'emplacement est actuellement il déclenche également.
est-ce que quelqu'un sait s'il y a une limite avec le rayon de la région minimum ou peut-être que je fais quelque chose de mal.
Merci Aaron
9 réponses
Je ne pense pas que la surveillance de la région fonctionne bien pour un si petit rayon.
- la meilleure précision avec la puce GPS et
kCLLocationAccuracyBestForNavigation
est souvent à seulement 10 mètres. - Apple dit (dans le emplacement & cartes PG ) que la distance minimale pour les régions devrait être supposée être de 200m
- j'ai entendu dire que la surveillance de Région utilise le WiFi pour obtenir sa position (ce qui a du sens pour la puissance Savings.) La précision WiFi est plus comme 20m-100m. Je ne suis pas sûr que le fait d'avoir une autre application utilisant la localisation de l'arrière-plan (C'est-à-dire utilisant le GPS) puisse affecter cela. Probablement, le gestionnaire d'emplacement partagerait l'information pour améliorer l'exactitude. La surveillance de la région
- peut prendre 30 secondes pour tirer une fois à l'intérieur d'une région, et quelques minutes pour tirer après avoir quitté une région (pour éviter que des problèmes de localisation ne la déclenchent).
- lorsque la région-surveillance a été pour la première fois ils ont ajouté que cela ne fonctionnerait qu'avec des régions de 100 m et que tout ce qui serait plus petit serait augmenté. Cela arrive probablement toujours.
- il y a une méthode dépréciée
startMonitoringForRegion:desiredAccuracy:
qui vous a permis de spécifier la distance au-delà de la frontière de la région pour commencer à générer des notifications. Cette caractéristique a probablement été transformée enstartMonitoringForRegion:
, mais elle est toujours présente. Une région de 10m pourrait finir avec un tampon de 10m. - si vous voulez faire ceci, spécifiez un plus grand région autour de l'endroit où vous voulez surveiller, et quand l'appareil se réveille dans cette région, démarrez les mises à jour de la position de fond (GPS) et utilisez
CLCircularRegion
's-containsCoordinate:
pour déclencher quand l'appareil est à moins de 10m manuellement. Cette méthode est officiellement sanctionnée par Apple (voir WWDC 2013 Session 307).
De la CLCircularRegion
docs:
rappelez-vous que le gestionnaire d'emplacement ne génère pas de notifications immédiatement après avoir traversé une frontière de région. Elle applique plutôt des critères de temps et de distance pour s'assurer que le passage à niveau était prévu et devrait véritablement déclencher une notification. Ainsi, choisissez un point central et un rayon qui sont appropriés et vous donner assez de temps pour alerter l'utilisateur.
De la Emplacement Et de Cartes PG :
les événements de la région peuvent ne pas se produire immédiatement après la limite d'une région est traverser. Pour éviter les notifications erronées, iOS ne délivre pas de notifications de région tant que certaines conditions de seuil ne sont pas remplies. Plus précisément, l'emplacement de l'utilisateur doit franchir la limite de la région, s'éloigner de cette limite par une distance minimale et demeurer à cette distance minimale pendant au moins 20 secondes avant que les avis ne soient signalés.
Les distances seuils spécifiques sont déterminées par le matériel et les technologies de localisation actuellement disponibles. Par exemple, si le Wi-Fi est désactivé, la surveillance de la région est beaucoup moins précise. Toutefois, aux fins d'essai, on peut supposer que la distance minimale est d'environ 200 mètres.
il y a plus à l'intérieur de scoop de ce billet de Kevin McMahon , qui a demandé aux ingénieurs de L'emplacement central à propos de la surveillance de la région dans un laboratoire à la WWDC 2012. Cette information aura changé dans l'intervalle, mais la partie sur les catégories de région est intéressant. Voici une édition:
Beaux-Région (0 - 150m)
- Avec un plancher de 100m, la portée de cette catégorie est de 100 à 150m.
- Pour les régions cette performance de taille dépend fortement du matériel de localisation
- Le temps qu'il faut à L'emplacement central pour détecter et appeler la méthode de délégation appropriée est d'environ 2-3 quelques minutes en moyenne après que la limite de la région a été franchie.
- Certains développeurs ont compris indépendamment que les petites régions verraient des rappels plus rapides et regrouperaient des régions plus petites pour couvrir une grande zone afin d'améliorer les notifications de passage de région.
Cela semble être un bug dans CLLocationManager
. J'ai fait des tests approfondis en utilisant diverses configurations de rayon de région et locationManager:didExitRegion
ne se déclenche pas d'une manière attendue. Cela semble être soit un bogue plutôt désagréable, soit la surveillance de la région ne se produit pas du tout comme la documentation le suggère. J'ai mis le harnais d'essai à la disposition de tous ceux qui le veulent:
http://www.mediafire.com/download/x863zkttltyalk6/LocationTest.zip
lancez-le dans le simulateur et commencez le test en sélectionnant Debug - > Location - > Freeway Drive dans le menu iOS simulator. Le nombre que vous voyez est la distance du centre de la région surveillée. La couleur de fond sera verte alors que l'appareil se trouve dans la région surveillée et rouge lorsqu'il est à l'extérieur de la région. Le texte au-dessous de la distance sont des journaux d'événements.
après avoir lancé l'application, vous devriez voir locationManager:didExitRegion
feu à 5319 mètres de la zone surveillée. L'itinéraire fera une boucle toutes les 37 minutes et vous verrez l'appareil sortir de la région toujours à 5319 mètres.
j'ai soumis un radar avec Apple (17064346) . Je mettrai à jour cette réponse une fois que j'aurai eu de leurs nouvelles. Au moins, nous aurons des données de la source canonique.
voici le texte détaillé envoyé à Apple:
à l'Aide de une application test sur le simulateur iOS ainsi que sur un iPhone 5s le CLLocationManager ne semble pas utiliser les callbacks de didExitRegion dans un de la manière prévue. Indépendamment du rayon de la région circulaire étant surveillé, le rappel n'aura lieu qu'à partir d'un seuil d'environ 5000 mètres est atteint.
étapes pour reproduire:
1. Lancez l'application ci-jointe
2. Démarrez le suivi de la région en sélectionnant Debug - > Location - > Freeway Entraînement dans le simulateur iOS
3. Surveiller l'application. Le grand # indique la distance du centre de la région observée.
4. Après environ 190 secondes et 5300 mètres didExitRegion va enfin tirer.
Sat problème ne semble pas lié à la taille de la région. Selon le Apple docs , même les petites régions sont soutenues:
dans iOS 6, les régions avec un rayon entre 1 et 400 mètres fonctionnent mieux sur iPhone 4S ou des appareils plus récents. (Dans iOS 5, les régions avec un rayon entre 1 et 150 mètres fonctionnent mieux sur iPhone 4S et appareils postérieurs.) Sur ces appareils, une application peut s'attendre à recevoir de la région notification entrée ou région sortie dans un délai de 3 à 5 minutes le en moyenne, si pas plus tôt.
bien que les événements régionaux ne se produisent pas instantanément, ils devraient arriver assez rapidement. Du Apple docs :
les événements de la région peuvent ne pas se produire immédiatement après la limite d'une région est traverser. Pour prévenir les fausses notifications, iOS ne délivre pas de région notifications jusqu'à ce que certaines conditions minimales soient remplies. Plus précisément, l'emplacement de l'utilisateur doit traverser la région de la frontière, se déplacer loin de la frontière par une distance minimale, et rester à ce minimum distance d'au moins 20 secondes avant les notifications signaler.
ce n'est pas du tout ce que je vois dans le harnais d'essai. Sur le simulateur, le dispositif sera toujours à plus de 5000 mètres de la région avant qu'un événement locationManager:didExitRegion
ne se produise.
j'aime les réponses par Michael et Nevan. Je voudrais ajouter plus d'informations à partir de mon expérience personnelle/opinion dans le développement application iOS basée sur L'emplacement avec surveillance de Région et aussi mettre en évidence certains points importants: -
soyez réaliste sur la Région de Suivi
surveillance de Région utilise le système de positionnement mondial (GPS), Wifi et d'autres technologies déterminer si le dispositif est à l'intérieur ou à l'extérieur de la région contrôlée. N'oubliez pas que notre terre fait 510 kilomètres carrés et qu'environ 30% sont des terres (149 millions de km2). C'est un vaste domaine. Vous vous souvenez de la récente affaire du vol MH370? Notre technologie actuelle la plus avancée ne pouvait même pas identifier une région estimée de cet avion manquant.
si vous souhaitez surveiller pour une petite région avec seulement rayon de 10 mètres . Il pourrait éventuellement fonctionner à l'intérieur d'un très dense ville avec beaucoup de tours cellulaires et zones wifi connectés. Mais dans le même temps, le signal pourrait être bloqué par des tours de grande hauteur, ce qui pourrait causer la perte du signal pendant quelques secondes/minutes, ce qui causerait le retard dans la transmission de la notification.
donc, vous devez vraiment considérer l'information ci-dessus avant de décider de la taille de la région que vous voulez surveiller. Personnellement, je pense que le rayon de 10 mètres est trop petit.
Nombre de régions contrôlées
la technologie de localisation de base actuelle peut seulement surveiller jusqu'à 20 régions maximum sur une seule application. Veillez à ce que les régions contrôlées ne soient pas trop proches les unes des autres.
j'ai personnellement testé 3 régions qui sont d'environ 100 mètres de rayon et qui sont à environ 200 mètres l'une de l'autre. Parfois je peux obtenir des notifications de toutes ces 3 régions quand je conduis par leur intermédiaire, mais parfois, je ne peux obtenir la notification que de la première région seulement. Quelle pourrait être la raison? Je ne pouvais pas savoir. Les régions pourraient être trop proches les uns des autres. Ou les antennes relais décident que mon appareil ne se trouve pas dans la zone de surveillance.
il y avait une personne sur StackOverFlow qui veut surveiller 1800 points sur notre Terre. Ne soyez pas comme lui car il est tout à fait irréaliste et ne comprend probablement pas la limitation de l'actuel Core Location
technologie. Lien : Vérifier si l'utilisateur se trouve à proximité de certains points
Affiner La LocationManager
si votre application a besoin de surveiller une petite zone ou a besoin de la mise à jour de l'emplacement fréquemment. Voici les propriétés potentielles de votre gestionnaire d'emplacement.
self.locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
self.locationManager.distanceFilter = kCLDistanceFilterNone;
self.locationManager.activityType = CLActivityTypeAutomotiveNavigation;
kCLLocationAccuracyBestForNavigation
consommera plus de batterie que kCLLocationAccuracyBest
. Mais, il sera plus précis.
j'ai trouvé un problème dans surveillance de région dans iOS 7 quand il y a plusieurs notifications déclenchées en même temps dans différentes régions surveillées. J'ai trouvé une solution pour filtrer de ce problème. Pour plus d'informations, veuillez visiter: Région suivi Glitch sur iOS 7-Notifications multiples en même temps
ne soyez pas trop ambitieux
Vous pourriez avoir utilisé certaines applications qui peuvent contrôler une petite région et sont très précises, et à aviser votre le même deuxième étape vous dans la région. Et vous avez l'inspiration de développer la même application pour rivaliser avec eux. Mais comprenez-vous ce qui se passe derrière la scène? Quelles autres technologies utilisent-ils? Et quels partenaires qu'ils collaborent avec?
j'ai fait quelques recherches et découvert que certains de la les technologies qu'ils utilisent ne sont pas disponibles publiquement. Certaines de ces entreprises sont lourdement financées et pourraient payer une prime aux entreprises de télécommunications afin d'obtenir la meilleure précision de localisation pour la meilleure expérience utilisateur. Je ne comprends pas les détails sur la façon dont il fonctionne. Je crois que la plupart de la détermination de l'emplacement est en fait sur l'extrémité du serveur (back end), pas sur le mobile (front end).
ainsi, les applications qui sont développées par ces entreprises non seulement peuvent le meilleur emplacement précis, mais aussi ne consomme pas beaucoup de batterie.
NOTE : je veux juste partager mes 2 cents. L'information ci-dessus se compose de mon expérience et de mon opinion personnelle. Il pourrait ne pas être à 100% exact car je suis encore en apprentissage Core Location et Region Monitoring .
je suis d'accord avec Michael G. Emmons , et l'envie de partager mon expérience aussi:
j'ai testé mon code avec trois régions comme montré dans l'image ci-dessous:
expliquer le comportement:
- mon emplacement actuel Est Région-1, et je commence à surveiller pour le ci-dessus trois régions et appel à demande d'état pour la région, pour déterminer, s'il y a une région à l'intérieur, où je me trouve actuellement.
- puis je reçois des notifications "Enter", pour les deux premières régions (Région-1, et Région 2), mais il ne devrait détecter la Région-1.
- Maintenant, lorsque j'entre dans la Région-2, j'obtiens la notification Enter pour la Région-3. mais je devrais obtenir la notification pour la Région-2 ici.
- maintenant quand j'entre dans la Région - 1 encore une fois, je fais démarrer l'événement de sortie pour la Région-3, et ce continuer.
- mais je ne reçois pas D'événements Entrée/Sortie pour les deux premières régions, jusqu'à ce que je me déplace au moins à plus de 7Km-10Km loin des deux premières régions.
Comportement Attendu: - L'événement entrée/sortie ne doit être déclenché que lorsque je franchis la limite des régions, ou à l'intérieur des régions, pas avant 500 mètres de la région.
Mon Hypothèse:
- ce que j'ai remarqué après toute l'expérience, que lorsque j'appelle "requestStateForRegion" pour l'ensemble des trois régions,
- il détecte toutes les régions à l'intérieur de la région de rayon 5000m, thats pourquoi il détecte les deux premières régions en même temps (Région-1 Créer un cercle de 5000m de rayon, et la Région-2 vient dans sa gamme, thats pourquoi région -2 est également détecté).
- et lorsque l'utilisateur se déplace beaucoup plus de 10Km, leurs événements de sortie seront appelés et lorsque l'utilisateur revient dans ces régions, à leur Entrée événement sera déclenché. C'est le même cas que celui expliqué par Aaron Wardle ci-dessus.
- Région-3 est détecté, parce que, lorsque l'utilisateur entre dans la Région-1, c'est à dire. 8-9km loin de la Région-3, donc l'événement de sortie est déclenché pour cela, et lorsque l'utilisateur est sur la route pour la Région-2, ici même lorsque la Région-3 est de 5000 mètres loin, encore il détecte la Région-3 et le feu, entrer événement pour la Région-3.
donc je pense que toutes les régions à l'intérieur de 5000 mètres sont détectées, et que l'utilisateur s'éloigne de 10 km de la région détectée, son événement de sortie sera tiré. dans le cas contraire, si l'utilisateur se trouve dans la plage de 5Km, il ne l'appellera plus jamais événements Entrée/Sortie.
s'il vous plaît me mettre à jour sur, si quelqu'un a corrigé cette question, ou des documents Apple n'importe où sur cette question.
c'est plutôt un commentaire important. De Région de surveillance et iBeacon
Test d'une Application iOS de la Région en charge la Surveillance de
lors de l'essai du code de surveillance de votre région dans un simulateur iOS ou sur un appareil, se rendre compte que les événements de la région peuvent ne pas se produire immédiatement après un région frontière est franchie. Pour prévenir les fausses notifications, iOS ne délivre pas de notification de région jusqu'à ce que certains seuil les conditions sont remplies. Plus précisément, l'emplacement de l'utilisateur doit limite de la région, s'éloigner de la limite par une distance minimale, et restent à cette distance minimale pendant au moins 20 secondes avant la les notifications sont signalées .
les distances seuils spécifiques sont déterminées par le matériel et les technologies de localisation actuellement disponibles. Exemple, si Wi-Fi est handicapé, région le suivi est beaucoup moins précis . Cependant, pour des fins de test, vous pouvez supposer que le la distance minimale est d'environ 200 mètres .
Sons comme même 1 mètre de travail (et de travailler mieux sur l'iPhone 4S+ périphériques):
startMonitoringForRegion:
(...)
dans iOS 6, les régions avec un rayon entre 1 et 400 mètres fonctionnent mieux sur iPhone 4s ou appareils plus récents. (Dans iOS 5, les régions avec un rayon entre 1 et 150 mètres fonctionnent mieux sur iPhone 4S et appareils postérieurs.) Sur ces dans le cas des appareils, une application peut s'attendre à recevoir la notification appropriée de la région saisie ou de la région quittée dans un délai moyen de 3 à 5 minutes, sinon plus tôt.
basé sur la réponse de @Nevan, qui a indiqué une sorte de couverture dans WWDC 2013 307 (qui n'a pas abordé directement cette question), j'ai trouvé une solution raisonnable pour obtenir < 10M précision pour l'arrivée à un endroit, bien que j'ai le sentiment que la mise en œuvre de -(void)locationManager:didVisit:
pourrait rendre cette batterie plus conservatrice, mais fournirait des mises à jour moins fréquentes.
D'abord, avoir certaines régions avec 0..Rayon de 150m, et commencez la surveillance. Ça n'a pas vraiment d'importance, car le système semble les déclencher à environ 150~200m:
_locationManager = [[CLLocationManager alloc] init];
_locationManager.delegate = self;
CLCircularRegion *region = [[CLCircularRegion alloc] initWithCenter:CLLocationCoordinate2DMake(location.lat, location.lng) radius:50 identifier:location.name];
[_locationManager startMonitoringForRegion:region];
puis, mettre en œuvre
-(void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region {
for (CLCircularRegion *enteredRegion in _locationManager.monitoredRegions.allObjects) {
if ([enteredRegion.identifier isEqualToString:region.identifier]) {
self.locationManager.activityType = CLActivityTypeFitness;
self.locationManager.distanceFilter = 5;
[self.locationManager startUpdatingLocation];
break;
}
}
}
le système commencera à surveiller et à signaler à votre délégué un flux d'emplacements, même si votre application est suspendue (besoin de UIBackgroundModes
pour inclure location
élément de tableau).
pour vérifier si l'un de ces emplacements se trouve au centre d'une de vos régions, mettez en œuvre:
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations {
CLLocation *firstLocation = [locations firstObject];
CGFloat const DESIRED_RADIUS = 10.0;
CLCircularRegion *circularRegion = [[CLCircularRegion alloc] initWithCenter:firstLocation.coordinate radius:DESIRED_RADIUS identifier:@"radiusCheck"];
for (CLCircularRegion *enteredRegion in _locationManager.monitoredRegions.allObjects) {
if ([circularRegion containsCoordinate:enteredRegion.center]) {
[_locationManager stopUpdatingLocation];
NSLog(@"You are within %@ of %@, @(DESIRED_RADIUS), enteredRegion.identifier);
break;
} else if ([enteredRegion containsCoordinate:circularRegion.center]) {
NSLog(@"You are within the region, but not yet %@m from %@", @(DESIRED_RADIUS), enteredRegion.identifier);
}
}
}
vous voudrez aussi à mettre en œuvre:
-(void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region {
[_locationManager stopUpdatingLocation];
}
au cours des derniers jours iv'e testé une fonctionnalité de géofençage sur mon appareil iOS 8.1 (iPhone 5S) pour une application iv'e développé.
L'app enregistre peu de régions auprès du service gefence de l'iOS. La logique de l'application exige que chaque rayon de géofence soit entre 40 et 80 mètres.
Je vois jusqu'ici que dans les zones avec un plus grand nombre de tours cellulaires et de points chauds Wifi, la détection de géofence est assez bonne à l'entrée des régions. C'est, dans les zones centre-ville, la détection de géofence fonctionne très bien.
malheureusement, le contraire se produit dans les régions où il y a peu de tours de téléphonie cellulaire et de réseaux wifi. Mon quartier, par exemple, est d'environ 1000 mètres de largeur et 500 hauteur (1 km x 0,5 KM), et il ya pas de tours de cellules dans elle . On pense qu'il y a peu de tours de cellules, sur le périmètre qui entoure le quartier. Malheureusement dans le périmètre du quartier le service de géofence détecte rien de .
inutile de dire que je teste avec Wifi activé sur l'appareil.
quand je teste mon application sur Android: le service de géofençage sur android 4.3, 4.4 & 5.1 fonctionne beaucoup mieux que sur iOS. Le service de géolocalisation Android ne détecte pas 100% des transitions de région, mais il détecte 50% -90% des transitions de région.
je conclus ce qui suit: S'il y avait eu plus de tours de téléphonie cellulaire et de points D'accès Wifi et si Apple avait amélioré le service geofence, alors la détection sur les appareils iOS aurait été aussi bonne que sur Android.
Geofencing fonctionne par détection d'un utilisateur à se déplacer à partir d'un réseau de cellules de tour à un autre réseau de cellules de tour.
par conséquent, la plus petite zone que vous pouvez définir est dictée par la proximité des tours de téléphonie cellulaire.
à l'intérieur d'un centre commercial ou d'un stade de sport, il pourrait être en mesure de faire 10 mètres - les tours de cellules sont souvent très proches les uns des autres. Dans une région, tout ce qui est inférieur à 100km peut échouer.
si vous avez besoin de plus petit zones, vous devez utiliser bluetooth au lieu de tours de cellules (iBeacons). S'il y a un dispositif de basse énergie bluetooth dans la zone cible, vous pouvez régler la portée à très courte (centimètres) ou assez grande (jusqu'à 30 mètres environ). Notez que tout dépend de la qualité du matériel iBeacon, certains sont meilleurs que d'autres.
malheureusement bluetooth (version 4.0 ou plus récente) et les tours de réseau de cellules sont le seul moyen de surveiller les emplacements sans batterie vidangeant de manière significative. Keeping le GPS actif pour vérifier une limite de 10 mètres viderait la batterie complètement à plat en environ 2 heures, même avec l'écran éteint.