Comment suivre l'location de l'user en arrière-plan?

Je suis à la search d'une application ou d'une bibliothèque open source pour suivre l'location de l'user en arrière-plan. Maintenant, j'essaye de le faire avec des tâches de CLLocation et d'arrière-plan, mais la précision n'est pas suffisante pour mon cas. Pourriez-vous expliquer, comment les applications, comme "coups", "runkeeper", "endmondo", créent mon itinéraire? Dois-je utiliser Accéléromètre ou / et boussole pour créer une route entre les points d'arrière-plan de CLLocation?

Du code:

 //location manager init self.locationManager = [[CLLocationManager alloc] init]; self.locationManager.distanceFilter = kCLDistanceFilterNone; self.locationManager.desiredAccuracy = kCLLocationAccuracyBest; self.locationManager.delegate = self; #pragma mark - CLLocationManager Delegate - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { if ([self isInBackground]) { if (self.locationUpdatedInBackground) { bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler: ^{ [[UIApplication sharedApplication] endBackgroundTask:bgTask]; }]; self.locationUpdatedInBackground(newLocation); [self endBackgroundTask]; } } else { if (self.locationUpdatedInForeground) { self.locationUpdatedInForeground(newLocation); } } } 

UPD: Justed testé mon application avec les propriétés suivantes

 self.locationManager.distanceFilter = kCLDistanceFilterNone; self.locationManager.desiredAccuracy = kCLLocationAccuracyBest; self.locationManager.activityType = CLActivityTypeFitness; self.locationManager.pausesLocationUpdatesAutomatically=NO; 

Dans ce cas, j'ai environ 10 events tirés pendant un voyage d'une heure et demie

Utilisation

kCLLocationAccuracyBestForNavigation

vérifiez ceci .

Vous devez append dans votre file "Info.plist" la key UIBackgroundModes (array) avec la valeur "location" (registres de l'application pour les mises à jour d'location). Vous pouvez vérifier tous les modes d'arrière-plan ici .

Votre application utilise donc les services de localization. Ensuite, veuillez lire le Guide de programmation de la localization .

Vous devez apporter des modifications à votre Info.plist:

  • Si votre application s'appuie sur les services de localization pour fonctionner correctement, ajoutez des services de localization à UIRequiredDeviceCapabilities
  • si votre application nécessite un matériel GPS, ajoutez gps à UIRequiredDeviceCapabilities
  • Si vous devez exécuter votre application plus longtime que 10 minutes en arrière-plan, ajoutez l'location à UIBackgroundModes. Ensuite, votre gestionnaire de localization va livrer les lieux au-delà de la limite de 10 minutes.
  • vous devez également définir NSLocationUsageDescription (peut également être localisé)

Obtention des events de localization en arrière-plan

Si votre application nécessite des mises à jour de localization, que l'application soit au premier plan ou en arrière-plan, vous disposez de plusieurs options pour le faire. L'option préférée consiste à utiliser le service de modification d'location significatif pour réactiver votre application à des moments appropriés afin de gérer de nouveaux events. Toutefois, si votre application doit utiliser le service de localization standard, vous pouvez déclarer que votre application a besoin de services de localization en arrière-plan.

Une application ne doit requestr des services de localization de fond que si l'absence de ces services nuit à sa capacité de fonctionner. En outre, toute application qui request des services d'location d'arrière-plan doit utiliser ces services pour fournir un avantage tangible à l'user. Par exemple, une application de navigation étape par étape serait un candidat potentiel pour les services de localization en arrière-plan en raison de son besoin de suivre la position de l'user et de signaler quand il est time de faire le prochain tour.

Votre problème est le gestionnaire d'arrière-plan. Supprimez-le et activez le mode d'arrière-plan gps dans un file plist. alors vous devriez get un GPS à pleine puissance tout le time.

Définir la propriété pausesLocationUpdatesAutomatically=NO

C'est nouveau dans ios6.

De CLLocationManager :

