J'essaie actuellement d'get mon application pour surveiller des régions particulières en utilisant CoreLocation
mais je trouve qu'il ne semble pas fonctionner comme prévu, il me semble qu'il ne peut pas fonctionner avec un petit rayon de jeu pour chaque location, c'est-à-dire 10m.
J'ai également mis en place une petite application de test qui trace le rayon du cercle sur une carte afin que je puisse voir visuellement ce qui se passe.
Le code que j'utilise pour surveiller les locations est le suivant:
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, car je sais que cela fonctionne quand je vais à plus de 100m de la région surveillée.
Voici une capture d'écran de l'application quand je suis à plus de 10 mètres de l'endroit violet sur la carte, les events de sortie ne tirent pas, cependant si je change d' location à Londres, il se triggers et aussi quand je définis ma position return à l'endroit où l'location bleu est actuellement, il se triggers également.
Est-ce que quelqu'un sait s'il y a une limite avec le rayon de région minimum du tout ou peut-être que je fais quelque chose de mal.
Merci Aaron
Je ne pense pas que la surveillance régionale fonctionnera bien pour un rayon aussi petit.
kCLLocationAccuracyBestForNavigation
est souvent de seulement 10 mètres. startMonitoringForRegion:desiredAccuracy:
qui vous permettait de spécifier la distance au-delà de la bordure de la région pour commencer à générer des notifications. Vraisemblablement, cette fonctionnalité a été déployée dans startMonitoringForRegion:
mais est toujours là. Une région de 10 m peut se refind avec un tampon de 10 m. CLCircularRegion
de CLCircularRegion
-containsCoordinate:
pour triggersr quand l'appareil est dans 10m manuellement. Cette méthode est officiellement sanctionnée par Apple (voir WWDC 2013 Session 307). À partir des documents CLCircularRegion
:
N'oubliez pas que le gestionnaire de position ne génère pas de notifications immédiatement après avoir traversé une limite de région. Au lieu de cela, il applique des critères de time et de distance pour s'assurer que le passage était prévu et devrait véritablement triggersr une notification. Choisissez donc un point central et un rayon appropriés et laissez-vous suffisamment de time pour alerter l'user.
De la PG de Location & Maps :
Les events de région peuvent ne pas se produire immédiatement après le franchissement d'une limite de région. 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'location de l'user doit traverser la limite de la région, s'éloigner de la limite d'une distance minimale et restr à cette distance minimale pendant au less 20 secondes avant que les notifications soient signalées.
Les distances de seuil spécifiques sont déterminées par le matériel et les technologies de localization actuellement disponibles. Par exemple, si le Wi-Fi est désactivé, la surveillance de la région est nettement less précise. Cependant, à des fins de test, vous pouvez supposer que la distance minimale est d'environ 200 mètres.
Kevin McMahon , qui a interrogé les ingénieurs de Core Location au sujet de la surveillance de la région dans un laboratoire de la WWDC 2012, a ajouté que cette information a changé entre-time, mais la partie concernant les catégories de régions est intéressante. Voici une modification:
Région Fine (0 – 150m)
– Avec le sol de 100m, la gamme de cette catégorie est effectivement de 100-150m.
– Pour les régions, cette performance est fortement dépendante du matériel lié à l'location
– Le time nécessaire au Core Location pour détecter et appeler la méthode déléguée appropriée est d'environ 2-3 minutes en moyenne après le franchissement de la limite de la région.
– Certains développeurs ont déterminé de manière indépendante que les régions plus petites bénéficieraient de callbacks 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 effectué des tests approfondis en utilisant différentes configurations de rayon de région et locationManager:didExitRegion
ne se triggers pas de la manière prévue. Cela semble être soit un bug plutôt méchant ou la surveillance de la région ne se produit pas du tout comme le suggère la documentation. J'ai le harnais de test à la disposition de tous ceux qui le veulent:
http://www.mediafire.com/download/x863zkttltyalk6/LocationTest.zip
Lancez-le dans le simulateur et lancez le test en sélectionnant Debug -> Location -> Freeway Drive dans le menu du simulateur iOS. Le nombre que vous voyez est la distance du centre de la région surveillée. La couleur d'arrière-plan sera verte lorsque l'appareil se trouve dans la zone surveillée et en rouge à l'extérieur de la région. Le text en dessous de la distance sont des journaux d'events.
Après avoir exécuté l'application, vous devriez voir locationManager:didExitRegion
fire à 5319 mètres de la région surveillée. L'itinéraire sera en boucle toutes les 37 minutes et vous verrez l'appareil quitter 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 entendu leur réponse. Au less, nous aurons une consortingbution de la source canonique.
Voici le text détaillé envoyé à Apple:
En utilisant une application de test sur le simulateur iOS ainsi que sur un iPhone 5S, le CLLocationManager ne semble pas triggersr les callbacks de dosExitRegion d'une manière attendue. Quel que soit le rayon de la région circulaire surveillée, le callback ne se fera pas avant qu'un seuil d'environ 5000 mètres ne soit atteint.
Étapes à reproduire:
1. Lancez l'application jointe
2. Démarrez le suivi de région en sélectionnant Debug -> Location -> Freeway Drive dans le simulateur iOS
3. Surveillez l'application. Le grand # indique la distance du centre de la région surveillée.
4. Après environ 190 secondes et 5300 mètres didExitRegion tirera finalement.
Ce problème ne semble pas du tout lié à la taille de la région. Selon les docs d'Apple , même les petites régions sont soutenues:
Dans iOS 6, les régions dont le rayon est compris entre 1 et 400 mètres fonctionnent mieux sur les appareils iPhone 4S ou ultérieurs. (Dans iOS 5, les régions dont le rayon est compris entre 1 et 150 mètres fonctionnent mieux sur l'iPhone 4S et les versions ultérieures.) Sur ces appareils, une application peut recevoir la notification région input ou région sortie en moyenne en 3 à 5 minutes, si pas plus tôt.
Bien que les events régionaux ne se produisent pas instantanément, ils devraient se produire assez rapidement. À partir des documents Apple :
Les events de région peuvent ne pas se produire immédiatement après le franchissement d'une limite de région. 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'location de l'user doit traverser la limite de la région, s'éloigner de la limite d'une distance minimale et restr à cette distance minimale pendant au less 20 secondes avant que les notifications soient signalées.
Ce n'est pas du tout ce que je vois dans le harnais de test. Sur le simulateur, le périphérique sera toujours à plus de 5000 mètres de la région avant qu'un événement locationManager:didExitRegion
se produise.
J'aime les réponses de Michael et de Nevan. Je voudrais append plus d'informations de mon expérience personnelle / opinion dans le développement de l' application basée sur la localization iOS avec la surveillance de la région et également mettre en évidence certains points importants: –
Soyez réalist sur la surveillance de la région
La surveillance de région utilise le système de positionnement global (GPS), le Wifi et d'autres technologies pour déterminer si le dispositif est à l'intérieur ou à l'extérieur de la région surveillée. Ne pas oublier que notre terre est de 510 kilomètres carrés et environ 30% sont des terres (149 millions de km2). C'est une zone énorme. Rappelez-vous le récent cas manquant 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 voulez surveiller une petite région avec seulement 10 mètres de rayon . Il pourrait éventuellement travailler à l'intérieur d'une ville très dense avec beaucoup de tours de téléphonie cellulaire et des zones wifi. Mais en même time, le signal pourrait être bloqué par des tours de grande hauteur qui pourraient causer la perte de signal pendant quelques secondes / minutes, ce qui a retardé la transmission de la notification.
Donc, vous devez vraiment considérer l'information ci-dessus avant de décider quelle est la taille de la région que vous voulez surveiller. Personnellement, je pense que 10 mètres de rayon est trop petit.
Soyez réalist sur le nombre de régions surveillées
La technologie Core Location actuelle ne peut surveiller que jusqu'à 20 régions maximum sur une seule application. Assurez-vous que les régions surveillées ne sont pas trop proches les unes des autres.
J'ai personnellement testé 3 régions d'environ 100 mètres de rayon qui se trouvent à environ 200 mètres l'une de l'autre. Parfois, je peux recevoir des notifications de toutes ces trois régions lorsque je les traverse, mais parfois, je ne peux recevoir la notification que de la première région. Quelle pourrait être la raison? Je ne pouvais pas savoir. Les régions peuvent être trop proches les unes des autres. Ou les tours de téléphonie cellulaire décident que mon appareil ne se trouve pas réellement dans la région surveillée.
Il y avait une personne sur StackOverFlow qui veut surveiller 1800 points sur notre Terre. Ne soyez pas comme lui car il est assez irréalist et ne comprend probablement pas la limitation de la technologie actuelle de Core Location
. Lien : Vérifiez si l'location de l'user est proche de certains points
Réglage fin du gestionnaire de geolocation
Si votre application a besoin de surveiller une petite zone ou si elle a besoin d'être fréquemment mise à jour. Voici les propriétés potentielles de votre gestionnaire de localization.
self.locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation; self.locationManager.distanceFilter = kCLDistanceFilterNone; self.locationManager.activityType = CLActivityTypeAutomotiveNavigation;
kCLLocationAccuracyBestForNavigation
consumra plus de batterie compare avec kCLLocationAccuracyBest
. Mais, ce sera plus précis.
J'ai trouvé un problème dans la surveillance de la région dans iOS 7 lorsqu'il y a plusieurs notifications déclenchées en même time dans différentes régions surveillées. J'ai trouvé une solution pour filterr ce problème. Pour plus d'informations, s'il vous plaît visitez: Région Monitoring Glitch sur iOS 7 – Notifications multiples en même time
Ne soyez pas trop ambitieux
Vous avez peut-être utilisé certaines applications qui peuvent surveiller une petite région et sont très précises et capables de vous notifier la même seconde que vous entrez dans la région. Et vous avez l'inspiration pour développer exactement la même application pour rivaliser avec eux. Mais comprenez-vous ce qui se passe derrière la scène? Quelles technologies supplémentaires utilisent-ils? Et quels partenaires avec qui ils collaborent?
J'ai fait des searchs à ce sujet et j'ai découvert que certaines des technologies qu'ils utilisent ne sont pas disponibles publiquement. Certaines de ces sociétés sont fortement financées et pourraient payer une prime aux sociétés de télécommunication afin d'get la meilleure précision de localization pour la meilleure expérience user. Je ne comprends pas les détails sur comment cela fonctionne. Je crois que la plupart de la détermination d'location est réellement sur la fin de server (arrière fin), pas le mobile (extrémité avant).
Ainsi, les applications qui sont développées par ces entresockets peuvent non seulement identifier le meilleur location précis, mais ne consum 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. Ce n'est peut-être pas exact à 100% car j'apprends encore l' location central et la surveillance de la région .
Je suis d'accord avec Michael G. Emmons , et je veux partager mon expérience aussi:
J'ai testé mon code avec trois régions comme indiqué dans l'image ci-dessous:
Expliquer le comportement:
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
Donc, je pense que toutes les régions à l'intérieur de 5000 mètres sont détectées, et que l'user s'éloigne à 10 km de la région détectée, son événement de sortie sera déclenché. Dans le cas contraire, si l'user se trouve dans la plage de 5 km, il ne l'appellera plus jamais Entrée / Sortie.
S'il vous plaît me mettre à jour sur, si quelqu'un a résolu ce problème, ou des documents Apple n'importe où sur ce problème.
On dirait que même 1 mètre devrait fonctionner (et fonctionne mieux sur les appareils iPhone 4S +):
startMonitoringForRegion:
(…)
Dans iOS 6, les régions dont le rayon est compris entre 1 et 400 mètres fonctionnent mieux sur les appareils iPhone 4S ou ultérieurs. (Dans iOS 5, les régions dont le rayon est compris entre 1 et 150 mètres fonctionnent mieux sur l'iPhone 4S et les versions ultérieures.) Sur ces appareils, une application peut recevoir la notification région input ou région sortie en moyenne en 3 à 5 minutes, si pas plus tôt.
Basé sur la réponse de @ Nevan, qui indiquait une sorte de couverture dans la WWDC 2013 307 (qui ne traitait pas directement de cela), j'ai trouvé une solution raisonnable pour get une précision <10m pour l'arrivée à un endroit, bien que je sente ce qui implémente -(void)locationManager:didVisit:
pourrait rendre cette batterie plus conservasortingce, mais fournirait des mises à jour less fréquentes.
D'abord, ayez quelques régions avec le rayon 0..150m, et commencez la surveillance. Cela n'a pas vraiment d'importance, car le système semble triggersr à 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];
Ensuite, mettre en œuvre
-(void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region { for (CLCircularRegion *enteredRegion in _locationManager.monitoredRegions.allObjects) { if ([enteredRegion.identifier isEqualToSsortingng: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 flot d'locations, même si votre application est suspendue (vous UIBackgroundModes
besoin de UIBackgroundModes
pour inclure l'élément de tableau d' location
).
Pour vérifier si l'un de ces locations se trouve dans le centre de l'une de vos régions, implémentez:
-(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 également implémenter:
-(void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region { [_locationManager stopUpdatingLocation]; }
Au cours des derniers jours, je testais une fonction de geolocation sur mon appareil iOS 8.1 (iPhone 5S) pour une application développée.
L'application enregistre quelques régions dans le service de geolocation iOS. La logique de l'application nécessite que chaque rayon de geofence soit compris entre 40 et 80 mètres.
Je vois jusqu'à présent que dans les zones avec un plus grand nombre de tours de téléphonie cellulaire et de points chauds Wifi, la détection de géofence est assez bonne pour entrer dans les régions. C'est-à-dire que, dans les centres-villes, les zones d'activités, etc., la détection de geofence fonctionne correctement.
Malheureusement, le contraire se produit dans les zones avec quelques tours de téléphonie cellulaire et réseaux wifi. Mon quartier, par exemple, mesure environ 1000 mètres de largeur et 500 de hauteur (1KM x 0,5KM), et il n'y a pas de tours de téléphonie cellulaire . Il y a peu de tours de téléphonie cellulaire sur le périmètre qui entoure le quartier. Malheureusement Dans le périmètre du quartier le service de geofence ne détecte rien .
Inutile de dire que je teste avec Wifi activé sur l'appareil.
Quand je teste mon application sur Android: le service de geolocation sur Android 4.3, 4.4 et 5.1 fonctionne beaucoup mieux que sur iOS. Le service de geolocation d'Android ne détecte pas 100% des transitions régionales, mais il détecte 50% à 90% des transitions régionales.
Je conclus ce qui suit: S'il y avait eu plus de tours de cellules et points chauds de Wifi et si Apple aurait amélioré le service de geofence alors la détection sur les dispositifs d'iOS aurait été aussi bonne que dans l'Android.
C'est plus comme un commentaire important. De la surveillance de la région et d'iBeacon
Lorsque vous testez votre code de surveillance de région dans iOS Simulator ou sur un périphérique, réalisez que les events de région peuvent ne pas se produire immédiatement après le franchissement d'une limite de région. 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'location de l'user doit traverser la limite de la région, s'éloigner de la limite d'une distance minimale et restr à cette distance minimale pendant au less 20 secondes avant que les notifications soient signalées .
Les distances de seuil spécifiques sont déterminées par le matériel et les technologies de localization actuellement disponibles. Par exemple, si le Wi-Fi est désactivé, la surveillance de la région est nettement less précise . Cependant, à des fins de test, vous pouvez supposer que la distance minimale est d'environ 200 mètres .
Geofencing fonctionne en détectant un user qui passe d'une tour de réseau cellulaire à une autre tour de réseau cellulaire.
Par conséquent, la plus petite zone que vous pouvez définir est dictée par la proximité des tours cellulaires.
À l'intérieur d'un centre commercial ou d'un stade de sport, il pourrait être capable de faire 10 mètres – les tours de téléphonie cellulaire sont souvent extrêmement proches les unes des autres. Dans une région, tout ce qui est inférieur à 100 km peut échouer.
Si vous avez besoin de plus petites zones, vous devez utiliser bluetooth au lieu de tours de téléphonie cellulaire (iBeacons). S'il y a un appareil Bluetooth à faible consommation d'énergie dans la zone cible, vous pouvez définir une plage très courte (centimètres) ou raisonnablement 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, les tours bluetooth (version 4.0 ou plus récente) et les réseaux cellulaires sont le seul moyen de surveiller les locations sans épuiser la batterie de manière significative. Garder le GPS actif pour vérifier une limite de 10 mètres permettrait de décharger la batterie de complètement à plat en environ 2 heures même si l'écran est éteint.