У меня есть приложение, которое должно сообщать о местоположении пользователя, даже если оно составлено или даже убито (завершено). Проблема в том, что приложение должно сообщать о местоположении не редко, чем в течение 1 часа.iOS периодическое обновление местоположения фона, которое зависит не только от значительного изменения местоположения
Я использую значительное изменение местоположения (SLC), чтобы отслеживать все движения, которых вполне достаточно, когда пользователь находится в дороге, но как только пользователь останавливается, никаких дополнительных обновлений не возникает, и у приложения нет возможности отправить новое местоположение (в то время как пользователь остается в той же области, но без SLC).
Чтобы охватить этот случай, я начинаю использовать фоновые выборки, чтобы периодически отправлять местоположение обновлений в фоновом режиме, даже без SLC). Проблема здесь в том, что фоновые выборки используются для работы довольно часто (каждые 20-30 минут с тех пор, как я использовал тогда в другом приложении iOS 7.x), но теперь с iOS8/iOS9 я могу получить его только один раз в день или около того, что неприемлемо в моем случае. Я выполнил тонну тестов, разработал простое приложение для извлечения фона, которое добавляет локальное уведомление при извлечении. Не повезло заставить его работать чаще.
Вот мой AppDelegate:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];
[application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound categories:nil]];
return YES;
}
- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
[[UIApplication sharedApplication] cancelAllLocalNotifications];
UILocalNotification *localNotification = [[UILocalNotification alloc] init];
NSDate *now = [NSDate date];
localNotification.fireDate = now;
localNotification.alertBody = [NSString stringWithFormat:@"Background fetch!"];
localNotification.soundName = UILocalNotificationDefaultSoundName;
NSInteger number = [UIApplication sharedApplication].applicationIconBadgeNumber;
number++;
localNotification.applicationIconBadgeNumber = number;
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
completionHandler(UIBackgroundFetchResultNewData);
}
Все, что делается здесь, чтобы добавить локальное уведомление на каждом фоне выборки. Я всегда завершаю выполнение фона с помощью UIBackgroundFetchResultNewData.
Есть ли у вас какие-либо предложения о том, как заставить фоновые попытки работать чаще (или доказывать ссылки, что это невозможно)? Любые альтернативные решения для удовлетворения моих требований также приветствуются!
Фон не имел гарантированный срок выполнения. Я предлагаю вам отправлять тихое нажатие на ваше устройство, чтобы дать ему возможность сообщать о местоположении, но это не будет работать, если приложение будет прекращено. – Paulw11
Это никогда не гарантировалось, но, по крайней мере, оно работало чаще. Были ли существенные изменения с тех пор, как iOS 7 связана с фоновыми выборками? –
Какое значение для вас возвращается обработчику завершения? Новые данные или новые данные? По моему опыту даже на iOS8 его не вызывали каждые 20-30 минут. – Paulw11