Если вы делаете приложение на React Native / Expo и вам нужны Яндекс.Карты, вы наверняка столкнулись с проблемой: у Яндекса есть официальный SDK для Android, iOS и Flutter — но не для React Native. Годами пробел закрывало сообщество, но в 2026-м ситуация невесёлая:
Собственный
expo-mapsот Expo поддерживает только Apple Maps и Google Maps — сторонних провайдеров нет.Самая популярная community-обёртка не выпускала релизов с ноября 2024 и больше не собирается на актуальных React Native / Kotlin.
Остальные — либо с закрытым исходником, либо с документацией на одном языке, либо тянут тяжёлые доп-зависимости.
Поэтому я сделал expo-yandex-mapkit — поддерживаемый SDK Яндекс MapKit под лицензией MIT, собранный современно: на Expo Modules API, настраиваемый целиком конфиг-плагином, готовый к New Architecture и с документацией на русском и английском. В версии 2.0.0 он функционально полон и проверен на устройстве.
Быстрый старт
Это нативный модуль, поэтому нужен dev build (в Expo Go не работает):
npx expo install expo-yandex-mapkit
Добавьте конфиг-плагин в app.json — никаких правок AndroidManifest/AppDelegate:
{ "expo": { "plugins": [ ["expo-yandex-mapkit", { "apiKey": "ВАШ_КЛЮЧ_MAPKIT_MOBILE_SDK", "flavor": "lite" }] ] } }
Рендерим карту — с ключом на этапе сборки инициализация не нужна вовсе:
import { YandexMapView } from 'expo-yandex-mapkit'; import { StyleSheet } from 'react-native'; export default function App() { return ( <YandexMapView style={StyleSheet.absoluteFill} cameraPosition={{ latitude: 55.751, longitude: 37.618, zoom: 12 }} /> ); }
npx expo prebuild && npx expo run:android # или run:ios
Что внутри
Всё работает на обеих платформах с одинаковым JS:
Карта и камера — декларативная анимируемая
cameraPosition; императивныеsetCenter/setZoom/fitMarkers/getVisibleRegion/ проекция мир↔экран; события нажатия / долгого нажатия / движения камеры;mapType(map / satellite / hybrid / vector), JSON-mapStyle, ночной режим, переключатели жестов.Объекты карты —
<Marker>с иконкой-картинкой или из React-детей,<Polyline>/<Polygon>/<Circle>, и декларативный<Clusterer>, где ваши же<Marker>служат render-пропом.Геопозиция и пробки — слой местоположения с кастомной точкой и стилизацией круга точности, слой пробок в реальном времени.
А во flavor full (flavor: 'full') — серверные модули:
import { suggest, searchText, findRoutes } from 'expo-yandex-mapkit'; const hints = await suggest('кофе', { userPosition: here }); // саджест по мере ввода const places = await searchText('Москва', { searchTypes: ['geo'] }); // + обратный геокодинг, resolveURI const route = await findRoutes([a, b], 'masstransit'); // авто / транспорт / пешком // route[0].sections → пешком → автобус 42 → пересадка → метро, каждый участок рисуется отдельно
Чем он лучше
Несколько вещей я сознательно сделал лучше, чем у предшественников:
Декларативная кластеризация — без отдельного массива
clusteredMarkersиrenderMarker; render-пропом служит ваш обычный<Marker>.Координаты в саджесте, которые реально приходят — давняя болячка этой линейки: координаты восстанавливали в JS, парся
uri(что молча ломается на org/opaque-URI). Здесьcenterчитается нативно, поэтому не теряется.Надёжные иконки-маркеры из React-детей, настоящий конфиг-плагин (версия, flavor, API-ключ, локаль, minSdk) и документация на RU + EN.
Как попробовать
npm:
expo-yandex-mapkitGitHub: softwhere-uz/expo-yandex-mapkit — ⭐ помогает другим найти проект
Бесплатно для теста: бесплатный ключ MapKit Mobile SDK (кабинет разработчика Яндекса) покрывает карту + поиск + маршруты.
Если вы используете Яндекс.Карты в Expo — буду рад фидбэку и issue.
