Build the Core, extension, Google Maps, and MapLibre XCFrameworks with:
scripts/build-xcframeworks.shPass module names to build a subset, or --all to include every provider:
scripts/build-xcframeworks.sh core geojson
scripts/build-xcframeworks.sh --allArtifacts are written to build/xcframeworks/output. Every MapConductor module is a
separate dynamic framework built with BUILD_LIBRARY_FOR_DISTRIBUTION=YES so the Core
framework is linked only once. Google Maps is statically linked by its upstream Swift
Package; MapLibre remains a dynamic external dependency.
One iOS map API for multiple map providers.
MapConductor iOS SDK is a mapping library for iOS that lets you work with multiple map SDKs through a single, consistent SwiftUI API.
Instead of writing different map code for Google Maps, Mapbox, Apple MapKit, ArcGIS, HERE Maps, and MapLibre, MapConductor provides shared abstractions for maps, camera state, markers, shapes, overlays, and advanced map features.
Write your map UI once. Choose the map provider that fits your product.
Mobile map development often becomes tightly coupled to a specific map SDK. Each provider has its own API design, lifecycle model, rendering behavior, and feature set. This makes it hard to switch providers, support multiple map backends, or keep map-related code clean in a modern SwiftUI application.
MapConductor solves this by providing a common layer on top of major iOS map SDKs.
With MapConductor, you can:
- Use a SwiftUI-first API for map UI
- Switch between supported map providers with less rewrite work
- Share the same marker, circle, polyline, polygon, and overlay logic
- Build provider-independent map features such as heatmaps and marker clustering
- Keep your application code focused on map behavior, not SDK-specific differences
MapConductor currently supports the following iOS map providers:
| Provider | Package | Product |
|---|---|---|
| Google Maps | ios-for-googlemaps | MapConductorForGoogleMaps |
| Mapbox | ios-for-mapbox | MapConductorForMapbox |
| Apple MapKit | ios-for-mapkit | MapConductorForMapKit |
| ArcGIS | ios-for-arcgis | MapConductorForArcGIS |
| HERE Maps | ios-for-here | MapConductorForHERE |
| MapLibre | ios-for-maplibre | MapConductorForMapLibre |
You can choose one provider for your app, or structure your code so that the provider can be changed later.
MapConductor provides a unified API for common map UI and geospatial features:
- Map view components for multiple providers
- Camera state and camera position
- Markers
- Custom marker icons
- Circles with meter-based radius
- Polylines
- Polygons
- Ground images
- Raster tile layers
- Heatmaps
- Marker clustering
- GeoJSON layers
- Shared geometry types such as
GeoPoint - Reactive state management for map objects, built on SwiftUI
The goal is not only to wrap each provider SDK, but also to provide consistent behavior where possible across different map engines.
Add the required packages in Xcode (File → Add Package Dependencies) or directly in your Package.swift:
dependencies: [
.package(url: "https://github.com/MapConductor/ios-sdk-core", from: "1.0.5"),
.package(url: "https://github.com/MapConductor/ios-for-googlemaps", from: "1.0.5"), // or your chosen provider
// Optional feature packages
.package(url: "https://github.com/MapConductor/ios-heatmap", from: "1.0.3"),
.package(url: "https://github.com/MapConductor/ios-marker-clustering", from: "1.0.2"),
.package(url: "https://github.com/MapConductor/ios-geojson-layer", from: "1.0.0"),
],Then add the products to your target:
.target(
name: "YourApp",
dependencies: [
.product(name: "MapConductorCore", package: "ios-sdk-core"),
.product(name: "MapConductorForGoogleMaps", package: "ios-for-googlemaps"),
]
)Each map provider may require its own API key, access token, or Xcode project configuration (such as Info.plist entries). Please check the setup guide for the provider you are using.
The following example shows a simple SwiftUI map with a marker and a circle.
import SwiftUI
import MapConductorCore
import MapConductorForMapKit
struct ContentView: View {
@StateObject private var mapState = MapKitViewState(
cameraPosition: MapCameraPosition(
position: GeoPoint(latitude: 35.6762, longitude: 139.6503),
zoom: 16,
)
)
var body: some View {
MapKitMapView(state: mapState, content : {
Marker(position: GeoPoint(latitude: 35.6762, longitude: 139.6503))
Circle(
center: GeoPoint(latitude: 35.6762, longitude: 139.6503),
radiusMeters: 500,
strokeColor: UIColor.red,
strokeWidth: 2,
fillColor: UIColor.blue.withAlphaComponent(0.5),
)
})
}
}This example uses Google Maps, but the map objects are written using MapConductor concepts. The same overlay logic can be adapted to other supported providers.
One of the main ideas behind MapConductor is that your map overlays should not have to be rewritten when you change map providers.
Simply change the state and view — all overlays work unchanged:
// Google Maps
GoogleMapView(state: googleMapState) { /* overlays */ }
// Mapbox
MapboxMapView(state: mapboxState) { /* overlays */ }
// Apple MapKit
MapKitMapView(state: mapKitState) { /* overlays */ }
// ArcGIS
ArcGISMapView(state: arcgisState) { /* overlays */ }
// HERE Maps
HEREMapView(state: hereMapState) { /* overlays */ }
// MapLibre
MapLibreMapView(state: maplibreState) { /* overlays */ }Your reusable map content can contain markers, circles, polylines, polygons, heatmaps, clusters, or other MapConductor components, regardless of which provider view renders them.
Provider-specific setup is still required, but your application-level map UI can stay much more portable.
| Module | Package | Product | Description |
|---|---|---|---|
ios-sdk-core |
mapconductor-core |
MapConductorCore |
Core abstractions, geometry types, overlay states |
ios-for-googlemaps |
mapconductor-for-googlemaps |
MapConductorForGoogleMaps |
Google Maps provider implementation |
ios-for-mapbox |
ios-for-mapbox |
MapConductorForMapbox |
Mapbox provider implementation |
ios-for-mapkit |
mapconductor-for-mapkit |
MapConductorForMapKit |
Apple MapKit provider implementation |
ios-for-arcgis |
mapconductor-for-arcgis |
MapConductorForArcGIS |
ArcGIS provider implementation |
ios-for-here |
mapconductor-for-here |
MapConductorForHERE |
HERE Maps provider implementation |
ios-for-maplibre |
mapconductor-for-maplibre |
MapConductorForMapLibre |
MapLibre provider implementation |
ios-heatmap |
mapconductor-heatmap |
MapConductorHeatmap |
Provider-independent heatmap overlay |
ios-marker-clustering |
mapconductor-marker-clustering |
MapConductorMarkerClustering |
Marker clustering support |
ios-geojson-layer |
mapconductor-geojson-layer |
MapConductorGeoJSONLayer |
GeoJSON layer support |
| Feature | Google Maps | Mapbox | MapKit | ArcGIS | HERE Maps | MapLibre |
|---|---|---|---|---|---|---|
| Map | ☑ | ☑ | ☑ | ☑ | ☑ | ☑ |
| Marker | ☑ | ☑ | ☑ | ☑ | ☑ | ☑ |
| Circle | ☑ | ☑ | ☑ | ☑ | ☑ | ☑ |
| Polyline | ☑ | ☑ | ☑ | ☑ | ☑ | ☑ |
| Polygon | ☑ | ☑ | ☑ | ☑ | ☑ | ☑ |
| Ground Image | ☑ | ☑ | ☑ | ☑ | ☑ | ☑ |
| Heatmap | ☑ | ☑ | ☑ | ☑ | ☑ | ☑ |
| Marker Clustering | ☑ | ☑ | ☑ | ☑ | ☑ | ☑ |
| Raster Tile Layer | ☑ | ☑ | ☑ | ☑ | ☑ | ☑ |
| Vector Tile Layer | ☐ | ☐ | ☐ | ☐ | ☐ | ☐ |
MapConductor is actively developed. Please check the documentation and release notes for the latest provider-specific behavior and limitations.
MapConductor is useful if you are:
- Building an iOS app with SwiftUI and maps
- Evaluating multiple map providers
- Planning a possible migration from one map SDK to another
- Maintaining map features across different customer or regional requirements
- Building reusable map UI components
- Looking for an open-source abstraction layer for mobile maps
It is especially helpful when you want your application code to describe what should appear on the map, rather than how each provider SDK expects that feature to be implemented.
See samples/MapConductorSampleApp for a full-featured demo app showcasing all modules.
MapConductor iOS SDK is released and under active development.
The project aims to make map development more flexible, portable, and SwiftUI-friendly across major iOS map providers. Some advanced features may still be experimental or may have provider-specific differences.
Feedback, issues, and contributions are welcome.
MapConductor iOS SDK is released under the Apache License 2.0.


