2017-01-17 2 views
3

Mon application fonctionne avec des mises à jour d'emplacement d'arrière-plan continues. Bien sûr, il a toutes les autorisations et d'autres choses commeDésactivation de allowBackgroundLocationUpdates (CLLocationManager) ne fonctionne pas après avoir été activé

allowsBackgroundLocationUpdates = true 

Au départ, je voulais réagir à LowPowerMode changements tout en arrière-plan en utilisant NSProcessInfoPowerStateDidChange notification. Et pour désactiver allowsBackgroundLocationUpdatespour arrêter la mise à jour des emplacements sans appeler stopUpdatingLocation.

Cependant, j'ai découvert qu'après réception de la notification et la mise en

allowsBackgroundLocationUpdates = false 

dans l'application de fond est en cours de travail.

Je suis donc allé plus loin et identifié, qui la désactivationallowsBackgroundLocationUpdates même au premier plan après avoir été initialement fixé à true ne fonctionne pas du tout. L'application continue de fonctionner en arrière-plan.

la documentation d'Apple sur la question

vous utilisez cette propriété pour activer et désactiver le comportement basé sur le comportement de votre application


de la classe CLLocationManager, description de allowsBackgroundLocationUpdates propriété

Avec UIBackgroundModes défini pour inclure "location" dans Info.plist, vous doit également définir cette propriété à YES lors de l'exécution à chaque appel -startUpdatingLocation avec l'intention de continuer en arrière-plan. La réinitialisation de cette propriété à NO équivaut à omettre "location" de la valeur UIBackgroundModes.

Simple project sur GitHub qui montre le comportement que j'ai mentionné. Donc, la question, est-ce un comportement intentionnel de la propriété?

+0

Je trouve cela aussi dans iOS 11. Curieusement, cela semble fonctionner dans le simulateur mais pas sur un périphérique réel. Je dois redémarrer mon application pour qu'elle prenne effet, donc "basculer" ne fonctionne pas. – njlaboratory

Répondre

0

Lorsque la valeur de cette propriété est fausse, les applications reçoivent les mises à jour de l'emplacement normalement en cours d'exécution soit au premier plan ou arrière-plan en fonction de son autorisation actuelle. Les mises à jour s'arrêtent uniquement lorsque l'application est suspendue, ce qui empêche l'application de se réveiller pour gérer ces événements. Apple API Discussion.

Je pense que la discussion de propriété peut résoudre votre problème.

+0

En fait, cette explication ne fait qu'empirer les choses.Dans la WWDC 2015, Quoi de neuf dans CoreLocation, ils l'ont définitivement décrit comme un drapeau qui arrête la mise à jour de l'arrière-plan lorsqu'il est défini sur false https://developer.apple.com/videos/play/wwdc2015/714/?time=505. De plus, en ce qui concerne mon exemple, si vous ne définissez pas allowBackgroundLocationUpdates en vraie mise à jour en arrière-plan ne fonctionne pas. Et si vous définissez à true, puis à false, la mise à jour en arrière-plan fonctionnera. C'est la question. – Sander

+0

@ Sander, j'ai lu votre [exemple de projet github] (https://github.com/Sander-Kornev/LocationTest), vous utilisez le 'requestAlwaysAuthorization()', je pense que c'est la raison, vous pouvez utiliser 'requestWhenInUseAuthorization() 'À la place, alors cela fonctionnera comme vous le souhaitez. – zhongwuzw