Метод didRangeBeacons не вызывается, когда дисплей выключен

Я работаю с ibeacons пару недель, я пытался опубликовать некоторые локальные уведомления, когда iphone попадает в область маяка (когда близость).

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

Я знаю, используя

 region.notifyEntryStateOnDisplay = true;

мы можем получать уведомления при включенном дисплее.

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

Пожалуйста, помогите мне.


person Madhu    schedule 11.12.2013    source источник


Ответы (4)


Вполне возможно установить маяки в фоновом режиме.

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

locationManager2 = [[CLLocationManager alloc] init];
locationManager2.delegate = self;
locationManager2.desiredAccuracy = kCLLocationAccuracyKilometer;
[locationManager2 startUpdatingLocation];

-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{
     //Do nothing here, but enjoy ranging callbacks in background :-)
}

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

person John Doe    schedule 13.02.2014
comment
Да, наконец-то это произошло, у меня есть 10 маяков в массиве, я вызывал все маяки в цикле for для ранжирования, и, наконец, он ранжировал маяки, хотя мое приложение находится в заблокированном состоянии со спящим режимом (т.е. без света), что я сделал, я попытался создать объект CLBeaconregion для каждого цикла uuid близости, а затем передать его в [_locationManager startMonitoringForRegion:beaconRegionsObj]; [_locationManager startRangingBeaconsInRegion:beaconRegionsObj]; - person Madhu; 25.02.2014

Если вы запросили как уведомления о входе маяка, так и ранжирование, и вы ВХОДИТЕ в новый регион, когда экран заблокирован, вы получите сообщение didEnterRegion (или, возможно, сообщение didDetermineState), за которым следуют примерно 5 секунд сообщений ранжирования. Если пользователь не выводит устройство из спящего режима в течение этих 5 секунд, сообщения о ранжировании прекращаются.

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

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

person Duncan C    schedule 12.12.2013
comment
Похоже, вы были правы в эти 5 секунд времени, я просто сделаю предупреждение, как будто вы только что вошли в зону маяка, а затем через 5 секунд я могу получить уведомление, когда свет горит, я попробую с этим. Спасибо, Дункан. - person Madhu; 13.12.2013

Нет, это задумано и отражает цель iOS по экономии заряда батареи. Вы можете рассчитывать только на didRangeBeacons:, пока приложение активно.

Дэвид Янг довольно тщательная запись, которая может помочь прояснить.

person Erik Kerber    schedule 11.12.2013

У меня та же проблема, что и у Мадху. Вместо didUpdateToLocation я использовал didUpdateLocations, что сработало для меня. Теперь я могу управлять маяками, когда приложение находится в фоновом режиме или закрыто с заблокированным и выключенным дисплеем.

На iOS 8.4

func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) {
    //Do nothing here
}
person yvzzztrk    schedule 15.09.2015