web-dev-qa-db-fra.com

application de suivi GPS iOS qui fonctionne tout le temps

J'essaie de faire une application pour suivre l'utilisateur GPS tout le temps, cette application est une sorte de traqueur GPS de voiture pour obtenir l'emplacement du pilote tout le temps et l'envoyer au serveur.

J'ai essayé d'ajouter des "mises à jour de localisation" aux "modes d'arrière-plan", mais l'application s'interrompt automatiquement au bout de 10 minutes lorsque vous passez en arrière-plan.

Y a-t-il un moyen de faire en sorte que cette application fonctionne tout le temps et d'obtenir la position GPS?

Je vous remercie.

15
TMMDev

Vous avez deux options ici:

1) Suivi de localisation régulier.
Ce type de suivi fonctionne avec les autorisations kCLAuthorizationStatusAuthorizedWhenInUse et kCLAuthorizationStatusAuthorizedAlways. Lorsque CLLocationManager a commencé à suivre l'emplacement de suivi une fois qu'il recevra les mises à jour d'emplacement dans la méthode de délégation locationManager:didUpdateLocations:. L'application peut passer à l'état suspendu, mais lorsque le gestionnaire d'emplacement reçoit un nouvel emplacement, l'application passe à l'état d'arrière-plan et gère le nouvel emplacement dans la méthode de délégation. Comment configurer le gestionnaire d'emplacement:

- (void)viewDidLoad {
    [super viewDidLoad];

    self.locationManager = [[CLLocationManager alloc] init];

    // Setup location tracker accuracy
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;

    // Distance filter
    self.locationManager.distanceFilter = 50.f;

    // Assign location tracker delegate
    self.locationManager.delegate = self;

    // This setup pauses location manager if location wasn't changed
    [self.locationManager setPausesLocationUpdatesAutomatically:YES];

    // For iOS9 we have to call this method if we want to receive location updates in background mode
    if([self.locationManager respondsToSelector:@selector(allowsBackgroundLocationUpdates)]){
        [self.locationManager setAllowsBackgroundLocationUpdates:YES];
    }

    [self.locationManager startUpdatingLocation];
}


2) Suivi du changement de localisation de la signification.
Ce type de suivi ne fonctionne qu'avec l'autorisation kCLAuthorizationStatusAuthorizedAlways. Il reçoit le nouvel emplacement seulement tous les 500 mètres. Le filtre de distance et l’exactitude désirée ne fonctionnent pas ici. L'application peut passer à l'état suspendu et même être interrompue par le système, mais lorsque les mises à jour de localisation sont appliquées, l'application passe à l'état d'arrière-plan et reçoit l'emplacement dans la méthode de délégation locationManager:didUpdateLocations:.
Si l'application a été arrêtée par le système, elle sera relancée en arrière-plan avec la touche UIApplicationLaunchOptionsLocationKey dans les options de lancement de la méthode didFinishLaunchingWithOptions app delegate. Comment configurer ce type sur le suivi:

- (void)viewDidLoad {
    [super viewDidLoad];

    self.locationManager = [[CLLocationManager alloc] init];

    // Assign location tracker delegate
    self.locationManager.delegate = self;

    // For iOS9 we have to call this method if we want to receive location updates in background mode
    if([self.locationManager respondsToSelector:@selector(allowsBackgroundLocationUpdates)]){
        [self.locationManager setAllowsBackgroundLocationUpdates:YES];
    }

    [self.locationManager startMonitoringSignificantLocationChanges];
}


Vous devez remarquer que ces deux méthodes ne garantissent pas que votre application ne passe pas à l'état suspendu.
De plus, si l'application a été fermée par l'utilisateur (par exemple depuis un commutateur d'application par balayage), le suivi de l'emplacement en arrière-plan ne fonctionnera pas.


UPDATE (correspondant aux commentaires)

Voici mes exemples de code qui fonctionnent pour moi:
Pour un suivi régulier . Exécutez l'exemple, fournissez un accès à l'emplacement de l'utilisateur, appuyez sur le bouton Démarrer pour lancer les mises à jour de l'emplacement. Pour tester des emplacements dans le simulateur, choisissez dans le menu du simulateur Débogage> Emplacement> Freeway Drive. Vous pouvez maintenant pousser l'application sur l'arrière-plan à l'aide du bouton d'accueil (Commande + Maj + H). Quittez le simulateur pendant plus de 10 minutes, et tout ce temps l'application recevra des emplacements. Lorsque vous revenez à l'application, vous verrez des épingles rouges sur la carte.
Pour les changements importants . Exécutez l'application et testez de la même manière que pour l'exemple précédent.
Surveillance Les modifications importantes ne peuvent être démarrées que par la méthode [self.locationManager startMonitoringSignificantLocationChanges];

UPDATE (iOS 11)

Modifications du suivi d'emplacement dans iOS 11

iOS 11 apporte également des modifications majeures aux API existantes. Une des zones touchées est la localisation. Si votre application utilise uniquement l'emplacement lorsque celle-ci est au premier plan, comme la plupart des applications, vous ne devrez peut-être rien changer du tout. Toutefois, si l’une de ces applications surveille en permanence la position de l’utilisateur tout au long de la journée, vous devriez probablement réserver un peu de temps cet été pour apporter des modifications à la façon dont vous effectuez le suivi et le test des scénarios d’utilisation possibles.

suivez ce lien: https://mackuba.eu/2017/07/13/changes-to-location-tracking-in-ios-11/

12
shpasta

En réponse au commentaire 1 de la solution (je ne peux pas commenter pour le moment): vous ne sembliez pas résoudre le problème car votre application était suspendue et ne mettait plus à jour l'emplacement après 10 minutes. 

J'avais le même problème: j'avais setAllowsBackgroundLocationUpdates sur YES et j'avais la clé NSLocationAlwaysUsageDescription dans mon Info.plist, mais mon application arrêtait également le suivi de l'emplacement après 10 minutes. 

Je l'ai résolu en ajoutant NSLocationAlwaysUsageDescription et NSLocationWhenInUseUsageDescription au fichier Info.plist afin qu'il ressemble à ceci:

    <key>NSLocationAlwaysUsageDescription</key>
    <string>This app needs to use your location</string>

    <key>NSLocationWhenInUseUsageDescription</key>
    <string>This app needs to use your location</string>
3
danywarner

set it.it prend le pouvoir de la batterie mais votre application exécutée en arrière-plan.OS ne suspend pas votre application

[self.locationManager setPausesLocationUpdatesAutomatically:NO];
2