Мониторинг iOS Geofence CLCircularRegion. locationManager:didExitRegion не работает должным образом

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

Я также создал небольшое тестовое приложение, которое наносит радиус окружности на карту, чтобы я мог визуально видеть, что происходит.

Код, который я использую для мониторинга местоположений, выглядит следующим образом:

self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;

// Set-up a region
CLLocationDegrees latitude = 52.64915;
CLLocationDegrees longitude = -1.1506367;
CLLocationCoordinate2D centerCoordinate = CLLocationCoordinate2DMake(latitude, longitude);

CLCircularRegion *region = [[CLCircularRegion alloc] initWithCenter:centerCoordinate
                                                                 radius:10 // Metres
                                                             identifier:@"testLocation"];

[self.locationManager startMonitoringForRegion:region];

Я не размещал здесь код для региона DidEnter и т. д., поскольку знаю, что он работает, когда я удаляюсь более чем на 100 м от контролируемого региона.

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

Пример региона

Кто-нибудь знает, есть ли вообще ограничение на минимальный радиус области или возможно я что-то не так делаю.

Спасибо, Аарон.


person MonkeyBlue    schedule 26.05.2014    source источник
comment
Я думаю, что 10 метров — это слишком короткое расстояние, чтобы учитывать нормальные колебания точности определения местоположения.   -  person Daniel    schedule 26.05.2014
comment
Спасибо за ответ, я увеличил радиус до 100 м, однако я все еще не могу получить выход и ввести уведомления, если только я не переместил свое местоположение более чем на 100 м.   -  person MonkeyBlue    schedule 26.05.2014
comment
100 м может быть слишком далеко для пригорода, в котором вы живете. Попробуйте 5000 метров, и это сработает, если только у вас нет ошибки в коде, затем уменьшите его и протестируйте по мере спуска.   -  person Abhi Beckert    schedule 28.05.2014
comment
@AaronWardle Не тот ответ, который вы хотели бы услышать, но, похоже, это ошибка в CLLocationManager. Я могу последовательно воспроизвести проблему, используя различные радиусы областей. См. прилагаемый тестовый жгут в моем ответе ниже.   -  person memmons    schedule 29.05.2014


Ответы (9)


Я не думаю, что мониторинг региона будет хорошо работать для такого маленького радиуса.

  • Наилучшая точность с чипом GPS и kCLLocationAccuracyBestForNavigation часто составляет всего 10 метров.
  • Apple говорит (в Местоположение и карты PG), что минимальное расстояние для регионов должно составлять 200 м.
  • Я слышал, что мониторинг региона использует Wi-Fi для определения своего местоположения (что имеет смысл для экономии энергии). Точность WiFi больше похожа на 20 м-100 м. Я не уверен, как на это повлияет наличие другого приложения, использующего фоновое местоположение (например, с помощью GPS). Вероятно, менеджер местоположения поделится информацией, чтобы повысить точность.
  • Мониторинг региона может занять 30 секунд, чтобы активироваться один раз внутри региона, и пару минут, чтобы активироваться после выхода из региона (чтобы предотвратить его срабатывание из-за сбоев местоположения).
  • Когда региональный мониторинг был впервые введен, они сказали, что он будет работать только со 100-миллионными регионами, а все, что меньше, будет увеличено. Это, вероятно, все еще происходит.
  • Существует устаревший метод startMonitoringForRegion:desiredAccuracy:, который позволял вам указать расстояние за границей региона, чтобы начать генерировать уведомления. Предположительно, эта функция была добавлена ​​в startMonitoringForRegion:, но все еще там. 10-метровый регион может закончиться 10-метровым буфером.
  • Если вы хотите сделать это, укажите больший регион вокруг того места, где вы хотите отслеживать, и когда устройство просыпается в этом регионе, запустите фоновые обновления местоположения (GPS) и используйте CLCircularRegion -containsCoordinate: для запуска вручную, когда устройство находится в пределах 10 м. Этот метод официально санкционирован Apple (см. WWDC 2013, сеанс 307).

Из документов CLCircularRegion:

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

Из Location & Maps PG:

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

Дополнительная информация из этого поста Кевина МакМахона , который спросил инженеров Core Location о мониторинге регионов в лаборатории на WWDC 2012. Тем временем эта информация изменится, но часть о категориях регионов интересна. Вот редактирование:

