Ответ 1
Вот что нужно проверить:
-
Прежде чем вы начнете отслеживать регионы своего кода, вызовите
[CLLocationManager regionMonitoringAvailable]
и[CLLocationManager regionMonitoringEnabled]
, чтобы убедиться, что услуга доступна и включена на пользовательском телефоне. -
Удостоверьтесь, что у вашего менеджера местоположений
delegate
установлено значение, на котором вы реализовалиlocationManager:didEnterRegion:
и/илиlocationManager:didExitRegion:
. -
Убедитесь, что у вас нет опечаток в этих сигнатурах метода. Небольшая ошибка заглавной буквы приведет к сбою этих сообщений. Скопируйте/вставьте их в свой код и убедитесь, что они соответствуют:
- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region { /* Handle enter */ } - (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region { /* Handle exit */ }
-
Убедитесь, что ваш делегат также реализует
locationManager:monitoringDidFailForRegion:withError:
, так как он может сказать вам, почему служба терпит неудачу.- (void)locationManager:(CLLocationManager *)manager monitoringDidFailForRegion:(CLRegion *)region withError:(NSError *)error { NSLog(@"Region monitoring failed with error: %@", [error localizedDescription]); }
-
Одна из причин такого сбоя в мониторинге заключается в том, что Core Location налагает ограничение на количество регионов, которым разрешено отслеживать приложение. На практике этот предел, по-видимому, составляет около десяти регионов за приложение. Поэтому убедитесь, что вы удаляете области, которые вам не нужны, используя
stopMonitoringForRegion:
, и контролируйте только те области, которые ближе к пользователю, как рекомендовано Apple Руководство по программированию местоположения:Вы всегда должны быть разумными при указании набора регионов на монитор. Регионы являются общим системным ресурсом, а общее число Регионы, доступные в масштабах всей страны, ограничены. По этой причине Core Расположение ограничивает количество областей, которые могут быть одновременно контролируется одним приложением. Чтобы обойти эти ограничения, вы следует рассмотреть возможность регистрации только тех регионов в окрестности. По мере изменения местоположения пользователей вы можете удалить регионы, которые теперь более далекие пути и добавление регионов, которые появляются на пути пользователей. Если вы пытаетесь зарегистрировать регион, а пространство недоступно, менеджер местоположений вызывает
locationManager:monitoringDidFailForRegion:withError:
метод его делегировать с кодом ошибкиkCLErrorRegionMonitoringFailure
. -
Надеюсь, что это очевидно, но убедитесь, что вы вызываете
startMonitoringForRegion:desiredAccuracy:
после настройки вашего делегата. -
Когда вы инициализируете объект
CLRegion
, который вы контролируете, используяinitCircularRegionWithCenter:radius:identifier:
, убедитесь, что вы используете уникальный идентификатор для каждого региона. -
Если ваши методы
locationManager:didEnterRegion:
иlocationManager:didExitRegion:
получаются правильно, когда приложение активно, но не тогда, когда ОС перезагружает ваше приложение в фоновом режиме после его убийства, возможно, вы не можете правильно инициализировать свою менеджера местоположения и установки его делегата в этом случае. Если вы перейдете границу зарегистрированного региона, когда приложение не запущено, ОС запустит ваше приложение в фоновом режиме, которое вы можете обнаружить с помощьюif ([launchOptions objectForKey:@"UIApplicationLaunchOptionsLocationKey"]]) {}
в методеapplication:didFinishLaunchingWithOptions:
вашего делегата приложения. Ваше приложение, вероятно, не будет загружать какие-либо представления при его запуске в фоновом режиме, так что вам нужно убедиться, чтоapplication:didFinishLaunchingWithOptions:
вызывает некоторый путь к коду, который создает экземпляр вашего объекта менеджера местоположений и задает его делегат в этом случае. Как только будет установлено свойство делегирования вашего менеджера местоположений, будут отправлены любые события мониторинга ожидающего региона.