2015-09-20 3 views
8

У меня есть приложение, которое должно сообщать о местоположении пользователя, даже если оно составлено или даже убито (завершено). Проблема в том, что приложение должно сообщать о местоположении не редко, чем в течение 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.

Есть ли у вас какие-либо предложения о том, как заставить фоновые попытки работать чаще (или доказывать ссылки, что это невозможно)? Любые альтернативные решения для удовлетворения моих требований также приветствуются!

+1

Фон не имел гарантированный срок выполнения. Я предлагаю вам отправлять тихое нажатие на ваше устройство, чтобы дать ему возможность сообщать о местоположении, но это не будет работать, если приложение будет прекращено. – Paulw11

+0

Это никогда не гарантировалось, но, по крайней мере, оно работало чаще. Были ли существенные изменения с тех пор, как iOS 7 связана с фоновыми выборками? –

+1

Какое значение для вас возвращается обработчику завершения? Новые данные или новые данные? По моему опыту даже на iOS8 его не вызывали каждые 20-30 минут. – Paulw11

ответ

4

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

  • времени вы проводите в обработчике
  • результат (NoData, NewData)
  • обработки ошибок (вы будете будет запущенно менее вероятно, если вы код аварий
  • таймаута (ваше выполнение кода, может быть прервано прошивкой)
  • потребления энергии
  • сетевой активности, связанная с результатом (вы должны сделать запрос к сети, говоря, т у вас есть NewData, иначе ваша выборка может быть выполнена в следующий раз за день или около того.

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

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

Apple, документы: не выборки https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

3

Я работал над аналогичным проектом. Попробовав различные решения, единственный способ, я нашел решение, предложенное здесь: https://github.com/voyage11/Location

Вот учебник, соответствующий мерзавца: http://mobileoop.com/getting-location-updates-for-ios-7-and-8-when-the-app-is-killedterminatedsuspended

Все кредиты на https://stackoverflow.com/users/1995940/ricky

Это спас меня много времени!

Смежные вопросы