Skip to content
Developers Docs

Migration Guide: 6.2.x → 26.7.1 (iOS)

This guide covers everything you need to upgrade an iOS app from Mapsted Mobile SDK 6.2.x to 26.7.1. Version 26.7.1 is a major release: it raises the minimum iOS version, renames the underlying engine framework, and makes a small number of source-level API changes. Most apps can complete the upgrade by following the Minimum changes to compile section below; the remaining sections document every breaking change in full, with before/after code.

Who needs to read this

Every app upgrading from 6.2.x. If you integrate the Map SDK (MapstedMap / MapstedMapUi), pay particular attention to the Build & packaging section — a project that changes only its Swift code, without the packaging updates, will not compile.


Minimum changes to compile

For a typical integration, these are the only changes required to build against 26.7.1:

  1. Raise the deployment target to iOS 16.0 — in both your Xcode target and your Podfile: ruby # Podfile platform :ios, '16.0'
  2. Update the pods / frameworks so the renamed engine framework is pulled in (see B4): bash pod install --repo-update
  3. Build with Xcode 26.3 or newer (Swift 6 toolchain). See Build & packaging.

If your app does not construct MNRoute objects itself and does not use the removed dead APIs, the three steps above are sufficient to compile.

Recommended (non-blocking) cleanup

The enum typo fix in B7 does not break compilation — the old spelling still compiles with a deprecation warning. Rename it at your convenience to silence the warning.


Breaking changes (complete reference)

The table summarizes all breaking changes; each is detailed below.

ID Change Severity Applies to
B1 Minimum iOS deployment target is now 16.0 High All apps
B2 Removed dead polyline types MNPropertyPolylines / MNBuildingPolylines Low Apps referencing these types (rare)
B3 Removed internal MNTestingModuleMapManager Low Apps referencing this type (rare)
B4 Internal engine module renamed MapstedCppMapstedCoreEngine Low None for CocoaPods/SwiftPM — informational
B5 MNRoute Swift initializer label startWaypoint:start: Low Swift code that constructs MNRoute
B6 Removed a dead Searchable Objective-C selector Low Rare
B7 EnumValidBlueDotError typo fix: MISSING_INTERTIAL_SENSORSMISSING_INERTIAL_SENSORS (deprecation, not breaking) Low Swift code referencing the misspelled case
B8 Geofence-trigger builder types renamed Cpp*CoreEngine* Low Apps that build geofence triggers programmatically (uncommon)

B1 — Minimum iOS deployment target is now 16.0

The SDK now requires iOS 16.0 as its minimum deployment target.

What to do

  • Set your Xcode target's iOS Deployment Target to 16.0 (or higher).
  • Set the platform in your Podfile:
# Before
platform :ios, '15.0'

# After
platform :ios, '16.0'

Setting only the Xcode target without updating the Podfile platform will leave the CocoaPods-generated pod targets on the old minimum and can produce link/validation errors — update both.


B2 — Removed dead polyline types MNPropertyPolylines / MNBuildingPolylines

MNPropertyPolylines and MNBuildingPolylines were unused public types and have been removed. They had no functional consumers, so most apps are unaffected.

What to do

  • Remove any references to MNPropertyPolylines / MNBuildingPolylines.
  • If you need property or building boundary polyline data, use the current public accessors, which return MNEngineMapPolyline values:
// Property boundary polylines
let propertyPolylines = EngineMapDataBridge.propertyPolylines(forPropertyId: propertyId)

// Building boundary polylines
let buildingPolylines = EngineMapDataBridge.buildingPolylines(forBuildingId: buildingId)

B3 — Removed internal MNTestingModuleMapManager

MNTestingModuleMapManager was an internal testing scaffold that was inadvertently public. It has been removed. Remove any references to it; it has no client-facing replacement.


B4 — Engine framework renamed MapstedCppMapstedCoreEngine

The internal positioning-engine module has been renamed from MapstedCpp to MapstedCoreEngine. It is compiled directly into MapstedCore — it is not a separate framework you add, and it is not part of the public API you call.

