Откройте приложение с помощью iBeacon

Я так взволнован новой версией iOs 7.1 с большими изменениями для iBeacon, о которых говорится здесь: http://beekn.net/2014/03/apple-ios-7-1-launches-major-ibeacon-improvement/

и здесь: http://beekn.net/2014/03/prisoners-dilemma-ios-7-1-challenges-ibeacon-developers/

По теме сказали что

В iOS 7.0 вы могли просто закрыть приложение, и оно перестанет отправлять вам сообщения. Теперь приложению даже не нужно быть открытым или работать в фоновом режиме.

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

Так как же узнать, что устройство iOS 7.1 вошло в регион iBeacon? И если вы можете поймать, когда закрытое приложение входит в область iBeacon, можете ли вы разбудить его (открыть)?


person JozackOverFlow    schedule 18.03.2014    source источник
comment
Ничто из этого не является новым в iOS 7.1. Единственное, что изменилось в версии 7.1, — это поведение после того, как пользователь убивает приложение в переключателе задач. Это очень частный случай, который не похож на то, что вы описываете. Чтобы было ясно, iOS 7 ВСЕГДА поддерживает фоновое обнаружение iBeacons и обнаружение после перезагрузки телефона, даже если приложение не было перезапущено вручную.   -  person davidgyoung    schedule 18.03.2014
comment
@davidgyoung И когда вы убиваете приложение с помощью переключателя задач, как вы узнаете, когда входите в область маяка? Я имею в виду, что из-за того, что вы убили приложение, оно не может выполнять никакую реализацию, которую вы в него написали.   -  person JozackOverFlow    schedule 19.03.2014
comment
Если вы войдете в регион, ваше убитое приложение перезапустится в фоновом режиме, и вы получите обратный вызов в методе CLLocationManagerDelegate. Это ничем не отличается от поведения, если бы ваше приложение не было убито. Изменение в iOS7.1 заключается в том, что это больше не блокируется.   -  person davidgyoung    schedule 19.03.2014


Ответы (2)


Короче да. Я реализовал это в приложении, и при входе в диапазон маяка выполняется вызов:

- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region;

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

В магазине есть отличный небольшой пример приложения под названием Hide My iPhone от John Yorke. Он открыл исходный код здесь, и он показывает, как настроить маяки и реагировать на них в приложении.

Я также использовал руководство от Apple здесь чтобы узнать больше.

person Cocoadelica    schedule 18.03.2014
comment
Привет, я могу делать вещи в фоновом режиме при входе в маяк. Но я все еще смущен этим. В iOS 7.0 вы можете просто закрыть приложение, и оно перестанет отправлять вам сообщения. Теперь приложению даже не нужно быть открытым или работать в фоновом режиме. Если вы перезагрузите телефон, а затем не откроете приложение, когда вы входите в область маяка, как приложение может об этом узнать?? - person JozackOverFlow; 19.03.2014
comment
@Jozol, даже в iOS7.0 ваше приложение можно запустить после загрузки, указав регион. Его просто нужно запустить один раз (до перезагрузки), чтобы настроить монитор региона. Ваше приложение просто получает обратный вызов, как описано в моем комментарии к вашему вопросу. - person davidgyoung; 19.03.2014
comment
В 7.1 он также значительно улучшен, значительно надежнее, и я решил сделать 7.1 минимальной версией ОС, чтобы улучшить взаимодействие с пользователем. - person Cocoadelica; 19.03.2014

iOS запускает ваше приложение при входе в регион iBeacon, даже если ваше приложение было полностью закрыто. Вы можете проверить это, выполнив следующие действия:

  1. Определите locationManager в AppDelegate и добавьте делегата CLLocationManagerDelegate;
  2. Init locationManager in - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.delegate = self;
    
  3. Добавьте методы:

    - (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region {
        if ([region isKindOfClass:[CLBeaconRegion class]]) {
            UILocalNotification *notification = [[UILocalNotification alloc] init];
            notification.alertBody = @"didExitRegion";
            notification.soundName = @"Default";
            [[UIApplication sharedApplication] presentLocalNotificationNow:notification];
        }
    }
    
    
    - (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region {
        if ([region isKindOfClass:[CLBeaconRegion class]]) {
            UILocalNotification *notification = [[UILocalNotification alloc] init];
            notification.alertBody = @"didEnterRegion";
            notification.soundName = @"Default";
            [[UIApplication sharedApplication] presentLocalNotificationNow:notification];
        }
    }
    
person Vince Yuan    schedule 09.06.2014
comment
didEnterRegion вызывается, когда приложение убито, но кажется, что после этого оно не остается в фоновом режиме. Я использую iOS 11 - person Michal Gumny; 07.09.2018