Releases: mapbox/mapbox-maps-ios
Release list
v11.25.1
Bug fixes 🐞
- View annotation placement blocked on short road segments
The collision grid used during symbol placement ran at 64×64 cells per tile. On short segments, the coarse cell footprint overstated the occupied area and blocked View Annotation placement even when space was available. The grid now runs at 128×128 cells, which matches the actual geometry much more closely.
Dependencies
- Update MapboxCommon to
24.25.1. - Update MapboxCoreMaps to
11.25.1.
Dependency requirements:
- Compatible version of Xcode:
16.4
11.26.0-rc.1
Mapbox Maps SDK for iOS — 11.26.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 🏁
-
View annotations can now suppress conflicting map symbols
The new experimentalViewAnnotation.enableSymbolLayerCollisionoption (MapViewAnnotation.enableSymbolLayerCollision()in SwiftUI) registers the annotation's bounding box with the symbol placement engine, so map labels and icons that would overlap it are hidden automatically. By default the full bounding box participates in collision; for non-rectangular annotations, mark the specific subviews that should contribute via the new experimentalUIView.mbxCollisionBox(View.mbxCollisionBox()in SwiftUI). View annotation collision boxes are also drawn whenMapView.debugOptionsincludes.collision. -
Markerautomatically hides symbols beneath it
Markernow enables symbol-layer collision internally, so road names and POI labels that fall under its icon or label text are suppressed without any additional configuration. -
Experimental
Map.viewAnnotationAvoidLayers()
A new experimental modifier lets you specify layer IDs whose features the view annotation placement algorithm should avoid, enabling navigation-style use cases where annotations must stay clear of specific rendered layers. -
Per-model light overrides in
ModelSource
ModelSourcenow supportslightOverrideson individual 3D models, alongside the existing material and node overrides. This makes it possible to keep a specific model — such as a vehicle puck — clearly visible in night or dark-style maps without changing the global lighting for all models.
Bug fixes 🐞
-
Missing labels on multiline street features
The line-merging pass that prepares features for label placement assumed each feature contained a single linestring and silently dropped extra geometry rings. A street that crossed a tile boundary as a multilinestring produced fewer labels than expected. The pass now expands each linestring into its own feature before merging, so every segment is labeled correctly. -
View annotation placement blocked on short road segments
The collision grid used during symbol placement ran at 64×64 cells per tile. On short segments, the coarse cell footprint overstated the occupied area and blocked View Annotation placement even when space was available. The grid now runs at 128×128 cells, which matches the actual geometry much more closely. -
Worldview filter not applied after switching worldviews at runtime
Worldview is now a first-class member of the expression evaluation context rather than a side-channel value. Re-evaluating any property that depends on it after a change now produces the correct filtered result consistently. -
Different
interpolate zoomexpressions across appearances not rendering correctly
When two appearances overrode the same symbol paint property withinterpolate zoomexpressions that had different stop sets, a single shared zoom-factor uniform was used for all of them, producing incorrect output. The renderer now stores a per-feature zoom range in the UBO and derives each feature's interpolation factor independently. -
icon-image-cross-fadenot working for images redefined in appearances
Appearance overrides that redefined an image prevented the cross-fade transition from running when the image changed. The transition now applies correctly to images overridden via appearances. -
Elevated symbols not displaying on rotated or pitched maps
Symbols withsymbol-z-offsetorsymbol-elevatecould be incorrectly classified as drapable at layout time, causing them to disappear when the map was rotated or pitched. Draping is now disabled for all symbol layers, which matches the expected behavior. -
Location indicator showing pink lines or rotating around the wrong center with non-square images
Padding the indicator image to a power-of-two size left uninitialized texture memory around the original, which appeared as pink lines (most visible in Simulator). Separately, the SDK assumed square images when computing the rotation pivot, so non-square images — including the default navigation puck at 64×67 px — rotated around the wrong center. Both issues are fixed. -
Crash during offline tile decompression
Evicting a cached Zstandard frame captured a reference into the front element of an internal queue and then popped the element, leaving the reference dangling. Under sustained eviction pressure, a subsequent read through that reference caused a heap-use-after-free. The entry is now copied by value before the queue is modified.
Performance improvements 🚀
-
Faster TileStore operations on large offline databases
Several operations that computed group metadata on every call now cache results across calls. On a database with approximately 1.4 million tiles, operations such asopen,getGroup, andlistGroupsare up to 99% faster, and write operations such assetGroupTilesare 70–94% faster. -
More accurate terrain raycasting
The terrain raycast — used for feature queries, camera fitting, and fog — previously tested only four corner samples per leaf in the DEM quad-tree, missing peaks between corners. The raycast now sweeps an 8×8 grid within each leaf and uses accurate min/max values at every mipmap level, so the returned coordinate consistently matches the queried screen position.
Dependencies
- Update MapboxCommon to
24.26.0-rc.1. - Update MapboxCoreMaps to
11.26.0-rc.1.
Dependency requirements:
- Compatible version of Xcode:
26.5
v11.21.9
Dependencies
- Update MapboxCommon to
24.21.9. - Update MapboxCoreMaps to
11.21.9.
Dependency requirements:
- Compatible version of Xcode:
16.4
v11.21.8
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 🏁
- Reduce per-frame rendering overhead when style properties are updated frequently.
Bug fixes 🐞
- Fix a crash caused by dereferencing a null index buffer when drawing symbols.
Dependencies
- Update MapboxCommon to
24.21.8. - Update MapboxCoreMaps to
11.21.8.
Dependency requirements:
- Compatible version of Xcode:
16.4
v10.19.6
v11.26.0-alpha.1
Important
The minimum Xcode version is updated to 26.3
Features ✨ and improvements 🏁
- Introduce new experimental
ViewAnnotation.enableSymbolLayerCollision(MapViewAnnotation.enableSymbolLayerCollision()in SwiftUI) option which allows view annotations to hide underlying map symbols to avoid visual clutter.
By default, the full bounding box of the view annotation is used for collision detection. If your annotation has a non-rectangular shape, it is highly recommended to mark the specific subviews that should participate via the new experimentalUIView.mbxCollisionBoxflag (View.mbxCollisionBox()in SwiftUI). - Support drawing view annotation collision boxes when
MapView.debugOptionsis set to.collision. - [SwiftUI] Improved
Marker- now it automatically hides the underlying map symbols below it's icon and text. - [SwiftUI] Added experimental
Map.viewAnnotationAvoidLayers()which allows to set view annotations to avoid layers.
Dependencies
- Update MapboxCommon to
24.26.0-alpha.1. - Update MapboxCoreMaps to
11.26.0-alpha.1.
Dependency requirements:
- Compatible version of Xcode:
26.3
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
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
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
v11.21.7
Dependencies
- Update MapboxCommon to
24.21.7. - Update MapboxCoreMaps to
11.21.7.
Dependency requirements:
- Compatible version of Xcode:
16.4