Skip to content

Releases: mapbox/mapbox-maps-ios

v11.25.1

Choose a tag to compare

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

11.26.0-rc.1 Pre-release
Pre-release

Choose a tag to compare

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 experimental ViewAnnotation.enableSymbolLayerCollision option (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 experimental UIView.mbxCollisionBox (View.mbxCollisionBox() in SwiftUI). View annotation collision boxes are also drawn when MapView.debugOptions includes .collision.

  • Marker automatically hides symbols beneath it
    Marker now 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.

  • SwiftUI 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
    ModelSource now supports lightOverrides on 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 zoom expressions across appearances not rendering correctly
    When two appearances overrode the same symbol paint property with interpolate zoom expressions 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-fade not 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 with symbol-z-offset or symbol-elevate could 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 as open, getGroup, and listGroups are up to 99% faster, and write operations such as setGroupTiles are 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

Choose a tag to compare

Dependencies

  • Update MapboxCommon to 24.21.9.
  • Update MapboxCoreMaps to 11.21.9.

Dependency requirements:

  • Compatible version of Xcode: 16.4

v11.21.8

Choose a tag to compare

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

Choose a tag to compare

@maios maios released this 25 Jun 13:02

Dependencies

  • Update MapboxCommon to 23.12.1.

Dependency requirements:

  • Compatible version of Xcode: 14.3.1

v11.26.0-alpha.1

v11.26.0-alpha.1 Pre-release
Pre-release

Choose a tag to compare

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 experimental UIView.mbxCollisionBox flag (View.mbxCollisionBox() in SwiftUI).
  • Support drawing view annotation collision boxes when MapView.debugOptions is 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

Choose a tag to compare

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 an IndoorLabels featureset together with new configuration options: showIndoor, showIndoorLabels, colorIndoorLabelHighlight, and colorIndoorLabelSelect. 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
    CameraOptions now includes a verticalFov property, so you can set a custom vertical field of view when you call setCamera, easeTo, or flyTo. During flyTo, 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 interpolate expressions
    You can now use color string literals such as "red" or "#ff0000" as inputs to an interpolate expression. These strings raised an error before. This change brings the expression parser in line with Mapbox GL JS.

  • line-progress input for line-emissive-strength
    line-emissive-strength now accepts a line-progress input, 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-zero line-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 underlying MapView, 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
    Source attribution strings arrive from per-source TileJSON and are operator-controlled. The SDK previously parsed them with NSAttributedString's HTML importer, which could silently fetch remote subresources (such as <img>, <link>, or CSS url() references) embedded in those strings. Attribution markup is now extracted with a restricted in-process parser, and only http and https URLs 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 zoom no 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 uncaught SQLITE_BUSY exception 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 threw std::bad_function_call and 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 canonical mapbox:// 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 a SQLITE_LOCKED error 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

v11.25.0-rc.2 Pre-release
Pre-release

Choose a tag to compare

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

v11.25.0-rc.1 Pre-release
Pre-release

Choose a tag to compare

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 an IndoorLabels featureset together with new configuration options: showIndoor, showIndoorLabels, colorIndoorLabelHighlight, and colorIndoorLabelSelect. 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
    CameraOptions now includes a verticalFov property, so you can set a custom vertical field of view when you call setCamera, easeTo, or flyTo. During flyTo, 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 interpolate expressions
    You can now use color string literals such as "red" or "#ff0000" as inputs to an interpolate expression. These strings raised an error before. This change brings the expression parser in line with Mapbox GL JS.

  • line-progress input for line-emissive-strength
    line-emissive-strength now accepts a line-progress input, 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-zero line-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 underlying MapView, 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
    Source attribution strings arrive from per-source TileJSON and are operator-controlled. The SDK previously parsed them with NSAttributedString's HTML importer, which could silently fetch remote subresources (such as <img>, <link>, or CSS url() references) embedded in those strings. Attribution markup is now extracted with a restricted in-process parser, and only http and https URLs 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 zoom no 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 uncaught SQLITE_BUSY exception 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 threw std::bad_function_call and 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 canonical mapbox:// 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 a SQLITE_LOCKED error 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

Choose a tag to compare

Dependencies

  • Update MapboxCommon to 24.21.7.
  • Update MapboxCoreMaps to 11.21.7.

Dependency requirements:

  • Compatible version of Xcode: 16.4