Features ✨ and improvements 🏁
-
New experimental
RasterLayer.rasterAllowDrapingproperty
Draping blends a raster layer's emissive color into the globe/terrain surface, which can't fully preserve custom shading. SettingrasterAllowDrapingtofalsetakes a raster layer out of draping by applying a small elevation and a ground elevation reference, keeping shading consistent between draped and non-draped render modes. -
SymbolLayer.symbolZOffsetpromoted from experimental to stable
The property is already used in Mapbox Standard styles and by customers, so it no longer carries the experimental label. -
Config option accepts an object;
distanceexpression accepts an expression
Import config properties can now take an object literal, and the second argument of thedistanceexpression can now be any expression (for example["config", "route-line-geometry"]) instead of only a literal — useful for filtering out off-route traffic near a route line. -
Clarified documentation for
RasterLayer.rasterColor,rasterColorMix, andrasterColorRange
Bug fixes 🐞
-
Fixed a crash in apps compiled with Swift 6 language mode when
TileStore/OfflineManageroffline callbacks fired off the main thread
Swift 6 infers a closure's actor isolation from its capture context; a non-@Sendableclosure capturing@MainActor-isolated state (for example[weak self]on a view controller) was inferred main-actor-isolated, so calling it from TileStore's worker thread crashed at runtime. Offline APIcompletion/progressclosures and their model types are now@Sendable, preventing the crash. -
Fixed a crash caused by a data race when subscribing to or cancelling a
Signalfrom a background thread while it emits on another thread
EverySignalstored its handlers in a plain, unsynchronized array. A background subscribe or cancel racing an emission could corrupt the array's buffer, most visibly as a crash when subscribing through Combine's.subscribe(on:). Subscription is now thread-safe, preventing the crash. -
View annotations could reposition frequently on overlapping route sections
When a view annotation couldn't be placed at its point, the SDK discarded its previous geometry and searched for a new position purely by tile order, which could make the annotation jump. Previous placement information is now preserved, so the SDK searches neighboring tiles instead of restarting the search from scratch. -
Line borders could bleed onto a neighboring segment on short segments
The round-join anchor used for a line's border sits at the miter point, up to two half-widths from the corner; on segments shorter than the line's width, that point could land outside the segment and paint border color across the next one. The anchor is now clamped to stay within one half-width on short segments. -
Fixed a crash accessing a tile that had already been removed
Cached render tiles could still be referenced after the tiles they pointed to were removed during a tile pyramid update or clear. Removed tiles are now dropped from the cache at the same time, so no reference to a deleted tile survives. -
Requesting a tile above an offline pack's max zoom could briefly show a blank tile
Such a request sometimes returned an empty tile instead of reporting the data as missing, which was treated downstream as a genuinely empty tile — dropping the fallback to a parent tile and leaving a blank area, briefly online or persistently offline. The tile store now reports a proper miss so the map falls back to cache or network instead. -
Symbols could appear at the wrong height for a frame when 3D buildings were toggled via style config
Toggling 3D buildings through a style config option didn't immediately recompute symbol elevation, so labels and icons could sink or float briefly. -
Reduced aliasing on minified dashed lines
Densely dashed lines, such as HD zebra crossings, could shimmer or crawl when zoomed out because each dash's average coverage wasn't preserved at small sizes. Dash edges are now softened and faded toward their average coverage instead. -
Brightness-driven paint properties could get stuck after repeated light preset switches
Paint properties that react to brightness — such asicon-image-cross-fadedriven by["measure-light", "brightness"]— could freeze at a stale value after rapidly switching light presets instead of transitioning to match the new one. -
Fixed a crash on malformed polygon geometry with degenerate exterior rings
Querying or interacting with certain polygon features could return malformed geometry containing a zero-area exterior ring, which failed internal validation (LinearRings need to be made up of 4 or more coordinates) and crashed. Degenerate rings are now dropped before validation instead. -
Fixed a crash on deleted Metal textures during async resource upload and destruction
A texture could be released while an asynchronous upload against it was still in flight, without a fence to guarantee the upload had completed first, causing a crash. Async resource destruction is now properly fenced. -
Fixed map detail disappearing when zooming in over an area covered by an offline tile pack
Such a request could be answered with a stretched, coarser tile presented as if it were authoritative, even when the ambient cache already held better, more detailed data for that location. The ambient cache is now consulted first in that case, so the map shows fresher detail instead of a stale stretch.
Dependencies
- Update MapboxCommon to
24.29.0. - Update MapboxCoreMaps to
11.29.0.
Dependency requirements:
- Compatible version of Xcode:
26.3