Разряд батареи при использовании CoreLocation для мониторинга значимых местоположений и CoreBluetooth - PullRequest
38 голосов
/ 01 марта 2012

Мы выпустили приложение, которое работает в фоновом режиме и использует CoreBluetooth & CoreLocation для автоматического сохранения вашего места для парковки.

На высоком уровне наше приложение просто ищет событие отключения CoreBluetooth и включает GPS, пока мы не получим определение местоположения (точность <= 10 м) или максимальное время 3 минуты (это может произойти при парковке в подземной парковке много без покрытия GPS). Затем мы используем Мониторинг значимого местоположения, чтобы автоматически перезапустить наше приложение в случае остановки системы нашим приложением. </p>

Во время нашей разработки мы никогда не сталкивались с проблемой разрядки батареи, однако 75% наших пользователей говорят, что они видят значительную разрядку батареи. 10% наших сторонников ответили на опрос, поэтому трудно определить, насколько репрезентативна разбивка, но это большой процент наших пользователей. http://www.findmycarsmarter.com/forum/viewtopic.php?f=4&t=30

Затем мы выпустили обновление, которое позволило пользователям отключить мониторинг значимого местоположения, и 60% сказали, что при отключении мониторинга значительного местоположения утечка исчезает. http://www.findmycarsmarter.com/forum/viewtopic.php?f=4&t=42

Изначально мы не могли сами продублировать проблему с утечкой, но обнаружили, что когда мы установили простое приложение, которое просто включало существенный контроль местоположения в сочетании с Find My Car Smarter, мы периодически видели, как воспроизводится утечка. В состоянии стока телефон не переходит в спящий режим. На это указывает время использования в (Настройки-> Использование-> Время с момента последней полной зарядки), продолжающее увеличиваться, даже если телефон был переведен в спящий режим, а дисплей выключен. Что-то мешает системе войти в спящий режим. На этом этапе батарея разряжается примерно на 15% в час. Эта утечка проявляется периодически и, кажется, очищается через час или два и снова появляется случайным образом. Мы не нашли способ надежного воспроизведения стока.

Мы считаем, что проблема вызвана несколькими клиентами, звонящими в CoreLocation. Мы попросили нескольких пользователей, которые столкнулись с проблемой, стереть свой телефон и установить только наше приложение Find My Car Smarter. Наедине только с этим приложением сток не выставлялся. У нас были другие сообщения о том, что когда наше приложение используется с Google Локатором или Facebook и т. Д., Это когда они видят утечку. Или если они идут и убивают другие приложения, утечка исчезает. Мы видели, что утечка сохраняется в цикле выключения питания без запуска приложений. Это подразумевает, что это должна быть служба системного уровня, которая не позволяет ОС спать.

Несмотря на то, что мы думаем, что проблема вызвана неким состязанием нескольких клиентов, обращающихся в CoreLocation, мы никогда не видели, чтобы проблема воспроизводилась в приложениях, которые использовали только CoreLocation. Мы даже создали 4 или 5 различных приложений, которые одновременно обращались бы к CoreLocation, и мы не видели, как произошла утечка. Однако мы увидели проблему, когда у нас было приложение с CoreLocation и второе приложение с CoreLocation + CoreBluetooth. Вероятно, существует очень мало приложений, которые используют комбинацию CoreLocation + CoreBluetooth, поэтому потенциально именно поэтому больше разработчиков не решают эту проблему. Хотя мы затрудняемся объяснить, как CoreLocation и CoreBluetooth взаимодействуют, чтобы вызвать эту утечку, и как второе приложение с CoreLocation входит в уравнение. Поскольку утечка была прерывистой, возможно, это просто случайность, что проблема возникла только тогда, когда мы тестировали с CoreLocation + CoreBluetooth.

На вытертом 5.0.1 iPhone 4S с только этими двумя установленными приложениями CTM1 и FMC мы смогли периодически переходить в состояние утечки. Интересно, что проблема утечки, по-видимому, возникала гораздо реже на вытертом устройстве, чем на нашем обычном устройстве. К сожалению, мы видели состояние стока только несколько раз, и, не имея возможности надежно воспроизвести сток, у нас нет хорошего состояния управления для работы.

Мы подали отчет об ошибке в Apple и открыли инцидент технической поддержки, но, возможно, сообщество Stackover также может предоставить некоторую информацию. Мы видели эту проблему как в 5.0.1, так и в 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];