Точный регион (0 – 150 м)
 – при площади этажа 100 м фактический диапазон этой категории составляет 100 – 150 м.
 – производительность для регионов такого размера сильно зависит от аппаратного обеспечения, связанного с местоположением.
 – Время, необходимое Core Location для обнаружения и вызова соответствующего метода делегата, составляет в среднем примерно 2–3 минуты после пересечения границы региона.
 – Некоторые разработчики самостоятельно выяснили, что небольшие регионы увидит более быстрые обратные вызовы и будет группировать меньшие регионы, чтобы покрыть одну большую область, чтобы улучшить уведомления о пересечении регионов.

person nevan king    schedule 29.05.2014
comment
Этот пост должен быть защищен. - person ; 23.07.2016
comment
Это было потрясающе! 1. технически, если я отключу свой Wi-Fi, он вернется к использованию данных GPS и станет более точным? или это будет откат к сотовым вышкам? 2. Каков радиус действия вышек сотовой связи? 2 км? 5 км? 50 км? 3. Я предполагаю, что обычно в городе у вас будет 3-4 башни, чтобы вы могли триангулировать лучшую, верно? Что произойдет, если вы находитесь в глуши... у вас есть сотовые данные, но есть, например. всего 1 башня на весь район? Сможет ли он по-прежнему триангулировать ваши данные или он снова упадет до использования GPS и станет более точным? - person Honey; 28.07.2017
comment
@ Дорогая, я выбрал радиус 50 метров, и должно прийти уведомление «при выходе». Но я получаю уведомление на расстоянии около 250 метров и даже больше. Пожалуйста, помогите мне - person Amanpreet; 16.05.2018
comment
@nevan king, это нормальное поведение геозоны, которая вышла из региона? Поскольку я тестировал учебный проект Raywendelich, он также работает так же, как и мое приложение (т.е. я выбрал радиус 50 метров, и должно прийти уведомление «при выходе». Но я получаю уведомление на / около 250 метров и еще некоторое время). чем это.). В приложении Рэя я установил радиус 10, но получил уведомление около 250 метров. - person Amanpreet; 16.05.2018
comment
@Amanpreet да, это ожидаемо. Вы видели мой ответ здесь? Apple docs говорит, что это может быть до 200 метров. (И чем дольше вы ждете за пределами 200 метров, тем больше вероятность, что вы получите уведомление. Это не обязательно 250 метров... это может быть 200 метров + 30 секунд, и, поскольку вы достигаете 250 метров через 30 секунд, вы делаете другой вывод) Радиус 10 тоже нонсенс. Я считаю, что все, что меньше 100 метров, просто округляется до 100. Геозона не очень точна, потому что она должна экономить заряд батареи. По-прежнему эффективен для правильного сценария - person Honey; 16.05.2018
comment
@ Дорогая, спасибо за быстрый ответ. Я также замечаю, что это не лучший подход, есть ли что-то еще, что мы можем использовать для достижения точной функциональности? Да, я проверил ваш ответ, я много искал, но попадались похожие вещи. Необходимо сообщить клиенту об этом, но он ожидает точного результата, это невозможно с Geofence. - person Amanpreet; 16.05.2018
comment
@Amanpreet общение с клиентом является ключевым. Скажите им, что альтернативой является использование большего количества батареи, то есть использование обычного отслеживания местоположения, а затем вы можете просто рассчитать расстояние самостоятельно для всех своих регионов ... но пусть они будут теми, кто принимает это решение. При этом многие компании используют геозону для поиска магазинов и т. д. - person Honey; 16.05.2018
comment
@Amanpreet Я забыл упомянуть об этом прямо. После всех ваших обсуждений и объяснения ограничений каждого из них позвольте вашему клиенту принять решение о выборе. - person Honey; 16.05.2018

Кажется, это ошибка в CLLocationManager. Я провел обширное тестирование с использованием различных конфигураций радиуса области, и locationManager:didExitRegion не срабатывает ожидаемым образом. Похоже, это либо довольно неприятная ошибка, либо мониторинг региона вообще не происходит, как предполагает документация. У меня есть тестовая система, доступная для всех желающих:

http://www.mediafire.com/download/x863zkttltyalk6/LocationTest.zip

Запустите его в симуляторе и запустите тест, выбрав Debug -> Location -> Freeway Drive в меню симулятора iOS. Число, которое вы видите, — это расстояние от центра контролируемой области. Цвет фона будет зеленым, когда устройство находится в контролируемой области, и красным, если она находится за ее пределами. Текст под расстоянием — это журналы событий.

