Я пытаюсь обновить функции геолокации с CLLocationManager на CLMonitor. Главный вопрос в том, как мне перенести MonitoredRegions из CLLocationManager в CLMonitor. Поскольку функции ios17 (начать/остановить мониторинг) из CLLocationManager устарели, как мне следует переместить эти условия, если в то же время мне не следует использовать StopMonitoring для удаления их из CLLocationManager.
В CLMonitor не добавлены условия в CLLocationManager. Когда я добавляю что-то в CLMonitor, затем в CLLocationManager мы также видим это условие в MonitoredRegions, но с автоматически сгенерированным именем (some_generated_chars@identifier).
Устаревшее не означает, что оно не работает, просто существует новый/лучший способ что-то сделать. Устаревшие возможности со временем исчезнут, но обычно на это уходят годы.
Вам решать, перейдете ли вы на CLMonitor
или продолжите использовать CLLocationManager
. Если ваше приложение предназначено для версий более ранних, чем iOS 17, вы, вероятно, можете просто использовать CLLocationManager
вместо использования нескольких путей кода.
CLMonitor
предлагает более современный интерфейс на основе замыканий по сравнению с шаблоном делегата, принятым в CLLocationManager
. Это более «Swifty», и он также работает с Swift async/await — я не уверен, имеет ли это большое влияние, поскольку вы, по-видимому, используете Maui на основе вопросительных тегов.
Однако, если вы действительно хотите изменить свой код для использования CLMonitor
в iOS 17, вы должны применить следующий подход.
CLMonitor
, проверьте наличие логического значения в настройках пользователя — что-то вроде geoFenceUpdated
.true
, ничего не делайте.false
, создайте CLLocationManager
, удалите все геозоны и установите geoFenceUpdated
на true
.CLMonitor
и создайте все необходимые геозоны.Да, вам все еще нужен cllocationmanager для запроса разрешений. Вы можете просто создать cllocationmanager, не устанавливая его делегата для очистки регионов, и тогда вы не будете получать от него события региона, как я уже сказал, если только у вас нет конкретной проблемы, с которой вы столкнулись с подходом делегирования, я бы не стал много говорить усилия по изменению
Я имею в виду, что при добавлении условий в CLMonitor они также автоматически запускаются... На данный момент я игнорирую первые выполнения из этих регионов, но может быть также какое-то ожидающее событие, которое в этом случае будет потеряно... У CLMonitor есть метод AddCondition, где я можно установить начальное значение для состояния, что здорово и может быть полезно, но я не вижу возможности получить предыдущее состояние из этого региона из CLLocationManager (в CLMonitor такая опция существует)
«Этот метод выполняет запрос асинхронно и доставляет результаты делегату менеджера местоположений. Чтобы получить результаты, необходимо реализовать метод locationManager(_:didDetermineState:for:) в делегате». К сожалению, мне нужно добавить делегат DidDetermineState для получения этой информации, которую слишком сложно контролировать, и я не могу быть уверен, был ли он вызван мной или нет. В CLMonitor вы можете получить запись по идентификатору, где находится свойство LastEvent, и это то, что мне здесь понадобится.
На самом деле я попробую использовать его и посмотрю, что получится.
Работает ли он нормально после добавления метода DidDetermineState
?
В конце концов я этим не пользуюсь. Я проверяю LocationManager.MonitoredRegions и сравниваю его с LocationMonitor.MonitoredIdentifiers. Если что-то отсутствует, я удаляю из LocationManager и добавляю в CLMonitor. Я собираю эти идентификаторы во время миграции, поэтому в MonitorEventHandler я могу исключить их, чтобы не запускать какие-либо следующие функции. кстати. Если регион был добавлен в CLMonitor, то в LocationManager может быть указан MonitoredRegions, но со странным именем (содержит @ char), поэтому я также игнорирую этот идентификатор.
Наверное, я сделаю что-то подобное, но я просто считал, что Apple подготовила что-то еще для более элегантной миграции. Когда мы добавляем некоторые новые условия, запускается каждое событие (для Удовлетворено/Неудовлетворительно), что неправильно при выполнении миграции. Знаете ли вы, есть ли простой способ не запускать начальное событие? кстати. экземпляр CLLocationManager по-прежнему необходим, например. обработка разрешений