Мы выпустили приложение, которое работает в фоновом режиме и использует 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.На данный момент нам неясно, почему это помогает.Мы собираемся провести еще несколько экспериментов, чтобы помочь нам лучше понять это.Если у кого-то есть предложения, пожалуйста, сообщите нам.