введите здесь описание изображения

После запуска приложения вы должны увидеть locationManager:didExitRegion огонь на расстоянии 5319 метров от контролируемого региона. Маршрут будет повторяться каждые 37 минут, и вы увидите, что устройство всегда выходит из региона на высоте 5319 метров.

Я отправил радар с Apple (17064346). Я обновлю этот ответ, как только получу от них ответ. По крайней мере, тогда у нас будет некоторая информация из канонического источника.

Вот подробный текст, отправленный в Apple:

Используя тестовое приложение на симуляторе iOS, а также на iPhone 5S, CLLocationManager, похоже, не запускает обратные вызовы didExitRegion ожидаемым образом. Независимо от радиуса отслеживаемой круглой области обратный вызов не произойдет, пока не будет достигнуто пороговое значение около 5000 метров.

Шаги для воспроизведения:
1. Запустите прикрепленное приложение
2. Запустите отслеживание региона, выбрав Отладка -> Расположение -> Автострада в симуляторе iOS
3. Отслеживайте приложение. Большой # указывает на расстояние от центра просматриваемой области.
4. Примерно через 190 секунд и 5300 метров didExitRegion, наконец, сработает.

Эта проблема, похоже, вообще не связана с размером региона. Согласно документы Apple, поддерживаются даже небольшие регионы:

В iOS 6 области с радиусом от 1 до 400 метров лучше работают на устройствах iPhone 4S и более поздних версий. (В iOS 5 области с радиусом от 1 до 150 метров лучше работают на устройствах iPhone 4S и более поздних версиях.) На этих устройствах приложение может рассчитывать на получение уведомления о входе в соответствующую область или выходе из области в среднем в течение 3–5 минут. если не раньше.

Хотя события региона не происходят мгновенно, они должны происходить довольно быстро. Из документы Apple:

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

Это совсем не то, что я вижу в тестовой обвязке. В симуляторе устройство всегда будет находиться на расстоянии более 5000 метров от региона, прежде чем произойдет событие locationManager:didExitRegion.

person memmons    schedule 29.05.2014
comment
Я наблюдаю такое же поведение. Надеюсь, у Apple есть обходной путь. Я не могу получить доступ к отчету об ошибке по указанной вами ссылке. Это доступно всем или только вам? - person Sean Rucker; 25.06.2014
comment
@Ruckstar К сожалению, отчеты об ошибках Apple являются частными. Если вы видите то же самое, вы должны отправить свой собственный отчет и сослаться на мой радар. Надеемся, что Apple предоставит некоторые отзывы об отчете в ближайшем будущем. Я обновлю ответ, когда они это сделают. - person memmons; 26.06.2014
comment
Есть идеи, влияет ли iOS 7.1.2 на такое поведение? - person Sean Rucker; 15.07.2014
comment
@MichaelG.Emmons, эта тестовая система потрясающая. Я переместил региональный центр на 7,7 км по шоссе и попробовал его с кучей разных радиусов. Вот что у меня получилось: docs.google.com/ таблицы/d/. Кажется, что ваша скорость может резко изменить характеристики обработки региона. Я попытался проверить это с помощью более медленной симуляции езды на велосипеде, но в этом случае я не смог покинуть регион... - person Asa; 10.09.2014
comment
В любом случае, существует множество факторов, которые могут повлиять на доставку в регионы, и лучше проверить это в полевых условиях с реальными устройствами. - person Asa; 10.09.2014

Мне нравятся ответы Майкла и Невана. Я хотел бы добавить больше информации из моего личного опыта/мнения о разработке приложения iOS на основе местоположения с мониторингом регионов, а также выделить некоторые важные моменты:

Будьте реалистичны в мониторинге регионов

Мониторинг региона использует глобальную систему позиционирования (GPS), Wi-Fi и другие технологии, чтобы определить, находится ли устройство внутри или за пределами контролируемого региона. Не забывайте, что наша земля составляет 510 квадратных километров и около 30% составляет суша (149 миллионов квадратных километров). Это огромная территория. Помните недавнее дело о пропаже MH370? Наши современные самые передовые технологии не могли даже точно определить предполагаемую область этого пропавшего самолета.

