web-dev-qa-db-fra.com

Comment suivre la localisation de l'utilisateur en arrière-plan?

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

20
Alexey Sidorov

Utilisation 

kCLLocationAccuracyBestForNavigation

vérifiez this .

7
Phillip Kamikaze

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 .

6
Maxime Berail

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:

  • Si votre application dépend des services de localisation pour fonctionner correctement, ajoutez des services de localisation à UIRequiredDeviceCapabilities.
  • si votre application nécessite du matériel GPS, ajoutez le GPS à UIRequiredDeviceCapabilities
  • si vous devez exécuter votre application plus de 10 minutes en arrière-plan, ajoutez l'emplacement à UIBackgroundModes. Ensuite, votre responsable de localisation livrera les sites au-delà de la limite de 10 minutes.
  • vous devez également définir NSLocationUsageDescription (peut également être localisé)

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.

4
Ravi_Parmar

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");
}
3
AlexWien

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.

2
Suryakant

vous ne demandez pas de code. Vous demandez: "Je cherche une application ou une bibliothèque open source"

Cela peut vous aider de visiter ce site Web.

j'espère que ça vous aide,

Aussi un tutorial .

1
Marc Millet

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;
}
0
jsetting32