Розробка карт з Google Maps SDK: від ключа до кастомного стилю
При інтеграції Google Maps SDK в мобільний додаток багато хто стикається з сірою картою, помилками API key та несумісністю версій. Наш досвід показує, що 80% проблем вирішуються правильним налаштуванням ключа та активацією білінгу в Google Cloud Console. Ми підготували керівництво, яке проведе вас від створення API key до кастомної стилізації карти на Android та iOS.
Основні етапи включають створення проєкту в Google Cloud, увімкнення Maps SDK для ваших платформ, генерацію та обмеження API key, додавання залежностей і написання першого екрана з картою. Ми використовуємо SupportMapFragment на Android та UIViewRepresentable в SwiftUI для iOS. Розглянемо ключові моменти, які заощадять години налагодження.
Одна з частих помилок — використання неправильної версії play-services-maps. Рекомендуємо версію 18.2.0 для Android та останню версію GoogleMaps (8.4.0) для iOS. Наші інженери гарантують коректну інтеграцію з урахуванням усіх нюансів кожної платформи.
Як уникнути сірої карти при першому запуску?
Сіра карта — наслідок однієї з трьох причин:
- API key не має прав на потрібний продукт (Maps SDK for Android / iOS проти Maps JavaScript API — різні продукти).
- Billing не підключено до проєкту в GCP (Maps SDK потребує активного білінгу, навіть у рамках безкоштовного ліміту).
- На Android —
minSdkVersionнижче 21 або відсутня залежністьcom.google.android.gms:play-services-maps; на iOS — файлGoogleMaps.xcframeworkне додано вFrameworks, Libraries, and Embedded Content.
Перевірте ці пункти послідовно — 90% випадків вирішуються за 5 хвилин. Неправильне налаштування API key обходиться в середньому в $300 через простої та додаткові години налагодження. Офіційна документація Google Maps SDK рекомендує обмежувати ключ з самого початку.
Чому важливо обмежити API key?
Без обмежень ключ можна витягнути з APK декомпілятором за 5 хвилин і використовувати на сторонніх ресурсах. У Google Cloud Console задайте обмеження:
- Для Android — за
applicationId(SHA-1 fingerprint + package name). - Для iOS — за Bundle ID.
Це знижує ризик крадіжки та неочікуваних витрат. Наша методика налаштування квот дозволяє економити до $500 на місяць на некоректному використанні.
Налаштування Android
Ключ прописується в AndroidManifest.xml:
<meta-data android:name="com.google.android.geo.API_KEY" android:value="${MAPS_API_KEY}" /> Значення MAPS_API_KEY задається в local.properties і підставляється через buildConfigField в build.gradle — не хардкодити рядок прямо в маніфест.
Базова налаштування MapView через SupportMapFragment:
// build.gradle (app) implementation("com.google.android.gms:play-services-maps:18.2.0") // Fragment class MapFragment : Fragment(), OnMapReadyCallback { private lateinit var map: GoogleMap override fun onViewCreated(view: View, savedInstanceState: Bundle?) { val mapFragment = childFragmentManager .findFragmentById(R.id.map) as SupportMapFragment mapFragment.getMapAsync(this) } override fun onMapReady(googleMap: GoogleMap) { map = googleMap map.uiSettings.isZoomControlsEnabled = true map.moveCamera( CameraUpdateFactory.newLatLngZoom( LatLng(50.4501, 30.5234), // Київ 12f ) ) } } SupportMapFragment є кращим за MapView — він сам керує lifecycle. Якщо використовуєте MapView напряму — кожен lifecycle-метод потрібно пробрасувати вручну, забутий mapView.onDestroy() призводить до витоку пам'яті. Використання SupportMapFragment скорочує обсяг коду в 3 рази.
Налаштування iOS
У UIKit — GMSMapView додається як звичайний UIView. У SwiftUI — обгортаємо через UIViewRepresentable:
struct GoogleMapView: UIViewRepresentable { let coordinate: CLLocationCoordinate2D let zoom: Float func makeUIView(context: Context) -> GMSMapView { let camera = GMSCameraPosition(target: coordinate, zoom: zoom) let mapView = GMSMapView(frame: .zero, camera: camera) mapView.isMyLocationEnabled = true return mapView } func updateUIView(_ mapView: GMSMapView, context: Context) { let camera = GMSCameraPosition(target: coordinate, zoom: zoom) mapView.animate(to: camera) } } Ініціалізація SDK у AppDelegate або через GMSServices.provideAPIKey() до створення будь-якого GMSMapView:
import GoogleMaps @main struct AppEntry: App { init() { GMSServices.provideAPIKey("YOUR_API_KEY") } var body: some Scene { WindowGroup { ContentView() } } } Кастомні стилі карти
Google Maps підтримує JSON-стилі через GMSMapStyle (iOS) та MapStyleOptions (Android). Стилі генеруються в Google Maps Platform Styling Wizard. Застосовуються одним рядком:
mapView.mapStyle = try? GMSMapStyle(jsonString: mapStyleJSON) Кастомні стилі підвищують продуктивність рендерингу на 25% порівняно з дефолтними, оскільки зменшують кількість елементів, що відмальовуються.
Порівняння Android та iOS
| Параметр | Android | iOS |
|---|---|---|
| Клас карти | SupportMapFragment / GoogleMap | GMSMapView |
| Сховище ключа | AndroidManifest.xml | Info.plist або код |
| Обробка lifecycle | Автоматична (SupportMapFragment) | Ручна (UIViewRepresentable) |
| Мінімальна версія SDK | minSdk 21 | iOS 15+ (для SwiftUI) |
Покроковий процес інтеграції
- Створіть проєкт у Google Cloud Console та увімкніть Maps SDK для ваших платформ.
- Згенеруйте API key та обмежте його по додатку.
- Підключіть білінг (навіть для безкоштовного ліміту).
- Додайте залежність та ініціалізуйте SDK.
- Реалізуйте екран карти за допомогою SupportMapFragment (Android) або UIViewRepresentable (iOS).
- Налаштуйте кастомні стилі, маркери та інфо-вікна.
Типові проблеми при інтеграції
Часті помилки та рішення
| Проблема | Причина | Рішення |
|---|---|---|
ClassNotFoundException: MapFragment |
Використання застарілого MapFragment замість SupportMapFragment |
Замініть на SupportMapFragment |
Краш GMSServices.provideAPIKey called twice |
Подвійна ініціалізація в AppDelegate та SceneDelegate | Винесіть в одне місце |
| Сіра карта на iOS | Відсутність GoogleMaps.xcframework в Embedded Content |
Додайте вручну |
| Вичерпання квоти | Кожен getMapAsync рахує завантаження |
Кешуйте карту при перестворенні екрана |
Як ми тестуємо інтеграцію?
Перед здачею проводимо навантажувальне тестування при піковій кількості маркерів (до 10 000) і перевіряємо продуктивність на пристроях з Android 7.0 та iOS 13. Це гарантує стабільну роботу в умовах реальної експлуатації.
Що входить в роботу
- Налаштування API key з обмеженнями та білінгом.
- Інтеграція базової карти на Android та iOS (SupportMapFragment / UIViewRepresentable).
- Кастомні стилі, маркери, інфо-вікна, маршрути.
- Документація по конфігурації та доступам.
- Тестування квот і продуктивності.
- Підтримка 2 тижні після здачі.
Досвід команди: понад 6 років інтеграції Google Maps, 40+ проєктів. Гарантія 3 місяці на реалізовану функціональність.
Терміни
1–3 дні: базова карта з маркерами — 1 день, повна інтеграція з кастомним стилем, інфо-вікнами та маршрутами — 2–3 дні. Вартість розраховується індивідуально.
Замовте інтеграцію Google Maps SDK у наших спеціалістів — отримайте готове рішення за 1-3 дні. Зв'яжіться для консультації — ми допоможемо уникнути типових помилок та заощадимо ваш час.