Если вы хотите отслеживать небольшой регион с радиусом 10 метров. Возможно, он мог бы работать в густонаселенном городе с множеством вышек сотовой связи и зонами, подключенными к Wi-Fi. Но в то же время сигнал может быть заблокирован высотными башнями, что может привести к потере сигнала на несколько секунд/минут, что приведет к задержке доставки уведомления.

Таким образом, вам действительно нужно рассмотреть приведенную выше информацию, прежде чем решить, насколько велика область, которую вы хотите отслеживать. Лично я считаю, что радиус 10 метров слишком мал.

Будьте реалистичны в отношении количества отслеживаемых регионов

Текущая технология Core Location может отслеживать только максимум 20 регионов в одном приложении. Убедитесь, что контролируемые области также не слишком близко друг к другу.

Я лично протестировал 3 области радиусом около 100 метров, которые находятся примерно в 200 метрах друг от друга. Иногда я могу получать уведомления из всех этих трех регионов, когда проезжаю через них, но иногда я могу получать уведомления только из первого региона. Что может быть причиной? Я не мог знать. Регионы могут быть слишком близко друг к другу. Или вышки сотовой связи решают, что мое устройство на самом деле не входит в контролируемый регион.

На StackOverFlow был один человек, который хочет мониторить 1800 точек на нашей Земле. Не уподобляйтесь ему, поскольку он совершенно нереалистичен и, вероятно, не понимает ограничений текущей Core Location технологии. Ссылка: Проверьте, местоположение пользователя находится рядом с некоторыми точками

Точная настройка LocationManager

Если вашему приложению необходимо контролировать небольшую область или часто обновлять местоположение. Вот потенциальные свойства вашего диспетчера местоположения.

self.locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
self.locationManager.distanceFilter = kCLDistanceFilterNone;
self.locationManager.activityType = CLActivityTypeAutomotiveNavigation;

kCLLocationAccuracyBestForNavigation потребляет больше энергии по сравнению с kCLLocationAccuracyBest. Зато будет точнее.

Я обнаружил сбой в отслеживании регионов в iOS 7, когда одновременно срабатывает несколько уведомлений в разных отслеживаемых регионах. Я нашел решение, чтобы отфильтровать этот глюк. Для получения дополнительной информации посетите: Регион Мониторинг сбоев в iOS 7 — несколько уведомлений одновременно

Не будьте слишком амбициозны

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

Я провел небольшое исследование и обнаружил, что некоторые технологии, которые они используют, недоступны для широкой публики. Некоторые из этих компаний хорошо финансируются и могут платить надбавку телекоммуникационным компаниям, чтобы получить максимальную точность определения местоположения для лучшего пользовательского опыта. Я не понимаю деталей того, как это работает. Я считаю, что большая часть определения местоположения на самом деле находится на стороне сервера (внутренняя часть), а не на мобильном устройстве (внешняя часть).

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

ПРИМЕЧАНИЕ. Я просто хочу поделиться своими 2 центами. Вышеизложенная информация состоит из моего опыта и личного мнения. Это может быть не на 100% точно, так как я все еще изучаю Основное местоположение и Мониторинг региона.

person Ricky    schedule 03.06.2014

Я согласен с Майклом Г. Эммонсом и хочу поделиться своим опытом:

Я протестировал свой код с тремя областями, как показано на рисунке ниже:

введите здесь описание изображения

Объяснение поведения:

  • Мое текущее местоположение — регион-1, и я начинаю отслеживать три вышеупомянутых региона и вызывать requestStateForRegion, чтобы определить, есть ли какой-либо регион внутри, где я сейчас нахожусь.
  • Затем я получаю уведомления «Ввод» для первых двух регионов (регион-1 и регион 2), но он должен обнаруживать только регион-1.
  • Теперь, когда я вхожу в регион-2, я получаю уведомление о входе в регион-3. но я должен получить уведомление для региона-2 здесь.
  • Теперь, когда я снова вхожу в регион-1, я получаю событие Exit для региона-3, и это продолжается.
  • но я не получаю никаких событий входа/выхода для первых двух регионов, пока я не перееду не менее чем на 7-10 км от первых двух регионов.

Ожидаемое поведение: - Событие входа/выхода должно срабатывать только тогда, когда я пересекаю границу регионов или внутри регионов, не ранее 500 метров от региона.

