web-dev-qa-db-fra.com

Emplacement de l'utilisateur en arrière-plan lorsque l'application est fermée/suspendue

J'ai essayé de comprendre comment obtenir l'emplacement de l'utilisateur lorsque l'application est fermée, comme le fait l'application. Le seul moyen que je connaisse est de procéder à des changements d’emplacement importants. Cependant, avec des changements d'emplacement importants, l'application ne se réveille que tous les 500 mètres et seulement 5 minutes après la dernière mise à jour. 

Selon Apple:

Les applications peuvent s'attendre à recevoir une notification dès que l'appareil se déplace de 500 mètres ou plus par rapport à la notification précédente. Il ne faut pas s'attendre à recevoir des notifications plus d'une fois toutes les cinq minutes. Si le périphérique est capable de récupérer des données du réseau, le gestionnaire d'emplacement est beaucoup plus susceptible d'envoyer des notifications en temps voulu.

Dans l'application Moves, même si l'application est terminée, il est possible de retrouver très précisément la position de l'utilisateur sans trop de drainage dans la batterie. Il ne semble pas non plus que l'emplacement d'arrière-plan soit activé, car sa raison dans la liste d'utilisation de la batterie ne montre que "Activité en arrière-plan". Je me demande donc comment une application comme Moves fait cela. Toute aide est la bienvenue! Merci.

26
Zack

Vous pouvez vous inscrire pour des régions situées dans une zone de 500 m et vous inscrire à une notification de notification de région. Lorsqu'elle les atteint, votre application est lancée en arrière-plan. Ensuite, ré-enregistrez-vous pour les nouveaux en gardant cet endroit au centre.

enter image description here

De Documentation Apple :

Les applications prenant en charge l'exécution en arrière-plan peuvent être relancées par le système pour gérer les événements entrants. Si une application est fermée pour une raison autre que celle que l'utilisateur a forcée à quitter, le système lance l'application lorsque l'un des événements suivants se produit:

Pour les applications de localisation:

  • Le système reçoit une mise à jour de l’emplacement qui répond aux critères de livraison définis par l’application.

  • Le périphérique est entré ou sorti d'une région enregistrée. (Les régions peuvent être des régions géographiques ou des régions iBeacon.)

4
Sahil Kapoor

Si vous avez souvent besoin de mises à jour d'emplacement mais que vous souhaitez tout de même économiser la batterie, essayez ceci:

  1. Ajoutez les autorisations nécessaires pour utiliser l'emplacement en arrière-plan.
  2. Démarrer les mises à jour en utilisant startUpdatingLocation
  3. Commencez à différer les mises à jour en arrière-plan à l'aide de allowDeferredLocationUpdatesUntilTraveled:timeout: Spécifiez les filtres de temps et de distance dans cette méthode. 
  4. Assurez-vous de lire la documentation ici et de spécifier correctement toutes les propriétés pour que cela fonctionne.
3
Shri

La seule solution consiste à utiliser le mode d'arrière-plan avec CoreLocation. Si votre application nécessite iOS 8, le système relancera votre application, même s'il est forcé de quitter par l'utilisateur. Ceci est documenté dans Apple Docs :

Dans la plupart des cas, le système ne relance pas les applications après leur fermeture forcée Par l'utilisateur. Les applications de localisation constituent une exception. Elles sont relancées après iOS 8 et Après avoir été forcées par l'utilisateur. Dans d'autres cas, cependant, l'utilisateur doit lancer l'application explicitement ou redémarrer le périphérique Avant de pouvoir lancer l'application automatiquement dans l'arrière-plan Par le système.

2
rmp

sous iOS 8, il s’agit de nouvelles étapes auxquelles nous devons prêter attention pour que le repérage de localisation fonctionne. La première étape consiste à ajouter une ou deux clés dans la liste .plist du projet, en fonction des fonctionnalités principales de l’application. Les deux clés sont NSLocationWhenInUseUsageDescription et NSLocationAlwaysUsageDescription. Vous devrez ensuite ajouter une chaîne expliquant à l'utilisateur la raison pour laquelle l'application doit accéder à son emplacement, quelque chose entre les lignes de «Cette application utilise l'emplacement en arrière-plan/avant-plan, car A, B et C ”. Chacune de ces chaînes a une méthode d'autorisation correspondante qui doit être appelée, WhenInUse ou Alway (c'est-à-dire, Background).

- (void)startStandardUpdates
{
    // Create the location manager if this object does not
    // already have one.
    if (nil == locationManager)
        locationManager = [[CLLocationManager alloc] init];

    locationManager.delegate = self;
    locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;

    // Set a movement threshold for new events.
    locationManager.distanceFilter = 500; // meters

    [locationManager startUpdatingLocation];
}
1
mrunal thanki

De mon expérience actuelle, vous avez 3 options pour faire ce travail. La première consiste à avoir une notification silencieuse nécessitant un effort de la part du serveur. La notification silencieuse est une sorte de notification Push, mais elle notifie votre application sans alerte. La deuxième solution est la recherche en arrière-plan. L'extraction d'arrière-plan ne nécessite pas de solution d'arrière-plan, mais malheureusement, vous ne pouvez pas contrôler les intervalles nécessaires pour l'instancier. Le troisième est d'avoir des notifications locales planifiées sans messages. 

0
Ashraf Tawfeeq

De la docs

Suivi de la position de l'utilisateur

Il existe plusieurs manières de suivre l'emplacement de l'utilisateur en arrière-plan, Pour la plupart ne nécessitant pas que votre application s'exécute en permanence dans L'arrière-plan:

The significant-change location service (Recommended)

Foreground-only location services

Background location services

Exécution en arrière-plan

Et pour les détails - Obtenir la position de l’utilisateur

0
jarryd