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:
- Raise the deployment target to iOS 16.0 — in both your Xcode target and your
Podfile:ruby # Podfile platform :ios, '16.0' - Update the pods / frameworks so the renamed engine framework is pulled in (see B4):
bash pod install --repo-update - 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 MapstedCpp → MapstedCoreEngine |
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_SENSORS → MISSING_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
MNEngineMapPolylinevalues:
// 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 MapstedCpp → MapstedCoreEngine
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 insideMapstedCore.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_SENSORS → MISSING_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
- [ ] Set Xcode deployment target and
Podfileplatform to16.0. - [ ] Confirm you are on Xcode 26.3+ (Swift 6 toolchain).
- [ ] Run
pod install --repo-update; the renamed engine ships insideMapstedCore— nothing extra to add (B4). - [ ] Rename
MISSING_INTERTIAL_SENSORS→MISSING_INERTIAL_SENSORSif referenced (B7). - [ ] If you construct
MNRoutein Swift, changestartWaypoint:→start:(B5). - [ ] Remove references to
MNPropertyPolylines/MNBuildingPolylines(B2) andMNTestingModuleMapManager(B3). - [ ] If you build geofence triggers in code, rename the
Cpp*builder/criteria types toCoreEngine*(B8). - [ ] 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
MNRouteconstruction, no dead-API usage): ~15–30 minutes — deployment target,pod install, Xcode toolchain, rebuild. - App that constructs
MNRoutein 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.