Мое предположение:

  • После всего эксперимента я заметил, что когда я вызываю «requestStateForRegion» для всех трех регионов,
  • он обнаруживает все области внутри области радиусом 5000 м, поэтому он обнаруживает первые две области одновременно (область-1 создает круг радиусом 5000 м, а область-2 входит в ее диапазон, поэтому область -2 также обнаруживается ).
  • и когда пользователь перемещается более чем на 10 км, его события Exit будут вызваны, а когда пользователь вернется в эти регионы, будет запущено его событие Enter. Это тот же случай, который описал Аарон Уордл выше.
  • Обнаружен регион-3, потому что, когда пользователь входит в регион-1, т.е. 8-9 км от региона-3, поэтому для этого срабатывает событие Exit, и когда пользователь находится на маршруте для региона-2, здесь даже когда регион-3 находится на расстоянии 5000 метров, он все равно обнаруживает регион-3 и стреляет , Введите событие для региона-3.

Поэтому я думаю, что все регионы в пределах 5000 метров обнаруживаются, и когда пользователь удаляется на 10 км от обнаруженного региона, его событие Exit будет запущено. в противном случае, если пользователь находится в пределах 5 км, он никогда больше не будет вызывать события входа/выхода.

Пожалуйста, сообщите мне, если кто-то исправил эту проблему, или Apple документирует где-нибудь об этой проблеме.

person nidIOS    schedule 16.09.2014

Основываясь на ответе @Nevan, который указывал на какое-то освещение в WWDC 2013 307 (которое не касалось этого напрямую), я нашел разумное решение для получения точности ‹ 10 м для прибытия в место, хотя у меня есть ощущение что реализация -(void)locationManager:didVisit: может сделать это более экономичным, но будет обеспечивать менее частые обновления.

Во-первых, создайте несколько областей с радиусом 0..150 м и начните мониторинг. На самом деле не имеет значения, так как система, похоже, срабатывает на расстоянии около 150–200 м:

_locationManager = [[CLLocationManager alloc] init];
_locationManager.delegate = self;

CLCircularRegion *region = [[CLCircularRegion alloc] initWithCenter:CLLocationCoordinate2DMake(location.lat, location.lng) radius:50 identifier:location.name];
[_locationManager startMonitoringForRegion:region];

Затем реализуйте

