Мониторинг региона iOS 7 не срабатывает надежно

Я настроил приложение, которое имеет только мониторинг региона и ничего больше. Я тестирую, работая в фронтальном режиме (в отличие от фонового режима). Он работает на iPhone 5 с IOS 7.0.4. В нем есть фоновое обновление приложения, служба определения местоположения и авторизация местоположения для этого приложения.

Я заметил кое-что действительно странное. Когда я использую симулятор для пересечения границ, иногда didEnterRegion/didExitRegion получил вызов. Но иногда его никогда не вызывают, независимо от того, сколько раз я переключаюсь в границу в симуляции. Бывают случаи, когда он вызывается значительно позже (несколько минут) после того, как я сменил симуляцию.

Я осмотрел monitoredRegions чтобы убедиться, что регион, который я хочу контролировать, действителен, и это так. Контролируемая область имеет радиус около 100 метров. Я использую 2 точки симуляции, 1 внутри, 1 в другом городе. я использовал startMonitoringForRegion для мониторинга региона.

Я что-то здесь упускаю?

2 ответа

Определение доступности мониторинга региона

Прежде чем пытаться отслеживать какие-либо регионы, ваше приложение должно проверить, поддерживается ли мониторинг регионов на текущем устройстве. Вот несколько причин, по которым региональный мониторинг может быть недоступен:

Устройство не имеет необходимого оборудования для поддержки мониторинга региона. Пользователь отказал приложению в разрешении на использование мониторинга региона. Пользователь отключил службы определения местоположения в приложении "Настройки". Пользователь отключил фоновое обновление приложения в приложении "Настройки" для устройства или для вашего приложения. Устройство находится в режиме полета и не может включить необходимое оборудование. В iOS 7.0 и более поздних версиях всегда вызывайте методы класса isMonitoringAvailableForClass: и authorizationStatus класса CLLocationManager, прежде чем пытаться отслеживать регионы. (В OS X v10.8 и более поздних версиях и в предыдущих версиях iOS вместо этого используйте класс regionMonitoringAvailable.) Метод isMonitoringAvailableForClass: указывает, поддерживает ли базовое оборудование мониторинг области для указанного класса вообще. Если этот метод возвращает NO, ваше приложение не может использовать мониторинг региона на устройстве. Если он возвращает YES, вызовите метод authorizationStatus, чтобы определить, авторизовано ли приложение в настоящее время для использования служб определения местоположения. Если статус авторизации kCLAuthorizationStatusAuthorized, ваше приложение может получать уведомления о пересечении границы для любых регионов, которые оно зарегистрировало. Если для статуса авторизации установлено любое другое значение, приложение не будет получать эти уведомления.

Примечание. Даже если приложение не авторизовано для использования мониторинга региона, оно все равно может зарегистрировать регионы для последующего использования. Если пользователь впоследствии предоставит авторизацию приложению, начнется мониторинг этих регионов и будет генерироваться последующее уведомление о пересечении границы. Если вы не хотите, чтобы регионы оставались установленными, пока ваше приложение не авторизовано, вы можете использовать locationManager: didChangeAuthorizationStatus: метод делегата, чтобы обнаруживать изменения в состоянии вашего приложения и при необходимости удалять регионы. Наконец, если вашему приложению требуется обрабатывать обновления местоположения в фоновом режиме, обязательно проверьте свойство backgroundRefreshStatus класса UIApplication. Вы можете использовать значение этого свойства, чтобы определить, возможно ли это сделать, и предупредить пользователя, если это не так. Обратите внимание, что система не будит ваше приложение для уведомлений о регионе, когда параметр фонового обновления приложения отключен глобально или специально для вашего приложения.

для получения дополнительной информации см. Apple Docs

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

Конкретные пороговые расстояния определяются аппаратным обеспечением и технологиями определения местоположения, которые в настоящее время доступны. Например, если Wi-Fi отключен, мониторинг региона будет значительно менее точным. Однако для целей тестирования можно предположить, что минимальное расстояние составляет примерно 200 метров.

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

Будьте внимательны при указании набора регионов для мониторинга. Регионы являются общим системным ресурсом, и общее количество регионов, доступных для всей системы, ограничено. По этой причине базовое местоположение ограничивает до 20 регионов, которые могут одновременно контролироваться одним приложением. Чтобы обойти это ограничение, рассмотрите возможность регистрации только тех регионов, которые находятся в непосредственной близости от пользователя. При изменении местоположения пользователя вы можете удалить области, которые теперь находятся дальше, и добавить области, идущие по пути пользователя. Если вы пытаетесь зарегистрировать регион и пространство недоступно, диспетчер местоположений вызывает locationManager: MonitoringDidFailForRegion:withError: метод его делегата с кодом ошибки kCLErrorRegionMonitoringFailure.

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

Другие вопросы по тегам