Что я хочу сделать: 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 запускается, когда приложение находится в фоновом режиме?