-(void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region {
    for (CLCircularRegion *enteredRegion in _locationManager.monitoredRegions.allObjects) {
        if ([enteredRegion.identifier isEqualToString:region.identifier]) {

            self.locationManager.activityType = CLActivityTypeFitness;
            self.locationManager.distanceFilter = 5;
            [self.locationManager startUpdatingLocation];

            break;
        }
    }
}

Система начнет отслеживать и сообщать вашему делегату о потоке местоположений, даже если ваше приложение приостановлено (нужно UIBackgroundModes, чтобы включить location элемент массива).

Чтобы проверить, находится ли одно из этих мест в центре одного из ваших регионов, выполните:

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations {
    CLLocation *firstLocation = [locations firstObject];
    CGFloat const DESIRED_RADIUS = 10.0;

    CLCircularRegion *circularRegion = [[CLCircularRegion alloc] initWithCenter:firstLocation.coordinate radius:DESIRED_RADIUS identifier:@"radiusCheck"];

    for (CLCircularRegion *enteredRegion in _locationManager.monitoredRegions.allObjects) {
        if ([circularRegion containsCoordinate:enteredRegion.center]) {
            [_locationManager stopUpdatingLocation];
            NSLog(@"You are within %@ of %@, @(DESIRED_RADIUS), enteredRegion.identifier);            
            break;
        } else if ([enteredRegion containsCoordinate:circularRegion.center]) {
            NSLog(@"You are within the region, but not yet %@m from %@", @(DESIRED_RADIUS), enteredRegion.identifier);
        }
    }
}

Вы также захотите реализовать:

-(void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region {
    [_locationManager stopUpdatingLocation];
}
person James Perih    schedule 09.06.2016
comment
К сожалению, вызов startUpdatingLocation в фоновом режиме не очень хорошая идея, когда приложение пробуждается системой, у него есть только 10 секунд для выполнения любых действий, поэтому вызов startUpdatingLocation будет работать только около 10 секунд, и все. В основном система обнаруживает это и останавливает обновления местоположения. Мне даже пришлось создать/потратить билет уровня кода с чем-то похожим, и ответ Apple был довольно ясен: вы не должны вызывать startUpdatingLocation, находясь в фоновом режиме, вы можете вызывать значительные изменения местоположения. - person Andy; 12.07.2016
comment
Не то, чтобы приложение было одобрено Apple, startUpdatingLocation в фоновом режиме работает нормально, а запись UIBackgroundModes Info.plist также содержит locations. Это дает мне около 10 минут, чтобы добраться до пункта назначения; после этого мой expirationHandler приостанавливает locationUpdates. - person James Perih; 18.07.2016

Это больше похоже на важный комментарий. Из Мониторинг регионов и iBeacon

Тестирование поддержки мониторинга региона в приложении для iOS

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

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

person Honey    schedule 03.11.2017

Похоже, что даже 1 метр должен работать (и лучше работать на устройствах iPhone 4S+):

начать мониторинг для региона:

(...)

В iOS 6 области с радиусом от 1 до 400 метров лучше работают на устройствах iPhone 4S и более поздних версий. (В iOS 5 области с радиусом от 1 до 150 метров лучше работают на устройствах iPhone 4S и более поздних версиях.) На этих устройствах приложение может рассчитывать на получение уведомления о входе в соответствующую область или выходе из области в среднем в течение 3–5 минут. если не раньше.

person Rivera    schedule 29.05.2014

В последние несколько дней я тестировал функцию геозоны на своем устройстве iOS 8.1 (iPhone 5S) для разработанного мной приложения.
Приложение регистрирует несколько регионов в службе gefence iOS. Логика приложения требует, чтобы радиус каждой геозоны составлял от 40 до 80 метров.
Пока я вижу, что в районах с большим количеством вышек сотовой связи и точек доступа Wi-Fi обнаружение геозон достаточно хорошо при входе в регионы. То есть в городских районах, деловых районах и т. д. обнаружение геозоны работает нормально.

К сожалению, в районах с небольшим количеством вышек сотовой связи и сетей Wi-Fi происходит обратное. Мой район, например, имеет ширину около 1000 метров и высоту 500 метров (1 км x 0,5 км), и в нем нет вышек сотовой связи. По периметру, окружающему район, есть несколько вышек сотовой связи. К сожалению, в периметре окрестности служба геозон ничего не обнаруживает.

Излишне говорить, что я тестирую с включенным Wi-Fi на устройстве.

Когда я тестирую свое приложение на Android: служба геозон на Android 4.3, 4.4 и 5.1 работает намного лучше, чем на iOS. Служба геозоны Android не обнаруживает 100 % переходов между регионами, однако обнаруживает от 50 % до 90 % переходов между регионами.

Я заключаю следующее: если бы было больше вышек сотовой связи и точек доступа Wi-Fi, и если бы Apple улучшила службу геозоны, то обнаружение на устройствах iOS было бы таким же хорошим, как и на устройствах Android.

person Community    schedule 12.02.2015

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

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

В торговом центре или на спортивном стадионе он может работать на расстоянии до 10 метров — вышки сотовой связи часто расположены очень близко друг к другу. В региональной зоне все, что меньше 100 км, может выйти из строя.

Если вам нужны меньшие площади, вам нужно использовать Bluetooth вместо вышек сотовой связи (iBeacons). Если в целевой области есть Bluetooth-устройство с низким энергопотреблением, вы можете установить диапазон очень короткий (сантиметры) или достаточно большой (до 30 метров или около того). Обратите внимание, что все зависит от качества оборудования iBeacon, некоторые из них лучше, чем другие.

К сожалению, bluetooth (версия 4.0 или новее) и вышки сотовой связи — единственный способ контролировать местоположение без значительного разряда батареи. Активация GPS для проверки 10-метровой границы приведет к полной разрядке аккумулятора примерно за 2 часа даже при выключенном экране.

person Abhi Beckert    schedule 28.05.2014
comment
Мониторинг региона не использует только вышки сотовой связи или Bluetooth. Как и остальная часть диспетчера местоположения, он использует несколько различных методов для определения местоположения с разной степенью точности: вышки сотовой связи, Wi-Fi, GPS и Bluetooth для мониторинга маяков. - person quellish; 28.05.2014
comment
@quellish, только если Wi-Fi или GPS включены каким-либо другим приложением в системе. Они никогда не будут активированы геозоной. И bluetooth никогда не используется для геозоны, он используется только для маяков. - person Abhi Beckert; 31.05.2014