iOS: Как запустить обновлениеLocation, когда приложение пробуждается с помощью didEnterRegion? - PullRequest
0 голосов
/ 07 мая 2020

Что я хочу сделать: iPhone спит. В фоновом режиме диспетчер местоположения выполняет поиск региона маяка. Если этот регион распознан, мое приложение должно запустить маяк, чтобы проверить расстояние до маяка. Радиомаяк должен остановиться, когда вы покинете регион.

Итак, вот мой код:


-(void)locationManager:(CLLocationManager *)manager
        didEnterRegion:(CLRegion *)region
{
    NSLog(@"********** Beacon Region entered: %@", region);

    self.locationManager.allowsBackgroundLocationUpdates = YES;
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    [self.locationManager startUpdatingLocation];

    [self doBeaconRanging:(CLBeaconRegion *)region];

}

-(void)locationManager:(CLLocationManager *)manager
       didRangeBeacons:(NSArray<CLBeacon *> *)beacons
              inRegion:(CLBeaconRegion *)region
{
    NSLog(@"locationManager didRangeBeacons inRegion.");
}

-(void)locationManager:(CLLocationManager *)manager
    didUpdateLocations:(nonnull NSArray<CLLocation *> *)locations {

    NSLog(@"locationManager didUpdateLocations");
}

-(void)locationManager:(CLLocationManager *)manager
         didExitRegion:(CLRegion *)region
{

    NSLog(@"********** Beacon Region left **********");

    [self.locationManager stopUpdatingLocation];

    NSSet *regions = [self.locationManager monitoredRegions];
    for(CLBeaconRegion *region in regions)
    {
        [self.locationManager stopRangingBeaconsInRegion:region];
    }
}

Это отлично работает, если регион вводится, когда приложение находится на переднем плане. didEnterRegion запускается, и запускается определение дальности маяка. Даже если я отправлю приложение и iPhone в спящий режим, дальность действия маяка будет продолжаться и включаться (просто для проверки, в реальном приложении я остановлю диапазон маяка примерно через 3 минуты).

Но когда didEnterRegion запускается, а iPhone заблокирован, поведение другое. Запускается обновление местоположения и определение расстояния до маяка, но только прибл. 10 секунд. Через 10 секунд iPhone снова переходит в спящий режим, и обновления местоположения и дальность действия маяка прекращаются. Когда я пробуждаю приложение, сразу же запускаются обновления местоположения и дальность действия маяка. Но, конечно, я не хочу будить приложение. Все должно работать в фоновом режиме без необходимости открывать приложение.

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

Как я могу начать обновление Location, когда didEnteredRegion запускается, когда приложение находится в фоновом режиме?

1 Ответ

0 голосов
/ 07 мая 2020

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

  1. Переход в фоновый режим
  2. Запись мониторинга / exit событие (например, геозона или регион маяка, вход в событие выхода)
  3. Экран по событию (если мониторинг маяка включен и notifyEntryStateOnDisplay имеет значение true для отслеживаемого региона).

В В дополнение к вышесказанному можно увеличить время, в течение которого фоновый диапазон разрешен после одного из этих событий, с 10 секунд до 30 секунд (180 секунд в iOS 12 и ранее), запустив фоновую задачу.

Наконец, вы можете продлить 30 секунд до неопределенного периода времени, дополнительно объявив фоновый режим местоположения в Info.plist и используя CoreLocation для вызова startUpdatingLocation. Точности 3 км при обновлении местоположения достаточно, чтобы поддерживать дальность бесконечно долго без сжигания батареи с помощью GPS. создают приложение, похожее на навигационное. Также имейте в виду, что постоянный фоновый диапазон будет потреблять значительную батарею, хотя и меньше, чем постоянное использование GPS.

Вы можете узнать больше о выполнении этих параметров в моем сообщении в блоге здесь.

...