2017-09-30 15 views
1

J'essaie de créer une application iOS simple qui suivra en permanence l'emplacement en arrière-plan et notifiera avec une grande précision lorsque l'utilisateur est entré dans une région spécifique (ne pas utiliser la surveillance de région pas précis ou assez rapide pour ce que je veux).Mise à jour continue de l'emplacement iOS en arrière-plan

Cette application fonctionne bien au premier plan, mais une fois que je passe en arrière-plan, cela ne fonctionne pas.

J'ai créé une application de test pour étudier le fonctionnement des mises à jour d'emplacement d'arrière-plan. J'ai fait une application simple qui imprime juste un message quand une mise à jour d'emplacement se produit (dans le journal). Ce que je vois, c'est qu'en mode premier plan, les mises à jour ont lieu comme prévu, mais lorsque je verrouille mon téléphone et que l'application passe en arrière-plan, les mises à jour se font environ 30 secondes, puis s'arrêtent. Il n'y a aucune mention dans les docs d'Apple (que je peux trouver) expliquant ce comportement.

Je me suis assuré que j'autorisé le traitement de fond dans le info.plist (fait dans les « capacités » -> « modes de fond » -> « mises à jour de localisation »)

Voici le code que j'utilisé pour tester ceci:

import UIKit 
import CoreLocation 

class ViewController: UIViewController, CLLocationManagerDelegate { 

let locationManager = CLLocationManager() 
var counter = 0 
override func viewDidLoad() { 
    super.viewDidLoad() 

    // configure location updates 
    locationManager.delegate = self 
    locationManager.desiredAccuracy = kCLLocationAccuracyBest 
    locationManager.distanceFilter = 0.1 
    locationManager.pausesLocationUpdatesAutomatically = false 

    locationManager.requestAlwaysAuthorization() 

    locationManager.startUpdatingLocation() 

} 

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
    print("location updated! \(counter)") 
    counter = counter + 1 
} 

Des idées sur ce que je pourrais manquer? J'ai essayé différents paramètres de précision de localisation (tels que BestForNavigation, etc.) et aucun changement.

Merci.

+0

Je voulais préciser que pour tester les mises à jour de localisation en arrière-plan la déclaration d'impression ne fonctionne pas (cela fonctionne uniquement en imprimant sur le Mac lorsque l'application est au premier plan). Pour le tester, j'ai ajouté du code pour envoyer une notification locale à l'intérieur de didUpdateLocations. Quand je suis passé en arrière-plan, cela m'a envoyé une notification chaque fois que l'emplacement a été mis à jour. J'ai reçu des notifications pendant environ 30 secondes après le passage en arrière-plan, puis ils se sont arrêtés. – Morocco5

+0

En outre, pour être clair, j'ai autorisé le mode de traitement en arrière-plan pour l'emplacement dans info.plist – Morocco5

Répondre

1

Vous devez ajouter dans votre plist:

<key>UIBackgroundModes</key> 
<array> 
    <string>location</string> 
</array> 

ajouter cette

locationManager.allowsBackgroundLocationUpdates = true 
+0

Merci pour les réponses. J'ai déjà ce paramètre dans mon info.plist (mentionné ci-dessus mais proche de la fin). Comme un double contrôle, je pris un regard sur le fichier brut et je ne vois cela (comme prévu): \t UIBackgroundModes \t \t \t emplacement \t Morocco5

1

Je pense que cela pourrait être la réponse: allowsBackgroundLocationUpdates.

Apps qui souhaitent recevoir des mises à jour de localisation en suspension doit inclure les UIBackgroundModes clé (avec la valeur de l'emplacement) dans fichier Info.plist de leur application et Définissez la valeur de cette propriété sur true.

...

La valeur par défaut de cette propriété est faux.

Réglez-vous cela?

+0

Oui, cela est en cours de définition. – Morocco5

+0

Vous mentionnez le verrouillage du téléphone. Est-ce que la même chose se produit si vous ne verrouillez pas votre téléphone, mais allez simplement à l'écran d'accueil pour l'arrière-plan de l'application? – clarus

+0

Cela fonctionne très bien avec le téléphone déverrouillé. Ce n'est qu'en arrière-plan qu'il est suspendu. Mais l'ajout de "allowedBackgroundLocationUpdates" a permis de le faire fonctionner. – Morocco5