Какая техника iOS GPS (CLLocationManager) лучше всего подходит для экономии заряда батареи?
Я написал приложение GPS для iOS 10 некоторое время назад. Я получил его до такой степени, что он стабилен и работает, как ожидалось, и теперь я хочу пойти на приемы экономии заряда батареи. Прямо сейчас приложение отправляет GPS-координаты каждые 5 минут, но я могу быть уверен в том, как часто я отправляю GPS-координаты, если они отправляются не слишком часто. Моему приложению также требуется настройка местоположения GPS "лучший" или "10 м", которая, как я знаю, потребляет много энергии, но я не могу использовать настройку 3 км в соответствии с моими требованиями (которая, как я знаю, позволит сэкономить больше энергии).
Из того, что я собираю и читаю документы и играю с кодом, чтобы заставить его работать, кажется, что есть 2 метода:
- set pausesLocationUpdatesAutomatics = YES в сочетании с UNLocationNotificationTrigger
- allowDeferredLocationUpdatesUntilTraveled: тайм-аут:
Номер 2, по-видимому, не работает вообще на основе этой статьи в iOS 10 и 11.
Номер 1 дает мне спорадические результаты, когда я регистрирую его на своем сервере. Иногда это работает, иногда я получаю одну точку GPS посреди ниоткуда (не видя паузы или сообщения журнала возобновления), а затем позже она начинает работать, в других случаях кажется, что она вообще не работает.
Иногда я вижу 2 паузы в одну и ту же секунду.
В других случаях я видел, как это возобновляло местоположения спина к спине (минуты), не видя сообщения журнала паузы А иногда я вижу сообщение журнала паузы и через несколько минут (или немного позже) возобновляет отправку GPS, не видя сообщения журнала "возобновить".
- (void) setGPSBatterySavingTrigger
{
if (IS_IOS_10_OR_LATER && ([g_prefs getGPSAuthStatus] == kCLAuthorizationStatusAuthorizedAlways))
{
CLLocationCoordinate2D center = CLLocationCoordinate2DMake(g_locMgr.getLastLocation.latitude, g_locMgr.getLastLocation.longitude);
CLRegion *region = nil;
float radius_m = 150.0;
region = [[CLCircularRegion alloc] initWithCenter:center radius:radius_m identifier:@"pauseLocationsCenter"];
if (!region) {
[logger log:TSERVLOG :@"pause radius failed at radius <%f>", radius_m];
return;
}
region.notifyOnEntry = NO;
region.notifyOnExit = YES;
UNLocationNotificationTrigger *trigger = [UNLocationNotificationTrigger
triggerWithRegion:region repeats:NO];
UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];
content.title = PROG_NAME;
content.body = @"GPS Restarted";
//content.sound = [UNNotificationSound soundNamed:nil];
UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:@"GPSTextNotify" content:content trigger:trigger];
[[UNUserNotificationCenter currentNotificationCenter] removeAllPendingNotificationRequests];
[[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:request withCompletionHandler:^(NSError *error)
{
if (error.code)
{
[logger log:TSERVLOG :@"UNUserNotificationCenter addRequest FAILED <%@>", error.localizedDescription];
}
}];
}
}
- (void) locationManagerDidPauseLocationUpdates:(CLLocationManager *)manager
{
[logger log:TSERVLOG :@"===== JME GPS PauseLocationUpdates at <%@> <%f, %f>",
[mydate getCurrentDateTimeStr], self.getLastLocation.latitude, self.getLastLocation.longitude];
[self setGPSBatterySavingTrigger];
}
- (void) locationManagerDidResumeLocationUpdates:(CLLocationManager *)manager
{
[logger log:TSERVLOG :@"===== GPS ResumeLocationUpdates at <%@> <%f, %f>",
[mydate getCurrentDateTimeStr], self.getLastLocation.latitude, self.getLastLocation.longitude];
}
Итог вопросы:
- Кто-нибудь был в состоянии использовать любой из них для надежной работы от батареи + GPS в iOS 10+?
- Если нет, то какую комбинацию вы делали, чтобы заставить его работать 100% времени, экономя время автономной работы?
- Я скучаю по другой технике, которая работает? (ПРИМЕЧАНИЕ: мои требования не могут использовать настройку 3 км)
Спасибо за ваш вклад!