38 votes

Décharge de la batterie lors de l’utilisation de CoreLocation Significant Location Monitoring & CoreBluetooth

Nous avons publié une application qui s'exécute en arrière-plan et utilise CoreBluetooth & CoreLocation pour enregistrer automatiquement votre emplacement de stationnement.

À un haut niveau de notre application semble juste pour un CoreBluetooth déconnecter de l'événement et allume le GPS jusqu'à ce que nous obtenir une position gps (précision <=10 m) ou 3 minutes max de temps (cela peut se produire lorsque vous vous garez dans un parking souterrain avec aucune couverture GPS). Nous utilisons alors le Lieu Significatif de Surveillance automatiquement re-lancement de notre application dans le cas du système de terminaison de notre application.

Au cours de notre développement, nous n'avons jamais vu un drain de batterie de question de nous-mêmes, cependant, 75% de nos utilisateurs disent qu'ils voient une importante consommation de la batterie. 10% de nos bailleurs de fonds ont répondu au sondage de sorte qu'il est difficile de déterminer la représentativité de la rupture, mais c'est un grand pourcentage de nos utilisateurs. http://www.findmycarsmarter.com/forum/viewtopic.php?f=4&t=30

Ensuite, nous avons publié une mise à jour qui permet aux utilisateurs de désactiver Lieu Significatif de Surveillance et de 60% affirment qu'en désactivant Lieu Significatif de Surveillance de la vidange s'en va. http://www.findmycarsmarter.com/forum/viewtopic.php?f=4&t=42

Au départ, nous ne pouvions pas dupliquer le drain problème nous-mêmes, mais nous avons constaté que lorsque nous avons installé une application simple qui vient d'avoir sur l'importance de la Localisation de Surveillance en collaboration avec Trouver Ma Voiture plus Intelligente, nous avons par intermittence vu le drain se reproduire. Dans le drain de l'état le téléphone ne pas entrer en veille prolongée. Ceci est indiqué par la durée d'utilisation (Paramètres->Utilisation->Temps écoulé depuis la dernière charge complète) continue d'augmenter même si le téléphone avait été mis en veille et l'écran est éteint. Quelque chose empêche le système de saisie de mise en veille prolongée. La batterie se vide d'environ 15% par heure dans ce stade. Ce drain montre de façon intermittente et semble disparaître de lui-même au bout d'une heure ou deux et reviens au hasard. Nous n'avons pas trouvé un moyen de la fiabilité de reproduire le drain.

Nous pensons que le problème est causé par plusieurs clients à remettre en CoreLocation. Nous avons demandé à quelques utilisateurs qui ont vécu la question pour effacer le contenu de leur téléphone et n'installer que notre Trouver Ma Voiture plus Intelligente app. Seule avec cette application installée, le drain ne présentent pas de. Nous avons eu d'autres rapports que quand notre application est utilisée avec Google Latitude ou Facebook, etc, c'est quand ils voient le drain se produire. Ou si ils vont tuer d'autres applications, la vidange s'en va. Nous avons vu le drain persistent à travers un cycle d'alimentation, sans applications lancées. Ce qui implique qu'il a un système de niveau de service qui empêche les OS de dormir.

Même si nous pensons que le problème est provoqué par certaines condition de course de plusieurs clients appeler en CoreLocation, nous n'avons jamais vu la question à reproduire avec les applications que seulement utilisé CoreLocation. Nous avons même créé 4 ou 5 différentes applications simultanément accès CoreLocation et nous n'avons pas vu le drain se produire. Nous n'avons cependant voir le problème quand on a une application avec CoreLocation et une seconde application avec CoreLocation + CoreBluetooth. Il y a probablement très peu d'applications qui utilisent le CoreLocation + CoreBluetooth combinaison, donc potentiellement c'est pourquoi de plus en plus les développeurs n'ont pas touché par ce problème. Bien que nous sommes à une perte d'expliquer comment CoreLocation & CoreBluetooth interagissent pour provoquer ce drain et comment la seconde application avec CoreLocation vient dans l'équation. Depuis le drain a été intermittent, c'est possible que c'est juste un coup de chance que le problème ne s'est passé quand nous étions en essais avec CoreLocation + CoreBluetooth.

Sur une essuyé 5.0.1 iPhone 4S avec seulement ces deux applications CTM1 & FMC installé, nous avons pu par intermittence entrer dans le drain de l'état. Fait intéressant, le drain problème semble se produire moins fréquemment sur une essuyé appareil, puis notre normal de l'appareil. Malheureusement, nous n'avons vu la vidange de l'état d'un peu de temps et sans être en mesure de reproduire de manière fiable le drain nous n'avons pas un bon contrôle de l'état de travailler à partir.

Nous avons déposé un rapport de bug avec Apple et a ouvert un Incident de Support Technique, mais peut-être que le Stackover de la communauté peut également donner un aperçu. Nous avons vu ce problème à la fois en 5.0.1 et en 5.1 Beta 3.

CTM1 http://www.findmycarsmarter.com/files/CTM1.zip

On Going into the Background
    [locationManager stopUpdatingLocation];
    [locationManager stopUpdatingHeading];
    [locationManager startMonitoringSignificantLocationChanges];

On Re-entering Foreground
    [locationManager stopMonitoringSignificantLocationChanges];
    [locationManager startUpdatingLocation];
    [locationManager startUpdatingHeading];
On didUpdateToLocation
    //do nothing
On didUpdateHeading
    //do nothing

FMC http://www.findmycarsmarter.com/files/FMC.zip

On Going into the Background
    [btleManager stopScan];
    [locationManager stopUpdatingLocation];
    [locationManager stopUpdatingHeading];
    [locationManager startMonitoringSignificantLocationChanges];