Если вы обнаружите какие-либо ошибки кодирования, которые могут быть причиной утечки, пожалуйста, сообщите нам.

Еще один вопрос, который у нас возник, еслимы используем как GPS, так и мониторинг значимого местоположения, есть ли причина для звонка stopMonitoringSignificantLocationChanges?Глядя на пример кода регионов, они называют stopMonitoringSignificantLocationChanges & startLocationUpdate при входе на передний план и stopLocationUpdate & startMonitoringSignificantLocationChanges при входе в фон, но мне интересно, если это необходимо / рекомендуется / требуется?

Обновление:

Служба технической поддержки Apple Developer подтвердила, что для приложений, использующих как GPS, так и мониторинг значимых местоположений, наша последовательность отключения мониторинга значимых местоположений перед включением обновления GPS правильная.

МыМы также подтвердили, что проблема утечки все еще видна в GM 5.1 и с перекомпилированным приложением Find My Car Smarter против 5.1 Frameworks.

Обновление:

Похоже, что проблема возникает, когда наше приложение запускается из фона в ответ на событие наблюдения за значимым местоположением.На самом деле, мы не выполняем этот сценарий должным образом в нашем примере кода, но делаем это в нашем реальном приложении.

В примере кода при повторном запуске в фоновом режиме мы включим обновление местоположения, а посколькувызов applicationDidEnterBackground, GPS останется включенным.

В нашем приложении мы проверяем, был ли мы запущены из фона, ища флаг UIApplicationLaunchOptionsLocationKey, если так, мы запускаем мониторинг существенного местоположения, в противном случае мы были запущенына переднем плане, и мы начинаем Обновление местоположения.

Apple вернулась к нам и заявила, что для использования существенного мониторинга местоположения не требуется местоположение, установленное в массиве UIBackgroundModes в Info.plist.Мы удалили эту запись, и кажется, что состояние разряда батареи больше не затронуто.У нас все еще есть bluetooth-центральный в списке UIBackgroundModes.На данный момент нам неясно, почему это помогает.Мы собираемся провести еще несколько экспериментов, чтобы помочь нам лучше понять это.Если у кого-то есть предложения, пожалуйста, сообщите нам.

Ответы [ 3 ]

17 голосов
/ 16 апреля 2012

В конце концов, предложение Apple об удалении местоположения из UIBackgroundModes устранило проблему с разрядкой аккумулятора.

Чтобы по-прежнему получать местоположения в фоновом режиме, нам пришлось обернуть вызовы [locationManager startLocationUpdates] & [locationManager stopLocationUpdates]:

[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler];
[[UIApplication sharedApplication] endBackgroundTask:];
2 голосов
/ 09 апреля 2012

Вы можете отладить состояние приложения, используя любой повторяющийся звуковой сигнал. Просто убедитесь, что вы не включили «Play Audio» в требования фоновых режимов для этого теста. Если ваше приложение работает - вы услышите это, даже если приложение находится в фоновом режиме. Если приложение приостановлено - вы ничего не услышите. Это, вероятно, самый простой способ обнаружить, что приложение не приостановлено должным образом.

Использование Profiler для отладки этой проблемы проблематично, потому что многие вещи работают по-разному в режиме отладки, когда устройство подключено к компьютеру. Особенно энергосберегающие вещи.

Также, пожалуйста, убедитесь, что вы делаете все правильно в ответ на значительные изменения местоположения. Если вы запускаете обновления местоположения - убедитесь, что вы установили таймер (например, на 3 минуты), который отключает обновления местоположения. В любом случае, iOS убьет ваше приложение, даже если оно начало обновлять местоположение в ответ на значительные изменения местоположения. Не имеет значения, что вы начали в ответ - приложение будет убито через 10 минут, если оно все еще работает - обратите внимание на журналы сбоев - такое событие будет зарегистрировано там.

Кроме того, проверьте все свои сторонние коды и библиотеки - возможно, некоторые из них поворачивают GPS и используют его для некоторых целей. В основном параноидальный, но может случиться в аналитических и рекламных целях.

0 голосов
/ 13 апреля 2012

Приложения с поддержкой CoreLocation обычно делаются в фоновом режиме, поэтому они могут работать в фоновом режиме, определенно он использует больше батареи, для моего предложения всегда пытайтесь остановить службу определения местоположения, когда это не нужно.

[locationManagerstopUpdatingLocation];

затем после согласно вашему требованию, затем начните соответственно,

Спасибо

...