Integrating Mapbox Maps SDK v11 into iOS and Android Apps
Your mobile app uses Mapbox, but after updating the SDK to v11 the map stopped working: MapboxMapOptions is deprecated, markers don't display, and offline download fails with TileRegionLoadError. Our mobile development team, with five years of experience integrating mapping SDKs, has completed over 150 map projects—from delivery to logistics. We offer a turnkey solution: update the code, configure offline, and guarantee 60 FPS performance even with 10,000+ points. Mapbox SDK integration is our specialty. Contact us for a free audit of your current implementation.
How to Integrate Mapbox SDK into a Mobile App
Integration starts with setting up an access token. Then create a MapView and attach a style via MapInitOptions. A basic map with a custom style from Mapbox Studio is ready in an hour. If migrating from v10, see the migration section. The SDK delivers high performance: on Android it uses Vulkan compute shaders, on iOS it uses Metal shader compilation, ensuring 60 FPS even on mid-range devices. When integrating the Mapbox SDK with thousands of points, it's critical to choose the right rendering approach. According to Mapbox benchmarks, GeoJSON layers are 2x faster than PointAnnotation for 10K points due to GPU-optimized vector tile rendering.
| Rendering Type | Performance (10K points) | Memory | Customization Flexibility |
|---|---|---|---|
| PointAnnotation | ~30 FPS | High | High |
| GeoJSON layer | ~60 FPS | Medium | Medium |
How to Migrate from v10 to v11
Mapbox v11 is a new SDK with a different API. Key changes: MapboxMap instead of MapboxMapOptions, ViewAnnotation instead of MarkerView, PointAnnotationManager instead of SymbolManager. We've prepared a migration checklist. For example, all addMarker() calls must be replaced with PointAnnotationManager. Without this, markers won't appear. During migration we also update camera event handling and migrate offline logic to TileStore.
Migration Changes v10 → v11
| v10 Component | v11 Component |
|---|---|
MapboxMapOptions |
MapView with MapInitOptions |
MarkerView |
ViewAnnotation |
SymbolManager |
PointAnnotationManager |
addMarker() |
PointAnnotationManager.annotations |
Style.Builder |
StyleURI + style.loadStyle() |
Performance with Thousands of Points
For 10,000+ points, PointAnnotationManager suffers from FPS drops. The solution is a GeoJSON layer: add a data source and render via SymbolLayer or CircleLayer. This works significantly faster—GeoJSON is 2x better than PointAnnotation for large datasets. For even larger numbers, enable clustering via ClusterLayer—this reduces rendering load by 80%, allowing 60 FPS with 50,000 points.
mapView.mapboxMap.loadStyle(Style.MAPBOX_STREETS) { style -> style.addSource( GeoJsonSource.Builder("locations-source") .data(""" { "type": "FeatureCollection", "features": [ { "type": "Feature", "geometry": { "type": "Point", "coordinates": [37.6173, 55.7558] }, "properties": { "name": "Point A" } } ] } """.trimIndent()) .build() ) style.addLayer( SymbolLayer("locations-layer", "locations-source").apply { iconImage("custom-icon") iconSize(1.0) textField(get("name")) textOffset(listOf(0.0, 1.5)) } ) } Offline Map Solution
We configure region download with zoom level control and progress tracking. The code below downloads central Moscow with zoom levels 10–16. TileStore ensures reliable caching and fast tile access via a rasterization pipeline. On error, it automatically retries. Offline tiles typically occupy 50–300 MB per region.
val offlineManager = OfflineManager() val tileStore = TileStore.create() val tilesetDescriptor = offlineManager.createTilesetDescriptor( TilesetDescriptorOptions.Builder() .styleURI(Style.MAPBOX_STREETS) .minZoom(10) .maxZoom(16) .build() ) val tileRegionLoadOptions = TileRegionLoadOptions.Builder() .geometry(Point.fromLngLat(37.6173, 55.7558)) .descriptors(listOf(tilesetDescriptor)) .build() tileStore.loadTileRegion("moscow-center", tileRegionLoadOptions, { progress -> Log.d("Mapbox", "Downloaded: ${progress.completedResourceCount}/${progress.requiredResourceCount}") }, { result -> result.fold({ region -> Log.d("Mapbox", "Done: ${region.id}") }, { error -> }) }) Common Mistakes When Integrating Mapbox iOS or Mapbox Android SDK
- Incorrect access token (check the scope—it must include "Maps" and "Offline").
- Missing location permissions for accurate positioning.
- Style errors: references to missing sprites or icons in Mapbox Studio.
- Caching issues: if you don't clear old cache after migration, offline may not work.
Workflow
- Analysis — review the current implementation, identify necessary changes. Check SDK version, styles, and data sources.
- Design — select SDK version (we recommend v11), style, data sources, plan offline regions.
- Implementation — coding in Swift/Kotlin, configuring styles in Mapbox Studio, test access token.
- Testing — verify on devices, load test offline, debug via Android Studio / Xcode.
- Deployment — update provisioning profiles, publish to stores.
Timelines and Pricing
A basic map with custom style — 1 day (starts at $500). Adding GeoJSON layers and offline — 2–3 days (typically $1500–$2500). Complex projects with clustering and custom navigation — up to a week ($3000–$5000). Pricing is calculated individually after a quick assessment. You save time on learning the API and debugging—based on our experience, up to 40% of development time.
What's Included
- Source code with comments and architectural explanations.
- Documentation for access token setup, build, and deployment.
- Access to styles in Mapbox Studio.
- Support during App Store and Google Play publishing.
- 30-day stability guarantee.
We are a team of 10 developers and have 5 years on the market, with 5+ years of experience. Assess your project in 1 day—contact us for a consultation. Get a free audit of your current implementation and migration recommendations. Plus, we offer an extended guarantee on Mapbox SDK integration—full support for 30 days after delivery. Order integration today.







