Repository navigation
[4.22.0] 2026-10-02
Added
- More public types now conform to
Sendable, so they can be passed between actors and tasks in strict-concurrency code:MPGeoBounds,MPHighway,MPLiveUpdateand its subclasses,MPLiveUpdateTopic,MPLiveTopicCriteria, and the enumsMPCameraViewFitMode,MPCollisionHandling,MPHighwayType,MPLocationBaseType,MPRouteAnimationType,MPRouteArrowStyle,MPRouteStampType,MPStrokeStyle,MPSubscriptionStateandMPTravelMode.
Changed
- All MapsIndoors modules (
MapsIndoors,MapsIndoorsCore,MapsIndoorsGoogleMapsandMapsIndoorsMapbox) are now built in the Swift 6 language mode, with complete strict concurrency checking. MPSelectionBehavior.defaultnow returns a new instance on every read, asMPFilterBehavior.defaultandMPHighlightBehavior.defaultalready do. ChangingmaxZoomon the instance it returned used to change it for every later caller too, including the selection made when a user taps a location.- SDK log messages that report an
MPErrornow include its error code alongside the description.
Fixed
- Setting
MPMapControl.showUserPositionfrom a background thread no longer crashes the app. ReadingcameraPositionfrom a background thread no longer crashes either; it logs an error and returns the current position. - Location icons and their labels now stay on their floor when the camera is tilted, as on Google Maps. They were raised onto the roof of any 3D building or extrusion beneath them, including the base map's own buildings while faded out, so in a tall building they could appear far from their location [Mapbox only].
MPMapsIndoors.shared.getDefaultVenue()now returns the venue set as the solution's default in the CMS; it returnednilinstead. On a solution with several venues, the floor applied when the map first loaded could therefore come from a different venue on each launch.MPPoint.distanceTo(_:)now returns the correct distance between points at different longitudes, where it returned a wrong distance orNaN.- When a pan or zoom brings another building into view, the floor selector now switches to it. The map update at the end of the gesture could be skipped while another was still being drawn, which left the floor selector on the previous building until the camera moved again.
MPDataSetCacheManager.estimateBaseMapTileSize()andestimateBaseMapTileSize(_:)now measure the style the map is rendering, which is the stylesynchronizeBaseMapTiles(progress:)downloads. For an app that has replaced the MapsIndoors style with its own, the estimate described the MapsIndoors style instead [Mapbox only].- Fixed data races when a solution is loaded while map controls are being created or released, when
userRolesis changed from more than one thread, when the map's filter changes during a location lookup, and when a data-set synchronization is canceled just as it completes. ChanginguserRolesseveral times in quick succession now always leaves the last value applied.