Application de suivi GPS iOS qui fonctionne tout le time

J'essaie de faire une application pour suivre l'user GPS tout le time, cette application est une sorte de tracker GPS de voiture pour get l'location du pilote tout le time et l'envoyer au server.

J'ai essayé d'append "mises à jour de localization" aux "modes d'arrière-plan", mais l'application sera automatiquement suspendue après 10 minutes en arrière-plan.

Y at-il un moyen de faire fonctionner cette application tout le time et get l'location GPS?

Je vous remercie.

Vous avez deux options ici:

1) Suivi de localization régulier.
Ce type de suivi fonctionne avec les kCLAuthorizationStatusAuthorizedWhenInUse et kCLAuthorizationStatusAuthorizedAlways . Lorsque CLLocationManager commencé à suivre l'location une fois qu'il aura reçu les mises à jour d'location dans la méthode déléguée locationManager:didUpdateLocations: L'application peut passer à l'état suspendu, mais lorsque le gestionnaire de position reçoit une nouvelle application de localization, elle passe à l'état d'arrière-plan et gère le nouvel location dans la méthode déléguée. Comment configurer le gestionnaire de position:

 - (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) L'location de la signification change le suivi.
Ce type de suivi fonctionne uniquement avec l'autorisation kCLAuthorizationStatusAuthorizedAlways . Il reçoit le nouvel location seulement tous les 500 mètres, donc le filter de distance et l'exactitude désirée ne fonctionnent pas ici. L'application peut passer à l'état suspendu, et peut même être interrompue par le système, mais lorsque l'application met à jour l'application, elle passe à l'état d'arrière-plan et reçoit l'location dans la méthode déléguée locationManager:didUpdateLocations:
Si l'application a été interrompue par le système, elle sera relancée en arrière-plan avec la key UIApplicationLaunchOptionsLocationKey dans les options de lancement de la méthode de délégation de l'application didFinishLaunchingWithOptions . 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 methods ne garantissent pas que votre application ne passera pas en état suspendu.
En outre, si l'application a été interrompue par l'user (par exemple, à partir du sélecteur d'application par balayage), le suivi de l'location en arrière-plan ne fonctionnera pas.

MISE À JOUR (correspondant aux commentaires)

Voici mes exemples de code qui fonctionnent pour moi:
Pour le suivi régulier . Exécutez l'exemple, fournissez l'access à l'location de l'user, appuyez sur le button Démarrer pour démarrer les mises à jour de l'location. Pour tester les locations dans le simulateur, choisissez dans le menu du simulateur Débogage> Emplacement> Freeway Drive. Maintenant, vous pouvez pousser l'application en arrière-plan par le button d'accueil (Command + Shift + H). Laissez simulateur pendant plus de 10 minutes, et tout ce time l'application recevra des locations. 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 significatives ne peuvent être démarrées que par la méthode [self.locationManager startMonitoringSignificantLocationChanges];

UPDATE (iOS 11)

Changements au suivi de localization dans iOS 11

iOS 11 apporte également des modifications majeures aux API existantes. L'une des zones touchées est le suivi de l'location. Si votre application utilise uniquement l'location alors que l'application est au premier plan , comme la plupart des applications, vous ne devrez peut-être rien changer du tout; Cependant, si c'est l'une de ces applications qui suivent continuellement l'location des users tout au long de la journée, vous devriez probablement réserver un peu de time cet été pour apporter des modifications à la façon de suivre et tester les scénarios d'utilisation possibles.

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

En réponse au commentaire 1 dans la solution (je ne peux pas encore faire de commentaire): vous n'avez pas semblé résoudre le problème car votre application est suspendue et ne met plus à jour l'location après 10 minutes.

J'ai eu le même problème: j'avais mis setAllowsBackgroundLocationUpdates à YES , et j'avais la key NSLocationAlwaysUsageDescription dans mon Info.plist , mais mon App a également utilisé pour arrêter le suivi de l'location après 10 minutes.

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

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

set it.it prend le pouvoir de la batterie mais votre application s'exécute en Background.OS ne suspend pas votre application

[self.locationManager setPausesLocationUpdatesAutomatically: NO];