Ответ 1
Apple документация для CLLocationManager гласит:
Менеджер местоположений вызывает этот метод всякий раз, когда для региона существует граничный переход. Он вызывает этот метод в дополнение к вызовам методов
locationManager:didEnterRegion:
иlocationManager:didExitRegion:
. Менеджер местоположений также вызывает этот метод в ответ на вызов его методаrequestStateForRegion:
, который выполняется асинхронно.
Так что didDetermineState
следует вызывать при каждом didEnterRegion
/didExitRegion
do. Кроме того, если вы явно запрашиваете состояние через requestStateForRegion
, он будет вызываться.
Есть еще одно поведение, которое запускает этот метод: если вы контролируете регион, в котором вы включили свойство notifyEntryStateOnDisplay
, метод будет вызываться всякий раз, когда пользователь разбудит их устройство вручную, и они находятся в пределах области вы контролируете. Из документации
Когда установлено значение "ДА", диспетчер местоположений отправляет уведомления маяка, когда пользователь включает дисплей, а устройство уже находится внутри региона. Эти уведомления отправляются, даже если ваше приложение не запущено. В этой ситуации система запускает ваше приложение в фоновом режиме, чтобы оно могло обрабатывать уведомления. В обеих ситуациях менеджер местоположений вызывает метод
locationManager:didDetermineState:forRegion:
своего объекта-делегата.