volga-volga / react-native-yamap

React Native Yandex Maps | Яндекс Карты | Yandex.MapKit implementation for react native | YandexMaps
152 stars 85 forks source link

Краш IOS #206

Closed DenSakhon closed 1 year ago

DenSakhon commented 1 year ago

photo_2022-11-07_14-16-30

Крашит приложение только на IOS почти постоянно, заметил, что происходит это если во время того как активна анимация на маркере происходит его размонтирование. Методов на остановку анимации я не нашёл в доках, есть ли варианты как это можно решить? "react": "17.0.2", "react-native": "0.66.4", "react-native-yamap": "4.1.6",

const CarMarker = ({ coords, currentAppState, auto }) => {
  const [tracksViewChanges, setTracksViewChanges] = useState(false);
  const [carCoords, setCarCoords] = useState({ ...coords });
  const [baseCoords, setBaseCoords] = useState({ ...coords });

  const prevCoords = useRef({ ...coords });
  const markerRef = useRef(null);
  const timer = useRef(null);

  useEffect(() => {
    setTracksViewChanges(true);
  }, [currentAppState]);

  useEffect(() => () => {
    clearTimeout(timer.current);
    timer.current = null;
  }, []);

  useEffect(() => {
    if (!tracksViewChanges) {
      setTracksViewChanges(true);
      setCarCoords(() => ({ ...coords }));
      timer.current = setTimeout(() => {
        setTracksViewChanges(false);
      }, 2500);
    }
  }, [coords, tracksViewChanges]);

  useEffect(() => {
    if (
      typeof carCoords !== 'undefined'
      && tracksViewChanges
      && carCoords.latitude !== prevCoords.current.latitude
      && carCoords.longitude !== prevCoords.current.longitude
    ) {
        const radians = getCarAngle(prevCoords.current.latitude, prevCoords.current.longitude, carCoords.latitude, carCoords.longitude);
        const degrees = convertRadianToDegrees(radians);
        markerRef.current?.animatedMoveTo({ lat: carCoords.latitude, lon: carCoords.longitude }, 3500);
        markerRef.current?.animatedRotateTo(degrees, 1000);
        prevCoords.current = { ...carCoords };
    }
  }, [carCoords, markerRef, tracksViewChanges]);

  return (
    <>
      <Marker
        anchor={{ x: 0.5, y: 0.5 }}
        point={{
          lat: baseCoords?.latitude,
          lon: baseCoords?.longitude,
        }}
        ref={markerRef}
        source={auto}
        style={{ zIndex: 100 }}
      />
    </>
  );
};

export default memo(CarMarker);
ownikss commented 1 year ago

Довольно старая версия. Проблема воспроизводится на последней версии?

DenSakhon commented 1 year ago

Довольно старая версия. Проблема воспроизводится на последней версии?

С последней были другие ошибки, поэтому тогда зафиксировали эту. Завтра проверю и отпишусь!

DenSakhon commented 1 year ago

Довольно старая версия. Проблема воспроизводится на последней версии?

Проверил на последний версии 4.1.14 краш остался с тем же описанием. Так же добавилась проблема рендера изображения на android через source ( вылечилось одноразовым обновлением prorps style -> zIndex с 99 на 100 при монтировании. Плюс перестала работать анимация маркера методом animatedRotateTo обе платформы (Adnroid\IOS), при этом метод animatedMoveTo отрабатывает как и раньше.

DenSakhon commented 1 year ago

Попробовал локально обернуть все вызовы анимаций на стороне objective-c в try...catch (java часть итак была обёрнута, видимо поэтому проблема только на IOS) кажется это работает, от краша избавился. Если найдётся время, сделаю мр, а так в целом хотя бы инфа для тех, кто правит либу)

p.s. Проблема с методом animatedRotateTo на последней версии актуальна на обе платформы.