-
Notifications
You must be signed in to change notification settings - Fork 194
Releases: mapbox/mapbox-maps-ios
v11.25.0
Note
Mapbox will end support for CocoaPods in December 2026. After that date, new versions of the Mapbox Maps SDK for iOS will not be published to CocoaPods. We recommend installing the SDK via Swift Package Manager to continue receiving updates.
Features ✨ and improvements 🏁
-
Indoor labels in the Mapbox Standard style
The Mapbox Standard style now exposes anIndoorLabelsfeatureset together with new configuration options:showIndoor,showIndoorLabels,colorIndoorLabelHighlight, andcolorIndoorLabelSelect. Use them to display indoor venue labels and to highlight or select an indoor label through the standard interactions API. -
Custom vertical field of view in
CameraOptions
CameraOptionsnow includes averticalFovproperty, so you can set a custom vertical field of view when you callsetCamera,easeTo, orflyTo. DuringflyTo, the field of view interpolates linearly and does not take part in the optimal-path animation. Changing the field of view also changes the camera distance, which matches the behavior of Mapbox GL JS. -
Color string literals in
interpolateexpressions
You can now use color string literals such as"red"or"#ff0000"as inputs to aninterpolateexpression. These strings raised an error before. This change brings the expression parser in line with Mapbox GL JS. -
line-progressinput forline-emissive-strength
line-emissive-strengthnow accepts aline-progressinput, so you can vary the emissive strength of a line along its length — for example, to fade a route line toward its destination. -
Client-side conflation of standard-definition and high-definition roads
The renderer can now conflate standard-definition (SD) and high-definition (HD) road and traffic data on the client. Where HD road coverage is available, the matching SD roads and traffic fade out through a stencil-masked transition with a configurable opacity fade, so the two datasets no longer draw on top of each other. The behavior is driven by style configuration and needs no API changes. -
Sharper anti-aliasing for lines with borders
Lines that have a border (a non-zeroline-border-width) now use distance-based, pixel-perfect anti-aliasing on their outset and inset edges. Line edges and non-zero gap widths also render more accurately. This change affects only bordered lines. -
Zstandard compression for tile store packages
Tile store import packages now support seekable Zstandard (zstd) compression. Compressing a package that contains the Mapbox Standard style reduces its size from about 109 MB to about 51 MB, which lowers the download and storage cost of offline maps.
Bug fixes 🐞
-
Taps on view annotations no longer fall through to the map
A tap on a view annotation also reached the underlyingMapView, which could dismiss the annotation it had opened. The map view no longer receives a tap that a view annotation has already handled. -
Hardened parsing of source attribution strings
Sourceattributionstrings arrive from per-source TileJSON and are operator-controlled. The SDK previously parsed them withNSAttributedString's HTML importer, which could silently fetch remote subresources (such as<img>,<link>, or CSSurl()references) embedded in those strings. Attribution markup is now extracted with a restricted in-process parser, and onlyhttpandhttpsURLs are surfaced as actionable links. -
Map flicker from background shader compilation
The background shader compiler did not populate the binary shader cache, so the cache stayed empty and every shader was compiled in the background again. This produced flickering. The compiler now writes to the binary cache, which removes the repeated compilation and the flicker. -
Crash while iterating map interactions
An interaction callback that removed an interaction during dispatch could invalidate the iterator the SDK was using and crash. Interaction dispatch now holds a strong reference to the handler and guards against iterator invalidation. -
Missing letters in text labels on terrain-elevated lines
Letters in the middle of a text label placed along a line could disappear when the line was elevated by terrain. The SDK no longer truncates map-aligned text along a line, which matches Mapbox GL JS, so the full label renders. -
Appearance conditions that use
zoomno longer fail to parse
An appearance condition that combined a feature test with a["zoom"]expression — for example, inside an["all", ...]condition — failed to parse on iOS and produced an empty result, even though the same condition worked in Mapbox GL JS. These conditions now parse and render correctly. -
Crash from a null index buffer during symbol rendering
Rendering certain symbol layers could dereference a null index buffer and crash when a symbol bucket neither requested a shared index buffer nor generated its own. The SDK now requests a shared index buffer in this case. -
Crash when overriding terrain was merged with another source
Enabling terrain could crash when the overriding terrain was merged with another source from the same root style. The merge no longer crashes. -
Process termination from uncaught SQLite "busy" exceptions
Accessing persistent storage from more than one thread could throw an uncaughtSQLITE_BUSYexception and terminate the process. The SDK now reuses an existing connection per database, applies a short busy timeout that retries a transient lock, and handles the exception around the affected statements. -
Crash when an HTTP download was aborted mid-transfer
Aborting an HTTP download left its output stream callback empty while a late data chunk could still arrive, which threwstd::bad_function_calland terminated the process. The SDK now resets the download streams before it clears the callback. -
Crash when an HTTP tile download could not create a temporary file
A failure to create the temporary directory for a tile download raised a filesystem error that escaped into the network callback and terminated the process. The SDK now handles the error and aborts the download cleanly. -
TileStore migration failures from duplicate resources
Migrating a TileStore database from schema 9 to schema 10 could fail when converting resource URLs to the canonicalmapbox://form produced a collision, which left the TileStore unusable and forced navigation into fallback mode. The migration now ignores duplicate resources and completes. -
Dropped tile store cache updates from a SQLite lock race
Concurrent read and write TileStore connections that shared an in-memory cache table could trip aSQLITE_LOCKEDerror while tracking least-recently-used access, which silently dropped cache updates. The SDK now tracks least-recently-used access on a dedicated auto-commit connection, so the lock releases immediately.
Dependencies
- Update MapboxCommon to
24.25.0. - Update MapboxCoreMaps to
11.25.0.
Dependency requirements:
- Compatible version of Xcode:
16.4
Assets 2
v11.25.0-rc.2
Dependencies
- Update MapboxCommon to
24.25.0-rc.2. - Update MapboxCoreMaps to
11.25.0-rc.2.
Dependency requirements:
- Compatible version of Xcode:
16.4
Assets 2
v11.25.0-rc.1
Note
Mapbox will end support for CocoaPods in December 2026. After that date, new versions of the Mapbox Maps SDK for iOS will not be published to CocoaPods. We recommend installing the SDK via Swift Package Manager to continue receiving updates.
Features ✨ and improvements 🏁
-
Indoor labels in the Mapbox Standard style
The Mapbox Standard style now exposes anIndoorLabelsfeatureset together with new configuration options:showIndoor,showIndoorLabels,colorIndoorLabelHighlight, andcolorIndoorLabelSelect. Use them to display indoor venue labels and to highlight or select an indoor label through the standard interactions API. -
Custom vertical field of view in
CameraOptions
CameraOptionsnow includes averticalFovproperty, so you can set a custom vertical field of view when you callsetCamera,easeTo, orflyTo. DuringflyTo, the field of view interpolates linearly and does not take part in the optimal-path animation. Changing the field of view also changes the camera distance, which matches the behavior of Mapbox GL JS. -
Color string literals in
interpolateexpressions
You can now use color string literals such as"red"or"#ff0000"as inputs to aninterpolateexpression. These strings raised an error before. This change brings the expression parser in line with Mapbox GL JS. -
line-progressinput forline-emissive-strength
line-emissive-strengthnow accepts aline-progressinput, so you can vary the emissive strength of a line along its length — for example, to fade a route line toward its destination. -
Client-side conflation of standard-definition and high-definition roads
The renderer can now conflate standard-definition (SD) and high-definition (HD) road and traffic data on the client. Where HD road coverage is available, the matching SD roads and traffic fade out through a stencil-masked transition with a configurable opacity fade, so the two datasets no longer draw on top of each other. The behavior is driven by style configuration and needs no API changes. -
Sharper anti-aliasing for lines with borders
Lines that have a border (a non-zeroline-border-width) now use distance-based, pixel-perfect anti-aliasing on their outset and inset edges. Line edges and non-zero gap widths also render more accurately. This change affects only bordered lines. -
Zstandard compression for tile store packages
Tile store import packages now support seekable Zstandard (zstd) compression. Compressing a package that contains the Mapbox Standard style reduces its size from about 109 MB to about 51 MB, which lowers the download and storage cost of offline maps.
Bug fixes 🐞
-
Taps on view annotations no longer fall through to the map
A tap on a view annotation also reached the underlyingMapView, which could dismiss the annotation it had opened. The map view no longer receives a tap that a view annotation has already handled. -
Hardened parsing of source attribution strings
Sourceattributionstrings arrive from per-source TileJSON and are operator-controlled. The SDK previously parsed them withNSAttributedString's HTML importer, which could silently fetch remote subresources (such as<img>,<link>, or CSSurl()references) embedded in those strings. Attribution markup is now extracted with a restricted in-process parser, and onlyhttpandhttpsURLs are surfaced as actionable links. -
Map flicker from background shader compilation
The background shader compiler did not populate the binary shader cache, so the cache stayed empty and every shader was compiled in the background again. This produced flickering. The compiler now writes to the binary cache, which removes the repeated compilation and the flicker. -
Crash while iterating map interactions
An interaction callback that removed an interaction during dispatch could invalidate the iterator the SDK was using and crash. Interaction dispatch now holds a strong reference to the handler and guards against iterator invalidation. -
Missing letters in text labels on terrain-elevated lines
Letters in the middle of a text label placed along a line could disappear when the line was elevated by terrain. The SDK no longer truncates map-aligned text along a line, which matches Mapbox GL JS, so the full label renders. -
Appearance conditions that use
zoomno longer fail to parse
An appearance condition that combined a feature test with a["zoom"]expression — for example, inside an["all", ...]condition — failed to parse on iOS and produced an empty result, even though the same condition worked in Mapbox GL JS. These conditions now parse and render correctly. -
Crash from a null index buffer during symbol rendering
Rendering certain symbol layers could dereference a null index buffer and crash when a symbol bucket neither requested a shared index buffer nor generated its own. The SDK now requests a shared index buffer in this case. -
Crash when overriding terrain was merged with another source
Enabling terrain could crash when the overriding terrain was merged with another source from the same root style. The merge no longer crashes. -
Process termination from uncaught SQLite "busy" exceptions
Accessing persistent storage from more than one thread could throw an uncaughtSQLITE_BUSYexception and terminate the process. The SDK now reuses an existing connection per database, applies a short busy timeout that retries a transient lock, and handles the exception around the affected statements. -
Crash when an HTTP download was aborted mid-transfer
Aborting an HTTP download left its output stream callback empty while a late data chunk could still arrive, which threwstd::bad_function_calland terminated the process. The SDK now resets the download streams before it clears the callback. -
Crash when an HTTP tile download could not create a temporary file
A failure to create the temporary directory for a tile download raised a filesystem error that escaped into the network callback and terminated the process. The SDK now handles the error and aborts the download cleanly. -
TileStore migration failures from duplicate resources
Migrating a TileStore database from schema 9 to schema 10 could fail when converting resource URLs to the canonicalmapbox://form produced a collision, which left the TileStore unusable and forced navigation into fallback mode. The migration now ignores duplicate resources and completes. -
Dropped tile store cache updates from a SQLite lock race
Concurrent read and write TileStore connections that shared an in-memory cache table could trip aSQLITE_LOCKEDerror while tracking least-recently-used access, which silently dropped cache updates. The SDK now tracks least-recently-used access on a dedicated auto-commit connection, so the lock releases immediately.
Dependencies
- Update MapboxCommon to
24.25.0-rc.1. - Update MapboxCoreMaps to
11.25.0-rc.1.
Dependency requirements:
- Compatible version of Xcode:
16.4
Assets 2
v11.21.7
Dependencies
- Update MapboxCommon to
24.21.7. - Update MapboxCoreMaps to
11.21.7.
Dependency requirements:
- Compatible version of Xcode:
16.4
Assets 2
v11.24.3
Dependencies
- Update MapboxCommon to
24.24.3. - Update MapboxCoreMaps to
11.24.3.
Dependency requirements:
- Compatible version of Xcode:
16.4
Assets 2
v11.21.6
Changes
- Fixed a use-after-free crash in
MapImplthat could occur when asynchronous tasks accessed a partially-destroyed map instance, e.g. under heavy load or rapid view recreation. - Fixed a crash in the vector tile layer data cache when a sibling tile was destroyed during cache iteration.
- Improved anti-aliasing for lines with a non-zero
line-border-width, fixing pixelated rendering of thick line borders.
Dependencies
- Update MapboxCommon to
24.21.6. - Update MapboxCoreMaps to
11.21.6.
Dependency requirements:
- Compatible version of Xcode:
16.4
Assets 2
v11.24.2
Bug fixes 🐞
- Crash when modifying a layer that shares an id with an imported style
When a layer in the root style and a layer in an imported style shared the same id, a runtime change to that layer caused both layers to be re-sent to the renderer as duplicates, triggering a crash. The lookup that locates the layer being updated now uses the fullFullStyleLayerId(id + import scope) instead of only theStyleLayerId, so the correct single layer is updated and duplicates are no longer emitted.
Dependencies
- Update MapboxCommon to
24.24.2. - Update MapboxCoreMaps to
11.24.2.
Dependency requirements:
- Compatible version of Xcode:
16.4
Assets 2
v11.24.1
Features ✨ and improvements 🏁
- Featureset feature access
Exposed the newFeaturesetFeature.originalFeatureproperty, giving you direct access to the underlying publicFeature(geometry, properties, id) from any featureset hit. - Landmark Level-of-Detail rendering
The renderer now supports landmark models with LOD meshes when the tileset provides them, including a BVH-backed raycast path for more accurate label placement on top of 3D buildings.
Bug fixes 🐞
- Use-after-free crash in
MapImpl
MapImpl's destructor previously invalidated theWeakFactoryof its derivedStyleManagerImplbut not its own, leaving a short window where in-flight asynchronous tasks could touch a partially destroyed instance. The ownWeakFactoryis now invalidated as well, eliminating the crash. MapViewrendered blank on an already-active CarPlay scene
When a freshMapViewwas instantiated and attached to a scene that had already activated (a common pattern on CarPlay), the SDK missed thesceneDidActivatenotification and never cached the connected scene — leaving the display link idle and the map blank. The connected scene is now seeded ondidMoveToWindowby walking up the responder chain, so the map renders correctly regardless of when it joins the scene.- Style import config lost during a URL swap
CallingsetStyleImportConfigProperty(e.g.lightPreset, color overrides) right afterupdateStyleImportWithURIcould be silently dropped: the property was being applied to the soon-to-be-replaced import. Imports are now updated in place — the sameImportobject stays in the imports vector while only its internalStyle::Implis swapped — so config updates always land on the correct import. Observer callbacks (onStyleLoadingFinished, etc.) are also wired up only after the import is fully integrated, removing inconsistent intermediate states. - Crash in
VectorTileLayerDatacache when a sibling tile died mid-iteration
The cache reuses siblingVectorTileLayerDatainstances (same data/layer, different offset) to avoid redundant parsing. It used to keep the sibling as a raw pointer; if the tile that owned that sibling was destroyed before the copy completed, the pointer dangled and dereferencing it crashed. Siblings are now retained viashared_ptrfor the duration of the copy. applyLUTproduced incorrect colors with premultiplied input
applyLUTwas using the RGB channels of the input color as-is. Since input colors are essentially always premultiplied, RGB channels are scaled by alpha, so the LUT was being sampled at the wrong coordinates — producing dimmer-than-expected output. The lookup now operates in unpremultiplied color space.
Dependencies
- Update MapboxCommon to
24.24.1. - Update MapboxCoreMaps to
11.24.1.
Dependency requirements:
- Compatible version of Xcode:
16.4
Assets 2
v11.21.5
Changes
- Fixed an issue where rapidly switching basemap import URL and updating its configuration (such as light preset or color theme) could leave the map with stale settings. Configuration updates issued during a pending import swap are now reliably applied to the new style.
Dependencies
- Update MapboxCommon to
24.21.5. - Update MapboxCoreMaps to
11.21.5.
Dependency requirements:
- Compatible version of Xcode:
16.4
Assets 2
v11.23.1
Dependencies
- Update MapboxCommon to
24.23.1. - Update MapboxCoreMaps to
11.23.1.
Dependency requirements:
- Compatible version of Xcode:
16.4