Разряд батареи при использовании CoreLocation Significant Location Monitoring & CoreBluetooth

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

На высоком уровне наше приложение просто ищет событие отключения CoreBluetooth и включает GPS до тех пор, пока мы не получим исправление местоположения (точность

Во время нашей разработки мы никогда не сталкивались с проблемой разрядки батареи, однако 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 Latitude или Facebook и т. д., они видят утечку.Или если они идут и убивают другие приложения сток уходит. Мы видели, что утечка сохраняется после выключения питания без запуска приложений. Это означает, что это должна быть служба системного уровня, которая предотвращает спящий режим ОС.

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

На iPhone 4S версии 5.0.1 с стертыми данными, на котором были установлены только эти два приложения 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, что для приложений, использующих как GPS, так и мониторинг важных местоположений, наша последовательность отключения мониторинга важных местоположений перед включением обновления GPS верно.

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

Обновление:

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

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

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

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

38
задан Yi Jiang 3 June 2012 в 12:24
поделиться