уведомление iBeacon, когда приложение не работает


мне удалось сделать iBeacon, который запускает локальное push-уведомление на моем iPhone, когда маяк находится в зоне действия. Это прекрасно работает, когда приложение находится в фоновом режиме.

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

Я думал, что это возможно, но я не уверен. Если да, то как я могу это сделать?

спасибо!

6 57

6 ответов:

Да, возможно и должно быть автоматическим.

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

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

будьте осторожны при тестировании этого, потому что иногда это занимает до 4 минут после включения/выключения iBeacon, прежде чем iOS распознает переход состояния региона. EDIT: начиная с iPhone 5, приложения будут обычно аппаратное ускорение используется для обнаружения маяков в течение нескольких секунд, а если аппаратное ускорение недоступно, оно может занять до 15 минут.

EDIT: начиная с iOS 8, вам нужно убедиться, что вы позвонили и успешно получили locationManager.requestAlwaysAuthorization() Как locationManager.requestWhenInUseAuthorization() только позволяет обнаруживать маяки на переднем плане.

я опубликовал подробное обсуждение того, как это все работает в это сообщение в блоге.

хорошо, я получил это, чтобы работать правильно и экспериментировал с ним так вот ответ. Это то, что вам нужно сделать, чтобы ваше приложение вызывалось при пересечении границы области маяка после завершения работы приложения (при условии, что ваше приложение работает правильно, когда оно находится на переднем плане):

  1. вы должны реализовать CLLocation делегат внутри AppDelegate.m модуль. Этот делегат будет ссылаться на iOS, поэтому если у вас нет CLLocation код делегата в AppDelegate.m, вы не сможете ответить на iOS, когда ваше приложение было прекращено. Это то, что делает приложение AirLocate от Apple.

Итак, внутри AppDelegate.m вам нужно следующее (Вам также нужно связать в CoreLocation.h):

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.

// This location manager will be used to notify the user of region state transitions when the app has been previously terminated.
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
return YES;
}
  1. внутри AppDelegate.m, вам нужно реализовать locationManager didDetermineState метод, как это:

    -(void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region{
    
      UILocalNotification *notification = [[UILocalNotification alloc] init];
    
      if(state == CLRegionStateInside)
      {
        notification.alertBody = [NSString stringWithFormat:@"You are inside region %@", region.identifier];
      }
      else if(state == CLRegionStateOutside)
      {
        notification.alertBody = [NSString stringWithFormat:@"You are outside region %@", region.identifier];
      }
     else
     {
       return;
     }
    
      [[UIApplication sharedApplication] presentLocalNotificationNow:notification];
     }
    

--> так если ваше приложение было прекращено (оно должно быть запущено хотя бы один раз), когда устройство переходит через границу Маяка, которую вы отслеживаете, iOS вызовет ваше приложение и вызовет locationManager:didDetermineState метод в вашем AppDelegate.модулем M. Внутри этого метода вы можете настроить и вызвать presentLocalNotificationNow. Если ваше приложение не находится на переднем плане, когда это произойдет, iOS представит уведомление на экране, даже если оно заблокировано. Затем пользователь должен вызвать приложение для получения дополнительной информации.

я уверен, что нехватки памяти не имеет ничего общего с этим. Кроме того, настройка notifyEntryStateOnDisplay не имеет ничего общего с этой проблемой. Установка notifyEntryStateOnDisplay используется только тогда, когда пользователь включает дисплей устройства iOS (т. е. нажимает "домой" или верхнюю левую кнопку). Если пользователь делает это и notifyEntryStateOnDisplay и TRUE, и устройство находится внутри области маяка вы контролируете Для, то вы получите уведомление на дисплее в то время. Если это свойство имеет значение FALSE, вам не.

конечно, вы должны быть под управлением iOS 7.1 для того, чтобы этот материал, чтобы работать правильно.

для получения более подробной информации посетите Apple документация

вам нужно переключить notifyEntryStateOnDisplay=YES для CLBeaconRegion для системы, чтобы разбудить ваше приложение для события входа/выхода iBeacon.

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

просто обновите версию iOS до 7.1 и установите "notifyEntryStateOnDisplay=YES", и он должен работать как шарм, даже если ваше приложение не работает. У меня была эта проблема раньше, но она была исправлена, как только я сделал это обновление! Наслаждаться..

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

Да, мы можем представить локальное уведомление в состоянии убить или в фоновом режиме, просто выполните следующие действия,

1) запустите диспетчер местоположений с помощью класса CLLocationManager.

locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.desiredAccuracy=kCLLocationAccuracyBest;
locationManager.distanceFilter=kCLDistanceFilterNone;

2) создать CLBeaconRegion, как,

CLBeaconRegion *beacon_Region = [[CLBeaconRegion alloc] initWithProximityUUID:uuid major:mjorVa minor:minorVa identifier:identifier];
beacon_Region.notifyEntryStateOnDisplay = YES;
beacon_Region.notifyOnEntry=YES;
beacon_Region.notifyOnExit=YES;

3) реализовать два метода делегирования диспетчера местоположения, например,

-didEnterRegion
-didExitRegion

выше два метода менеджер местоположения будет работать даже ваше приложение убить или в фоновом режиме. Система будет отслеживать ваш маяк и когда он выходит за пределы диапазона, система запускает метод didExitRegion, а когда входит в систему, запускает метод didEnterRegion.