Інтеграція Яндекс.Карт SDK в мобільну програму
Яндекс.Карти — вибір за замовчуванням для російськомовних програм з картами: краще покриття на території СНГ, російськомовні топоніми без артефактів трансліттерації, працюючий транзитний маршрутизатор по містам Росії. MapKit SDK для Android та iOS істотно змінився починаючи з версії 4.x — лайтова версія перейменована, API анотацій переопрацьований.
Версії SDK: Full vs Lite
Яндекс надає дві версії:
| Версія | Розмір | Офлайн-карти | Маршрути | Пошук |
|---|---|---|---|---|
| MapKit Full | ~40 МБ | Так | Так | Так |
| MapKit Lite | ~15 МБ | Нakkk | Нггг | Тільки геокодер |
Для більшості програм достатньо Lite — якщо не потрібні офлайн та транзитні маршрути.
Ініціалізація
API key отримується у developer.tech.yandex.ru. На відміну від Google Maps, ключ не прив'язується до Bundle ID / applicationId при створенні — обмеження настоюються окремо у кабінету.
Android:
// build.gradle
implementation("com.yandex.android:maps.mobile:4.6.1-full")
// Application.onCreate()
MapKitFactory.setApiKey("YOUR_API_KEY")
MapKitFactory.initialize(this)
iOS (Swift Package Manager):
// Package.swift dependency:
// .package(url: "https://github.com/yandex/mapkit-ios-demo", from: "4.6.1")
// AppDelegate / App init:
import YandexMapsMobile
MapKit.setApiKey("YOUR_API_KEY")
Ініціалізація повинна відбутися до створення першого MapView. Забутий MapKitFactory.initialize на Android дає IllegalStateException з неясним сообщенням про те, що API key не встановлен, хоча setApiKey викликаний.
Робота з картою на Android
class MapActivity : AppCompatActivity(), MapObjectTapListener {
private lateinit var mapView: MapView
private lateinit var mapObjects: MapObjectCollection
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_map)
mapView = findViewById(R.id.mapView)
MapKitFactory.getInstance().onStart()
mapView.onStart()
val map = mapView.mapWindow.map
map.move(
CameraPosition(Point(55.7558, 37.6173), 12f, 0f, 0f)
)
mapObjects = map.mapObjects.addCollection()
addMarker(Point(55.7558, 37.6173), "Центр")
}
private fun addMarker(point: Point, text: String) {
val placemark = mapObjects.addPlacemark().apply {
geometry = point
setIcon(ImageProvider.fromBitmap(createBitmapIcon()))
addTapListener(this@MapActivity)
}
val textStyle = TextStyle().apply {
this.size = 12f
placement = TextStyle.Placement.BOTTOM
}
placemark.setText(text, textStyle)
}
override fun onMapObjectTap(mapObject: MapObject, point: Point): Boolean {
Toast.makeText(this, (mapObject as? PlacemarkMapObject)?.getText() ?: "", Toast.LENGTH_SHORT).show()
return true
}
override fun onStop() {
mapView.onStop()
MapKitFactory.getInstance().onStop()
super.onStop()
}
}
Lifecycle-методи mapView.onStart() / mapView.onStop() — обов'язкові. Пропуск onStop веде до утечи пам'яти та продовження рендерингу у фоні.
Пошук та геокодування через Search API
val searchManager = SearchFactory.getInstance()
.createSearchManager(SearchManagerType.COMBINED)
val searchSession = searchManager.submit(
"кафе рядом",
VisibleRegionUtils.toPolygon(mapView.mapWindow.map.visibleRegion),
SearchOptions().apply {
searchTypes = SearchType.BIZ.value
resultPageSize = 20
},
object : Session.SearchListener {
override fun onSearchResponse(response: Response) {
for (item in response.collection.children) {
val point = item.obj?.geometry?.firstOrNull()?.point ?: continue
addMarker(point, item.obj?.name ?: "")
}
}
override fun onSearchError(error: Error) {}
}
)
Маршрути: DrivingRouter
val drivingRouter = DirectionsFactory.getInstance().createDrivingRouter(DrivingRouterType.COMBINED)
val points = listOf(
RequestPoint(Point(55.7558, 37.6173), RequestPointType.WAYPOINT, null, null),
RequestPoint(Point(59.9343, 30.3351), RequestPointType.WAYPOINT, null, null)
)
drivingRouter.requestRoutes(
points,
DrivingOptions().apply { routesCount = 1 },
VehicleOptions(),
object : DrivingSession.DrivingRouteListener {
override fun onDrivingRoutes(routes: MutableList<DrivingRoute>) {
if (routes.isNotEmpty()) {
mapView.mapWindow.map.mapObjects.addPolyline(routes[0].geometry)
}
}
override fun onDrivingRoutesError(error: Error) {}
}
)
Часові рамки
1–3 дні. Базова карта з маркерами — 1 день. Пошук + маршрути + кастомні іконки — 2–3 дні. Вартість розраховується індивідуально.







