yandex / mapkit-ios-demo

MapKit iOS demo
Other
84 stars 26 forks source link

Pin YMKUserLocationView прыгает по карте #231

Closed SuleymanovKamil closed 4 months ago

SuleymanovKamil commented 5 months ago

Мне наконец удалось начать крутить пин пользователя, но я столкнулся с новой проблемой: пин начинает самостоятельно пересоздаваться на новой локации. Особенно часто это происходит если находиться внутри помещения. При этом direction пина сбрасывается и указатель начинает смотреть наверх. Метод onLocationUpdated не вызывается.

SuleymanovKamil commented 5 months ago

Я так понял YMKUserLocationLayer имеет доступ к обновлению геолокации пользователя по умолчанию. Как запретить ему это делать? setDefaultSource и setSourceWith не помогают

YandexMapKit commented 4 months ago

Скачки пина не воспроизвелись. В UserLocationLayer есть фильтрация неподходящих данных.

onLocationUpdated мог не вызываться, если при подписке на LocationManager поставить флаг allowUseInBackground: true и при этом не выдать нужных прав. В таком случае в логе будет сообщение "Missing 'location' flag in 'UIBackgroundModes' capabilities of your application needed for location background usage".

Если хочется написать свой фильтр или управлять локацией в ручном режиме, то можно воспользоваться DummyLocationManager. Он создается методом YMKMapKit.createDummyLocationManager и устанавливается в MapKit методом YMKMapKit.setLocationManager.

Если вопрос не решён, пожалуйста, пришлите нам минимальный пример вашей ситуации и действия для воспроизведения. Вы можете выложить его проектом на GitHub, прикрепить к переписке в архиве или загрузить на Яндекс Диск и указать ссылку.

SuleymanovKamil commented 4 months ago

В UserLocationLayer есть фильтрация неподходящих данных.

Как это свойство или метод называется? Я не нашел: https://yandex.ru/dev/mapkit/doc/ru/Swift/YMKUserLocationLayer

onLocationUpdated мог не вызываться

onLocationUpdated вызывается у locationManager, который я создаю через createLocationManager(). В subscribeForLocationUpdates я задаю значение на обновление в 5 секунд. Но у userLocationLayer свой YMKLocationManager, которым я не могу управлять и он обновляется сам по себе.

SuleymanovKamil commented 4 months ago

https://github.com/yandex/mapkit-ios-demo/assets/38867359/cd46a526-180b-412b-a5d9-a06b4c534555

Телефон лежит на столе.

   ```
 let mapKit: YMKMapKit = YMKMapKit.sharedInstance()
    userLocationLayer = mapKit.createUserLocationLayer(with: mapViewController.mapView.mapWindow)
    userLocationLayer?.setVisibleWithOn(true)
    userLocationLayer?.isHeadingEnabled = true
    userLocationLayer?.setObjectListenerWith(self)
    locationManager = mapKit.createLocationManager()
    locationManager?.subscribeForLocationUpdates(
        withDesiredAccuracy: 1,
        minTime: (Int64(UserDefaults.routeUpdateTimeOut) ?? 0) * 1000, // convert milliseconds to seconds
        minDistance: 1,
        allowUseInBackground: false,
        filteringMode: .on,
        locationListener: self
    )