Release v1.12.0
API Refinement, Smarter Tile Loading, and Cross-Platform Consistency
v1.12.0 is all about polish and performance. We've cleaned up coordinate conversion APIs, optimized tile loading to reduce bandwidth waste, and standardized naming across platforms to make your code more maintainable.
TL;DR
- Unified screen-to-map conversion API on Android – now uses
android.graphics.PointF, eliminating the oldMapPoint/Pointmix-up - Property clean-up on iOS –
mapZoom→mapScale(and heads-up about v1.13 renaming ofmapZoomLevel) - Smarter tile pipeline on both platforms – fewer aborts, fewer duplicate downloads, better cache hit-rate
- NDK r28.1 & 16 KB page-size support for Android – rebuilt libs and updated CMake configs
What's new
🌍 Cross-platform
Intelligent Tile Loading
We've reimagined how the SDK requests map tiles during pan and zoom gestures. The result? Dramatically reduced bandwidth waste and better cache utilization.
The Problem Before: When users quickly panned or zoomed, the old strategy would fire hundreds of tile requests, only to cancel most of them mid-flight. This wasted bandwidth, CPU cycles, and sometimes led to the wrong tiles being cached.
The v1.12.0 Solution:
| Area | Details |
|---|---|
| Progressive loading | Instead of requesting every potentially visible tile immediately, v1.12.0 starts with the coarsest visible zoom, then queues deeper detail tiles progressively |
| Smart cancellation | Only cancels requests that haven't started downloading yet |
| Opportunistic caching | If a download has already begun, the SDK completes it and caches the result – even if the viewport has moved |
| Reduced network churn | Fewer aborted requests means less wasted bandwidth and more predictable performance |
Impact: Apps feel more responsive during rapid map movements, and your users' data plans will thank you.
Consistent Naming Across Platforms
| Area | Details |
|---|---|
| Terminology alignment | We're converging on the Android naming scheme: scale = real-world scale (continuous), zoom = discrete zoom level (integer/floor value) |
| Why it matters | Reduces confusion when maintaining cross-platform codebases. The same concept now uses the same name on both iOS and Android. |
🤖 Android
Coordinate Conversion API: Now Using the Right Types
One of the most confusing aspects of the old API was using MapPoint for both screen coordinates and map coordinates. This led to bugs and confusion about which coordinate space you were working in.
What Changed:
| Change | Notes |
|---|---|
| Type safety improvement | Screen coordinates now use android.graphics.PointF (the standard Android type). Map coordinates use MapPoint. No more ambiguity. |
| Method signatures | convertDisplayToInternal(float x, float y) and convertInternalToDisplay(MapPoint) now have type-safe signatures |
| Why it matters | Eliminates a whole class of coordinate space bugs. The type system now prevents you from accidentally passing screen coords where map coords are expected. |
Platform Updates
| Change | Notes |
|---|---|
| NDK 28.1 | Pre-built .so files were rebuilt with NDK r28.1 for improved compatibility and performance |
| 16KB page size support | Updated CMake configs and libs to support Android's upcoming 16KB page size requirement |
Minor
- Added setSurface(surface, w, h, scale) helper (useful for custom Surface routing).
- destroySurface() is now public.
Migration hints
// 1.11.x
MapPoint geo = renderer.convertDisplayToInternal(new MapPoint(x, y));
// 1.12.0+
MapPoint geo = renderer.convertDisplayToInternal(x, y);
⸻
🍏 iOS
Property Naming Cleanup
We're aligning iOS naming with Android to reduce cognitive overhead when working across both platforms.
| Change | Notes |
|---|---|
mapZoom → mapScale | The floating-point scale property is now called mapScale, matching Android's getMapScale()/setMapScale() |
| Forward compatibility notice | In v1.13.0, mapZoomLevel will be renamed to mapZoom (same semantic as Android's mapZoom) |
| Why this matters | Consistent naming = less context switching. If you maintain both iOS and Android versions, your code will be easier to reason about. |
Performance & Features
| Change | Notes |
|---|---|
| Tile pipeline optimization | Same algorithmic improvements as Android – dramatically fewer cancellations during fast pan/zoom |
| New property | Added isTapZoomInverted property (default = false) for apps that want to invert double-tap zoom behavior |
Migration quick-check
// Replace
double scale = mapView.mapZoom; // 1.11.x
// With
double scale = mapView.mapScale; // 1.12.0
Thank you!
Big thanks to everyone who reported issues, tested pre-releases, and sent pull requests. Send feedback to [email protected].
