CLMonitor правильный способ обновления с CLLocationManager

Я пытаюсь обновить функции геолокации с CLLocationManager на CLMonitor. Главный вопрос в том, как мне перенести MonitoredRegions из CLLocationManager в CLMonitor. Поскольку функции ios17 (начать/остановить мониторинг) из CLLocationManager устарели, как мне следует переместить эти условия, если в то же время мне не следует использовать StopMonitoring для удаления их из CLLocationManager.

В CLMonitor не добавлены условия в CLLocationManager. Когда я добавляю что-то в CLMonitor, затем в CLLocationManager мы также видим это условие в MonitoredRegions, но с автоматически сгенерированным именем (some_generated_chars@identifier).

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
221
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Устаревшее не означает, что оно не работает, просто существует новый/лучший способ что-то сделать. Устаревшие возможности со временем исчезнут, но обычно на это уходят годы.

Вам решать, перейдете ли вы на CLMonitor или продолжите использовать CLLocationManager. Если ваше приложение предназначено для версий более ранних, чем iOS 17, вы, вероятно, можете просто использовать CLLocationManager вместо использования нескольких путей кода.

CLMonitor предлагает более современный интерфейс на основе замыканий по сравнению с шаблоном делегата, принятым в CLLocationManager. Это более «Swifty», и он также работает с Swift async/await — я не уверен, имеет ли это большое влияние, поскольку вы, по-видимому, используете Maui на основе вопросительных тегов.

Однако, если вы действительно хотите изменить свой код для использования CLMonitor в iOS 17, вы должны применить следующий подход.

  • При запуске на устройстве iOS 17, прежде чем настраивать CLMonitor, проверьте наличие логического значения в настройках пользователя — что-то вроде geoFenceUpdated.
  • Если это true, ничего не делайте.
  • Если это false, создайте CLLocationManager, удалите все геозоны и установите geoFenceUpdated на true.
  • Наконец, создайте свой CLMonitor и создайте все необходимые геозоны.

Наверное, я сделаю что-то подобное, но я просто считал, что Apple подготовила что-то еще для более элегантной миграции. Когда мы добавляем некоторые новые условия, запускается каждое событие (для Удовлетворено/Неудовлетворительно), что неправильно при выполнении миграции. Знаете ли вы, есть ли простой способ не запускать начальное событие? кстати. экземпляр CLLocationManager по-прежнему необходим, например. обработка разрешений

devMAUIP 11.04.2024 11:09

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

Paulw11 11.04.2024 11:52

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

devMAUIP 11.04.2024 12:06

«Этот метод выполняет запрос асинхронно и доставляет результаты делегату менеджера местоположений. Чтобы получить результаты, необходимо реализовать метод locationManager(_:didDetermineState:for:) в делегате». К сожалению, мне нужно добавить делегат DidDetermineState для получения этой информации, которую слишком сложно контролировать, и я не могу быть уверен, был ли он вызван мной или нет. В CLMonitor вы можете получить запись по идентификатору, где находится свойство LastEvent, и это то, что мне здесь понадобится.

devMAUIP 11.04.2024 12:18

На самом деле я попробую использовать его и посмотрю, что получится.

devMAUIP 11.04.2024 12:20

Работает ли он нормально после добавления метода DidDetermineState?

user10627299 23.04.2024 09:46

В конце концов я этим не пользуюсь. Я проверяю LocationManager.MonitoredRegions и сравниваю его с LocationMonitor.MonitoredIdentifiers. Если что-то отсутствует, я удаляю из LocationManager и добавляю в CLMonitor. Я собираю эти идентификаторы во время миграции, поэтому в MonitorEventHandler я могу исключить их, чтобы не запускать какие-либо следующие функции. кстати. Если регион был добавлен в CLMonitor, то в LocationManager может быть указан MonitoredRegions, но со странным именем (содержит @ char), поэтому я также игнорирую этот идентификатор.

devMAUIP 07.06.2024 05:02

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