On Re-entering Foreground
    [locationManager stopMonitoringSignificantLocationChanges];
    [locationManager startUpdatingLocation];
    [locationManager startUpdatingHeading];        
    [btleManager scanForPeripheralsWithServices:nil options:nil];
On didUpdateToLocation
    //do nothing
On didUpdateHeading
    //do nothing
On centralManagerDidUpdateState
    [btleManager scanForPeripheralsWithServices:nil options:nil];
On didDiscoverPeripheral
    [btleManager connectPeripheral:device options:nil];
On didConnectPeripheral
    //update log
On didDisconnectPeripheral
    //initiate reconnect
    [btleManager connectPeripheral:device options:nil];

Si vous voyez des erreurs de codage, pour la vidange s'il vous plaît laissez-nous savoir.

Une autre question nous a, si nous utilisons à la fois le GPS et le Lieu Significatif de Surveillance, est-il une raison d'appeler à l' stopMonitoringSignificantLocationChanges? En regardant les Régions l'échantillon de code qu'ils appellent stopMonitoringSignificantLocationChanges & startLocationUpdate sur l'entrée de premier plan et d' stopLocationUpdate & startMonitoringSignificantLocationChanges sur l'entrée d'arrière-plan, mais je me demandais si cela est nécessaire/recommandé/nécessaire?

Mise à jour:

Nous avons confirmé avec des Développeurs d'Apple Support Technique pour les applications utilisant à la fois le GPS et le Lieu Significatif de Surveillance de notre séquence de désactivation du Lieu Significatif de Surveillance avant d'activer le GPS de mise à jour est correcte.

Nous avons également confirmé que le drain question peut encore être vu dans le GM 5.1 et avec une re-compilation de Trouver Ma Voiture plus Intelligente de la demande à l'encontre de l'5.1 Cadres.

Mise à jour:

Il semble que la question est déclenché lorsque notre application est lancée à partir de l'arrière-plan en réponse à un Lieu Significatif de Surveillance de l'événement. Nous ne gérons pas ce scénario correctement dans notre exemple de code, mais nous le faisons dans notre application réelle.

Dans l'exemple de code, sur un arrière-plan de relance, nous allons tourner sur l'emplacement de mise à jour et depuis il n'y a pas un applicationDidEnterBackground appel, le GPS ne sera laissé sur.

Dans notre application, nous allons vérifier si nous avons été lancé à partir de l'arrière-plan par la recherche de la UIApplicationLaunchOptionsLocationkey drapeau, si nous commençons donc Important l'Emplacement de la Surveillance, sinon nous avons été lancé en premier plan et nous commençons la mise à Jour de Localisation.

Apple a obtenu de nouveau à nous, et a déclaré que l'utilisation d'un Lieu Significatif de Surveillance ne nécessite pas l'emplacement défini dans UIBackgroundModes tableau dans l'Info.plist. Nous avons retiré de cette entrée, et il semble que le drainage de la batterie de l'état n'est plus frappé. Nous avons encore bluetooth-central, dans la UIBackgroundModes liste. Pour le moment nous sommes pas pourquoi cette aide. Nous allons être en cours d'exécution peu plus d'expériences pour nous aider à mieux comprendre ce processus. Si quelqu'un a des suggestions s'il vous plaît laissez-nous savoir.

17voto

fmc Points 311

En fin de journée, la suggestion d'Apple de supprimer l'emplacement de UIBackgroundModes corrigeait le problème d'épuisement de la batterie.

Afin de conserver les emplacements en arrière-plan, nous avons dû boucler les appels [locationManager startLocationUpdates] & [locationManager stopLocationUpdates] avec:

 [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler];
[[UIApplication sharedApplication] endBackgroundTask:];
 

2voto

AlexeyVMP Points 628

Vous pourriez état de débogage de l'application à l'aide de tout signal répétitif son. Assurez-vous juste de ne pas mettre "audio" dans le contexte des modes exigences pour ce test. Si votre application en cours d'exécution - vous entendrez cela sonne même application est en arrière-plan. Si l'application est suspendue - vous n'entendrez rien d'autre. C'est probablement la méthode la plus simple pour détecter que l'application n'est pas correctement suspendu.

À l'aide du générateur de profils pour le débogage de cette question est problématique parce que beaucoup de choses œuvres différentes dans le mode de débogage lorsque le périphérique connecté à l'ordinateur. Surtout d'économie d'énergie choses.

Aussi, assurez-vous que vous faites tout droit, en réponse à d'importantes modifications de l'emplacement. Si vous commencez à l'emplacement des mises à jour, assurez-vous que vous avez mis quelques minuterie (pour 3 minutes, par exemple) qui s'arrête emplacement des mises à jour. De toute façon, l'iOS va vous tuer application même il a commencé à l'emplacement des mises à jour à partir de répondre à d'importantes modifications de l'emplacement. N'a pas d'importance ce que vous avez commencé dans la réponse - l'application sera tué dans les 10 minutes si toujours en cours d'exécution - attention à crash logs - tel événement sera enregistré là.

Aussi, vérifiez l'ensemble de la 3e partie du code et libs - peut-être certains d'entre eux se tourne GPS et de l'utiliser pour des choses. Surtout paranoïaque, mais il peut se passer de l'analyse et de la publicité des fins de ciblage.

0voto

Saroj Kumar ojha Points 195

Les applications activées par CoreLocation sont généralement conçues pour le mode d’arrière-plan. Elles peuvent donc être exécutées en arrière-plan, mais elles consomment plus de batterie. Je suggère toujours d’arrêter le service de localisation quand il n’est pas nécessaire.

[locationManager stopUpdatingLocation];

puis après en fonction de vos besoins, commencez en conséquence,

Merci

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X