Je cherche une application ou une bibliothèque open source pour suivre l'emplacement de l'utilisateur en arrière-plan. Maintenant, j'essaie de le faire avec CLLocation
et des tâches en arrière-plan, mais la précision ne suffit pas pour mon cas. Pourriez-vous expliquer comment des applications, telles que "move", "runkeeper", "endmondo", créent mon itinéraire? Devrais-je utiliser Accéléromètre ou/et compas pour créer un itinéraire entre des points d’arrière-plan CLLocation?
Un 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 événements licenciés au cours d'un voyage d'une heure et demie
Vous devez ajouter dans votre fichier "Info.plist" la clé UIBackgroundModes
(tableau) avec la valeur "location" (l'application enregistre pour les mises à jour d'emplacement) . Vous pouvez vérifier tous les modes d'arrière-plan ici .
Votre application utilise donc des services de localisation. Ensuite, veuillez lire le Guide de programmation de la détection d’emplacement .
Vous devez apporter quelques modifications à votre Info.plist:
Obtenir des événements de localisation en arrière-plan
Si votre application nécessite des mises à jour d'emplacement fournies, qu'elle soit au premier plan ou à l'arrière-plan, plusieurs options vous permettent de le faire. L'option recommandée consiste à utiliser le service de changement d'emplacement significatif pour réactiver votre application aux moments appropriés pour gérer de nouveaux événements. Toutefois, si votre application doit utiliser le service de localisation standard, vous pouvez déclarer que votre application nécessite des services de localisation en arrière-plan.
Une application devrait demander des services de localisation en arrière-plan uniquement si l'absence de ces services compromettrait sa capacité à fonctionner. En outre, toute application qui demande des services de localisation en arrière-plan doit utiliser ces services pour fournir un avantage tangible à l'utilisateur. Par exemple, une application de navigation pas à pas serait probablement candidate aux services de localisation en arrière-plan en raison de la nécessité de suivre la position de l'utilisateur et de signaler le moment opportun pour effectuer le prochain virage.
Votre problème est le gestionnaire d'arrière-plan. Supprimez-le et activez le mode de fond GPS dans le fichier plist. alors vous devriez obtenir des gps pleine puissance tout le temps.
Définir la propriété pausesLocationUpdatesAutomatically=NO
C'est nouveau dans iOS 6.
De CLLocationManager :
Permettre au responsable de la localisation de suspendre les mises à jour peut améliorer la batterie. la vie sur le périphérique cible sans sacrifier les données de localisation. Quand cela propriété est définie sur YES, le gestionnaire d’emplacement met les mises à jour en pause (et met hors tension le matériel approprié) au moment où les données d’emplacement est peu susceptible de changer. Par exemple, si l'utilisateur s'arrête pour manger pendant que En utilisant une application de navigation, le gestionnaire de lieux peut suspendre les mises à jour pour un période de temps. Vous pouvez aider à déterminer quand faire une pause les mises à jour d'emplacement en attribuant une valeur à la propriété activityType.
La valeur par défaut de cette propriété est YES.
Pour l'analyse, ajoutez ces méthodes à votre délégué LocationManager:
- (void)locationManagerDidPauseLocationUpdates:(CLLocationManager *)manager {
NSLog(@"locMan: locationManagerDidPauseLocationUpdates");
}
- (void)locationManagerDidResumeLocationUpdates:(CLLocationManager *)manager {
NSLog(@"locMan: locationManagerDidResumeLocationUpdates");
}
Vous pouvez configurer les éléments de surveillance dans votre emplacement VC comme indiqué 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 outrepasser ci-dessous deux méthodes de délégation facultatives du protocole CLLocationManager
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 méthodes, vous obtiendrez un emplacement mis à jour. utilisez-le comme vous voulez. chaque fois que le lieu est mis à jour, ces méthodes reçoivent des appels.
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 delegate:
- (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;
NSString *lat = [NSString stringWithFormat:@"%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;
NSString *longt = [NSString stringWithFormat:@"%d° %d' %1.4f\"",
degrees, minutes, seconds];
NSLog(@" Current Longitude : %@",longt);
longitudeLocation.text = longt;
}