Autoriser le gestionnaire de position à suspendre les mises à jour peut améliorer l'autonomie de la batterie sur le périphérique cible sans sacrifier datatables de localization. Lorsque cette propriété est définie sur YES, le gestionnaire de position met les mises à jour (et met hors tension le matériel approprié) à des moments où datatables de localization ont peu de chance de changer. Par exemple, si l'user s'arrête pour de la nourriture tout en utilisant une application de navigation, le gestionnaire d'location peut suspendre les mises à jour pendant un certain time. Vous pouvez aider à déterminer quand suspendre les mises à jour d'location en affectant une valeur à la propriété activityType.

La valeur par défaut de cette propriété est YES.

Pour l'parsing, ajoutez ces methods à votre délégué LocationManager:

 - (void)locationManagerDidPauseLocationUpdates:(CLLocationManager *)manager { NSLog(@"locMan: locationManagerDidPauseLocationUpdates"); } - (void)locationManagerDidResumeLocationUpdates:(CLLocationManager *)manager { NSLog(@"locMan: locationManagerDidResumeLocationUpdates"); } 

Vous pouvez configurer des éléments de localization de surveillance dans votre VC comme ci-dessous

dans la méthode viewDidLoad faire comme ci-dessous

 CLLocationManager locationManager = [[CLLocationManager alloc] init]; locationManager.delegate = self; locationManager.distanceFilter = kCLDistanceFilterNone; locationManager.desiredAccuracy = kCLLocationAccuracyBest;(Accuracy according to your need) [locationManager startUpdatingLocation]; 

que vous devez replace ci-dessous deux methods de délégué facultatives du protocole CLLocationManagerDelegate

pour iOS6 +

 - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{} 

et pour iOS 2 à 6

 - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 

dans ces methods, vous obtiendrez l'location mis à jour. Utilisez-le comme vous voulez. chaque fois que l'location mis à jour ces methods obtiennent des appels.

vous ne requestz pas de code. Vous requestz: "Je suis à la search d'une application ou d'une bibliothèque open source"

Cela peut vous aider à visiter ce site Web.

J'espère que cela vous aide,

Aussi un tutoriel .

Voici ma solution à cela,

Déclarez la variable d'instance:

 CLLocationManager *locationManager; 

Assurez-vous d'inclure le délégué

 <CLLocationManagerDelegate> 

Dans viewDidLoad:

 locationManager = [[CLLocationManager alloc] init]; locationManager.delegate = self; locationManager.distanceFilter = kCLDistanceFilterNone; // whenever we move, location is updated locationManager.desiredAccuracy = kCLLocationAccuracyBest; // get best current locaton coords locationManager.headingFilter = 1; [locationManager startUpdatingLocation]; [locationManager startUpdatingHeading]; 

Implémentez la méthode déléguée:

 - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { int degrees = newLocation.coordinate.latitude; double decimal = fabs(newLocation.coordinate.latitude - degrees); int minutes = decimal * 60; double seconds = decimal * 3600 - minutes * 60; NSSsortingng *lat = [NSSsortingng ssortingngWithFormat:@"%d° %d' %1.4f\"", degrees, minutes, seconds]; NSLog(@" Current Latitude : %@",lat); latitudeLocation.text = lat; degrees = newLocation.coordinate.longitude; decimal = fabs(newLocation.coordinate.longitude - degrees); minutes = decimal * 60; seconds = decimal * 3600 - minutes * 60; NSSsortingng *longt = [NSSsortingng ssortingngWithFormat:@"%d° %d' %1.4f\"", degrees, minutes, seconds]; NSLog(@" Current Longitude : %@",longt); longitudeLocation.text = longt; } 

Disclaimer: je travaille pour Cinsortingc

Nous voulions également être en mesure de suivre avec précision l'location d'un user en arrière-plan (même après que l'application a été tué). Nous avons passé beaucoup de time à résoudre le problème, en particulier en mettant l'accent sur la décharge de la batterie.

Nous avons posté un excellent article sur la façon dont nous l'avons résolu. Et fournissent également une solution de SDK de glisser-déposer. Ce n'est pas open source mais vous pouvez l'intégrer gratuitement:

Vous pouvez download le file .framework, le faire glisser dans votre projet et initialiser avec une ligne de code: [CinsortingcFind initWithApiKey:@"YOUR_API_KEY_HERE" andSecret:@"YOUR_SECRET_HERE"];

Vous pouvez get une key API gratuitement. Il y a des docs expliquant tout ici .