This is a packaging change, not a source change

There are no import MapstedCpp statements in client code — the engine is a transitive dependency of the Mapsted pods. This change is handled at the framework/pod level.

What to do

  • CocoaPods (recommended): run pod install --repo-update. The engine ships inside MapstedCore.xcframework; there is nothing extra to add and no source changes are required.
  • Manual framework integration: the positioning engine is bundled inside MapstedCore.xcframework — there is no standalone engine framework to add or remove. Integrate the shipped Mapsted xcframeworks as usual.

B5 — MNRoute Swift initializer label startWaypoint:start:

The Swift-facing initializer for MNRoute renamed its startWaypoint: argument label to start:. The Objective-C selector and the startWaypoint property are unchanged; this only affects Swift code that constructs an MNRoute directly (uncommon — routes are normally returned by the routing APIs).

// Before (6.2.x)
let route = MNRoute(
    propertyId: propertyId,
    startName: startName,
    destinationName: destinationName,
    startWaypoint: startWaypoint,
    destinationWaypoint: destinationWaypoint,
    optimalRoute: optimalRoute,
    accessibleRoute: accessibleRoute,
    bypassLevelTransitionsRoute: bypassLevelTransitionsRoute,
    bypassAlertsRoute: bypassAlertsRoute,
    routeError: routeError,
    isAnySuccessfulRoute: isAnySuccessfulRoute,
    bestValidRoute: bestValidRoute,
    isFromCurrentLocation: isFromCurrentLocation
)

// After (26.7.1) — only the startWaypoint: label changes to start:
let route = MNRoute(
    propertyId: propertyId,
    startName: startName,
    destinationName: destinationName,
    start: startWaypoint,
    destinationWaypoint: destinationWaypoint,
    optimalRoute: optimalRoute,
    accessibleRoute: accessibleRoute,
    bypassLevelTransitionsRoute: bypassLevelTransitionsRoute,
    bypassAlertsRoute: bypassAlertsRoute,
    routeError: routeError,
    isAnySuccessfulRoute: isAnySuccessfulRoute,
    bestValidRoute: bestValidRoute,
    isFromCurrentLocation: isFromCurrentLocation
)

Reading route.startWaypoint is unchanged.


B6 — Removed a dead Searchable Objective-C selector

A dead Objective-C selector on the Searchable surface was removed. The searchable concept itself is unchanged and remains available through the public ISearchable / CMSSearchable protocols. No action is required for typical integrations; if you referenced the removed selector directly, migrate to ISearchable.


B7 — EnumValidBlueDotError typo fix: MISSING_INTERTIAL_SENSORSMISSING_INERTIAL_SENSORS

The misspelled enum case MISSING_INTERTIAL_SENSORS ("intertial") was corrected to MISSING_INERTIAL_SENSORS. The value is unchanged (20); the old spelling is retained as a deprecated alias, so existing code still compiles — you will see a deprecation warning ('MISSING_INTERTIAL_SENSORS' is deprecated: Use MISSING_INERTIAL_SENSORS.), not an error. This is a recommended cleanup rather than a required change.

// Before (6.2.x)
if error == .MISSING_INTERTIAL_SENSORS {  }

// After (26.7.1)
if error == .MISSING_INERTIAL_SENSORS {  }

Update any Swift references to the corrected spelling.


B8 — Geofence-trigger builder types renamed Cpp*CoreEngine*

As part of the engine rename (B4), the public Objective-C types used to build geofence triggers programmatically were renamed from the Cpp* prefix to the CoreEngine* prefix. This affects only apps that construct geofence triggers in code (via EngineFacade.shared.addGeofenceTriggers(propertyId:builders:)); apps that do not use programmatic geofence triggers are unaffected. Unlike B7, there is no deprecated alias — the old names are removed, so referencing them is a hard compile error.

Type renames

