IBeacon: В чем разница между didEnterRegion и didDetermineState (CLRegionStateInside)

Я хочу опубликовать уведомление, когда пользователи входят в регион. Тем не менее, я очень смущен из-за тех же двух методов CLLocationManagerDelegate. Как следует использовать эти два метода правильно?

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

Спасибо,

- (void)locationManager:(CLLocationManager *)manager
         didEnterRegion:(CLRegion *)region
{
    [self sendNotification:@"didEnterRegion"];
}

- (void)locationManager:(CLLocationManager *)manager
      didDetermineState:(CLRegionState)state
              forRegion:(CLRegion *)region
{
    switch (state) {
        case CLRegionStateInside:
         [self sendNotification:@"didEnterRegion"];
            break;
        case CLRegionStateOutside:
            break;
        case CLRegionStateUnknown:
            break;
        default:
            break;
    }
} 

Ответ 1

Apple документация для CLLocationManager гласит:

Менеджер местоположений вызывает этот метод всякий раз, когда для региона существует граничный переход. Он вызывает этот метод в дополнение к вызовам методов locationManager:didEnterRegion: и locationManager:didExitRegion:. Менеджер местоположений также вызывает этот метод в ответ на вызов его метода requestStateForRegion:, который выполняется асинхронно.

Так что didDetermineState следует вызывать при каждом didEnterRegion/didExitRegion do. Кроме того, если вы явно запрашиваете состояние через requestStateForRegion, он будет вызываться.

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

Когда установлено значение "ДА", диспетчер местоположений отправляет уведомления маяка, когда пользователь включает дисплей, а устройство уже находится внутри региона. Эти уведомления отправляются, даже если ваше приложение не запущено. В этой ситуации система запускает ваше приложение в фоновом режиме, чтобы оно могло обрабатывать уведомления. В обеих ситуациях менеджер местоположений вызывает метод locationManager:didDetermineState:forRegion: своего объекта-делегата.