Местоположение iOS Фоновый режим Время работы

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

Так что поток будет,

  1. Войдите в зону действия маяка.
  2. Запустите таймер.
  3. Таймер истекает, опубликуйте уведомление.

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

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

Может ли кто-нибудь пролить свет на то, сколько времени выполнения фонового режима местоположения позволяет приложению при запуске в фоновом режиме, как это?


person user3617723    schedule 09.10.2014    source источник


Ответы (2)


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

- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region {
    [manager startRangingBeaconsInRegion:(CLBeaconRegion *)region];
    self.beaconCount=0;
}

-(void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region {
    [manager stopRangingBeaconsInRegion:(CLBeaconRegion*)region];
}

- (void)locationManager:(CLLocationManager *)manager
        didRangeBeacons:(NSArray *)beacons
               inRegion:(CLBeaconRegion *)region {
        self.beaconCount++;
        if (self.beaconCount > SOME_THRESHOLD) {
            [manager stopRangingBeaconsInRegion:region];
            [self postLocalNotification];
        }
}

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

person Paulw11    schedule 09.10.2014
comment
ранжирование в фоновом режиме также не будет длиться вечно. когда время фонового выполнения истечет, ранжирование остановится. - person dadalar; 09.10.2014
comment
Нет, если вы указали фоновый режим местоположения (и запрашивали всегда авторизацию на iOS 8), то вы можете бесконечно варьироваться в фоновом режиме, так же как вы можете отслеживать регионы. Несмотря на это, вам нужно всего лишь несколько секунд, чтобы определить, что вы находитесь в зоне действия маяка, а затем вы можете отобразить предупреждение и закончить диапазон. Я обновлю свой ответ некоторым примером кода - person Paulw11; 09.10.2014
comment
Спасибо, этот подход имеет смысл - person user3617723; 09.10.2014
comment
@ Paulw11, вы уверены, что можете бесконечно работать в фоновом режиме в iOS 8 с указанием местоположения UIBackgroundModes в вашем plist? Я пробовал это, но получил только 10 секунд времени фонового диапазона, как в iOS 7. См. мое тестовое приложение здесь: github.com/RadiusNetworks/ibeacon-background-demo/tree/ios8 Конечно, вы можете бесконечно отслеживать обновления изменений в фоновом режиме, а затем переключаться в течение 10 секунд на каждое из этих События. Но я не верю, что можно продолжать бесконечно крутиться в фоновом режиме. - person davidgyoung; 14.10.2014
comment
Уточню свой ответ - можно дальномерить достаточно долго, чтобы добавить гистерезис, что ищут - т.е. определить, что они в районе, а не просто прошли мимо маяка - person Paulw11; 14.10.2014

Для этого можно использовать локальные уведомления. Нет гарантии, как долго ваше приложение будет работать в фоновом режиме. Если вы хотите узнать, сколько времени дает вам ОС, вы можете проверить свойство backgroundTimeRemaining класса UIApplication.

https://developer.apple.com/library/ios/documentation/uikit/reference/UIApplication_Class/index.html#//apple_ref/occ/instp/UIApplication/backgroundTimeRemaining

person dadalar    schedule 09.10.2014