Removed (6.2.x) Replacement (26.7.1)
CppGeofenceTriggerBuilder CoreEngineGeofenceTriggerBuilder
CppBuildingLocationCriteria CoreEngineBuildingLocationCriteria
CppFloorLocationCriteria CoreEngineFloorLocationCriteria
CppPropertyLocationCriteria CoreEnginePropertyLocationCriteria
CppPoiVicinityLocationCriteria CoreEnginePoiVicinityLocationCriteria
ICppLocationCriteria (protocol) ICoreEngineLocationCriteria (protocol)

The initializers, properties, and methods are otherwise unchanged — only the type names differ.

// Before (6.2.x)
if let builder = CppGeofenceTriggerBuilder(propertyId: propertyId, geofenceId: geofenceId),
   let criteria = CppBuildingLocationCriteria(buildingId: buildingId) {
    builder.setLocationCriteria(criteria)
    _ = EngineFacade.shared.addGeofenceTriggers(propertyId: propertyId, builders: [builder])
}

// After (26.7.1) — Cpp* renamed to CoreEngine*
if let builder = CoreEngineGeofenceTriggerBuilder(propertyId: propertyId, geofenceId: geofenceId),
   let criteria = CoreEngineBuildingLocationCriteria(buildingId: buildingId) {
    builder.setLocationCriteria(criteria)
    _ = EngineFacade.shared.addGeofenceTriggers(propertyId: propertyId, builders: [builder])
}

A project-wide find-and-replace of the Cpp prefix with CoreEngine on these six type names is sufficient.


Build & packaging

A project that follows only the source changes above may still fail to build. Version 26.7.1 raises the toolchain and adjusts the CocoaPods setup:

  • Toolchain floor — Xcode 26.3 / Swift 6. Build with Xcode 26.3 or newer (macOS 15.5+); older toolchains cannot consume the SDK's module interfaces.

  • Podfile platform. Set platform :ios, '16.0' (see B1).


Upgrade checklist

  1. [ ] Set Xcode deployment target and Podfile platform to 16.0.
  2. [ ] Confirm you are on Xcode 26.3+ (Swift 6 toolchain).
  3. [ ] Run pod install --repo-update; the renamed engine ships inside MapstedCore — nothing extra to add (B4).
  4. [ ] Rename MISSING_INTERTIAL_SENSORSMISSING_INERTIAL_SENSORS if referenced (B7).
  5. [ ] If you construct MNRoute in Swift, change startWaypoint:start: (B5).
  6. [ ] Remove references to MNPropertyPolylines / MNBuildingPolylines (B2) and MNTestingModuleMapManager (B3).
  7. [ ] If you build geofence triggers in code, rename the Cpp* builder/criteria types to CoreEngine* (B8).
  8. [ ] Clean build folder (Product → Clean Build Folder) and rebuild.

Troubleshooting

Symptom Likely cause Fix
No such module 'MapstedCpp' or missing engine symbols Old framework reference after the rename Run pod install --repo-update; the engine is bundled inside MapstedCore — there is no separate engine framework to add (B4)
Module-interface parse errors Building with an older Xcode Upgrade to Xcode 26.3+ (Build & packaging)
Pod validation errors about deployment target Podfile platform still on 15.x Set platform :ios, '16.0' (B1)
MNRoute initializer "extra argument 'startWaypoint'" Swift init label change Use start: (B5)
Cannot find 'CppGeofenceTriggerBuilder' in scope (or another Cpp* criteria type) Geofence-trigger types renamed Rename the Cpp prefix to CoreEngine (B8)

Estimated effort

  • Typical app (no MNRoute construction, no dead-API usage): ~15–30 minutes — deployment target, pod install, Xcode toolchain, rebuild.
  • App that constructs MNRoute in Swift or uses the removed types: add ~15–30 minutes for the small source edits in B2/B5.
  • Custom framework integration (no CocoaPods): add time to swap the engine framework and verify search paths (B4, Build & packaging).

See the v26.7.1 release notes for the full list of new features and improvements in this release.