2013-12-06 4 views
6

У меня есть приложение, которое имеет только мониторинг региона и ничего больше. Я тестирую, работая в режиме фронта (в отличие от фонового режима). Он работает на iphone 5 с ios 7.0.4. Он поддерживает фоновое обновление приложений и службу определения местоположения и авторизацию местоположения для этого приложения.iOS 7 Мониторинг регионов не надежно Огонь

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

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

Я что-то упустил?

+0

Посмотрите на https://devforums.apple.com/message/251046#251046 и http://stackoverflow.com/questions/8586803/iphone-cllocationmanager-region-monitoring-callbacks-not-triggered -maybe границы клеток имеют к этому какое-то отношение. В потоке на форуме Apple dev упоминается, что минимальный уровень точности составляет около 1 км для мониторинга CLRegion –

+0

@RichTolley Я до сих пор не понял, почему. Но после переопределения геопостановки с помощью 'startMonitoringSignificantLocationChanges' он работает отлично. Ваша статья о разработчике яблока очень проницательна. Комментарий работодателя Apple по этому поводу практически бесполезен. В какой-то момент я просто должен знать его ограничение и стабильность, чтобы выбрать, какой из них использовать, и яблоко не раскрывает это. Большое спасибо за ссылку. –

ответ

8

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

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

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

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

подробнее см Apple docs

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

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

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

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

0

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

Смежные вопросы