MapplsCamera SDK is a powerful, ready-to-use camera unit for iOS that automatically captures and embeds rich geospatial metadata into photos and videos. It handles complex tasks like reverse geocoding, GPS overlay rendering, and EXIF/XMP metadata management, allowing you to integrate high-quality, geotagged media capture with minimal effort.
- Rich Geotagged Photos: Captures images with configurable GPS/Address/Timestamp overlays
- Geotagged Video Recording: Records video with real-time location metadata updates
- QR Code Scanning: Built-in QR mode for asset identification or URL scanning
- Mappls PIN Integration: Automatically retrieves Mappls PINs (eLocs) for capture locations
- Advanced Metadata: Embeds metadata into EXIF, XMP (custom namespace), and IPTC headers
- Deeply Customizable: Extensive UI configuration options for overlays, branding, and camera controls
- Developer Friendly: Robust delegate-based event handling and error reporting
This library depends upon several Mappls's own libraries. All dependent libraries will be automatically installed using Swift Package Manager.
Below are list of dependencies which are required to run this SDK:
- MapplsAPICore - Authorization and Authentcation
- MapplsAPIKit - Core API functionality
- MapplsMap - Map display and location services
To add a package dependency to your Xcode project, select File > Swift Packages > Add Package Dependency and enter repository URL. See Adding Package Dependencies to Your App.
https://github.com/mappls-api/mappls-camera-ios-distribution.git
| Version | Dated | Description |
|---|---|---|
1.0.1 |
06 Jun 2026 | Initial release with geotagged photo and video capture capabilities |
- iOS: 13.0 or higher
- Xcode: 14.0 or higher
- Mappls API Keys: You must have a valid Mappls API key to use the location and mapping features
It is required to set Mappls keys to use any Mappls SDK. Please refer the documentation here
Ensure you add the following keys to your app's Info.plist to request necessary permissions:
| Key | Description |
|---|---|
NSCameraUsageDescription |
Required for taking photos and recording videos |
NSMicrophoneUsageDescription |
Required for recording audio in videos |
NSLocationWhenInUseUsageDescription |
Required to geotag your media and show your location on the map |
NSPhotoLibraryUsageDescription |
Required if saveToDeviceGallery is enabled |
NSPhotoLibraryAddUsageDescription |
Required to save captured media to the user's gallery |
import MapplsCameralet cameraVC = MapplsCameraViewController()
cameraVC.cameraDelegate = self
cameraVC.modalPresentationStyle = .fullScreen
self.present(cameraVC, animated: true)extension YourViewController: MapplsCameraDelegate {
func mapplsCamera(_ controller: MapplsCameraViewController, didCaptureImage result: MapplsCameraResult) {
print("Captured image at: \(result.filePath)")
print("Location: \(result.latitude), \(result.longitude)")
controller.dismiss(animated: true)
}
func mapplsCamera(_ controller: MapplsCameraViewController, didRecordVideo result: MapplsCameraResult) {
print("Recorded video at: \(result.filePath)")
controller.dismiss(animated: true)
}
func mapplsCameraDidCancel(_ controller: MapplsCameraViewController) {
controller.dismiss(animated: true)
}
func mapplsCamera(_ controller: MapplsCameraViewController, didUpdateLocation latitude: Double, longitude: Double, accuracy: Float) {
// Handle real-time location updates
}
func mapplsCamera(_ controller: MapplsCameraViewController, didFailWithError error: MapplsCameraError) {
print("SDK Error: \(error.localizedDescription)")
}
func mapplsCamera(_ controller: MapplsCameraViewController, didLoadNearbyPINs pins: [MapplsNearbyPIN]) {
// Handle nearby places/PINs
}
}The package includes multiple ways to test and use the SDK:
Sample code is available as a library for integration:
import MapplsCamera
import MapplsCameraSample
// Use the sample view controller
let sampleVC = SampleCameraViewController()
present(sampleVC, animated: true)
// Or use configuration presets
let cameraVC = CameraConfigurations.photoOnly()
cameraVC.cameraDelegate = self
present(cameraVC, animated: true)Pre-built configurations for common use cases:
| Method | Description | Use Case |
|---|---|---|
basic() |
Default settings | Quick start |
photoOnly() |
Photo mode only | Image documentation |
videoOnly() |
Video mode only | Video surveys |
highAccuracy() |
Requires GPS ≤10m | Precision mapping |
fieldSurvey() |
All metadata + grid | Field work |
qrScanner() |
QR code mode | Asset tracking |
highQuality() |
4K, max quality | Professional use |
minimalUI() |
Hidden controls | Embedded use |
privacyFocused() |
Minimal metadata | Privacy apps |
| Guide | Time | Best For |
|---|---|---|
| RUN_EXECUTABLE_SAMPLE.md | 5 min | See all features immediately |
| QUICK_START_SAMPLE.md | 5 min | First-time integration |
| HOW_TO_RUN_SAMPLE.md | 10 min | Complete integration guide |
| SAMPLE_USAGE.md | 15 min | Detailed usage examples |
MapplsCameraViewController provides a wide range of properties to customize the capture experience.
| Property | Type | Default | Description |
|---|---|---|---|
minimumAccuracyMetres |
Float |
50.0 |
Minimum GPS accuracy required to allow capture |
blockCaptureOnPoorAccuracy |
Bool |
false |
If true, prevents capture when accuracy is worse than threshold |
saveToDeviceGallery |
Bool |
true |
Automatically save captured media to the iOS Photo Library |
enablePinchToZoom |
Bool |
true |
Enable or disable the pinch-to-zoom gesture |
maxZoomFactor |
Float |
8.0 |
Maximum zoom level allowed |
| Property | Type | Default | Description |
|---|---|---|---|
isFlashButtonHidden |
Bool |
false |
Hide the flash toggle button |
isLocationPickerButtonHidden |
Bool |
false |
Hide the nearby places / location picker button |
isMuteButtonHidden |
Bool |
false |
Hide the audio mute button in video mode |
isGalleryButtonHidden |
Bool |
false |
Hide the gallery / album shortcut button |
isSwitchCameraButtonHidden |
Bool |
false |
Hide the front/rear camera switch button |
isQRScanModeHidden |
Bool |
false |
Hide the QR scan mode toggle |
isVideoModeEnable |
Bool |
false |
Disable video recording mode |
isPhotoModeEnable |
Bool |
false |
Disable photo capture mode |
allowModeSwitching |
Bool |
true |
Show/hide the mode selector (Photo/Video/QR) |
| Property | Type | Default | Description |
|---|---|---|---|
showAddressOverlay |
Bool |
true |
Display reverse geocoded address on media |
showCoordinatesOverlay |
Bool |
true |
Display Latitude/Longitude on media |
showDateTimeOverlay |
Bool |
true |
Display capture timestamp on media |
showMapThumbnail |
Bool |
true |
Display a map preview of the location |
showElocationOverlay |
Bool |
true |
Display the Mappls PIN (eLoc) on media |
showQRCodeOverlay |
Bool |
true |
Display a QR code containing location info |
showAccuracyIndicator |
Bool |
true |
Show GPS accuracy value on the overlay |
showAltitudeOverlay |
Bool |
false |
Show altitude (elevation) on the overlay |
showCompassBearingOverlay |
Bool |
false |
Show compass heading on the overlay |
showMapplsLogo |
Bool |
true |
Show the Mappls watermark logo |
showGridLines |
Bool |
false |
Display 3x3 grid lines for composition |
| Property | Type | Default | Description |
|---|---|---|---|
overlayPosition |
Enum |
.bottom |
Position of the metadata view (.top or .bottom) |
overlayOpacity |
Float |
0.8 |
Background opacity of the metadata overlay (0.0 to 1.0) |
overlayBackgroundColour |
UIColor |
.white |
Background color of the metadata overlay |
overlayTextColour |
UIColor |
.black |
Color of the text in the metadata overlay |
overlayCornerRadius |
Float |
8.0 |
Corner radius for the metadata overlay background |
mapThumbnailStyle |
Enum |
.standard |
Style of the map thumbnail (.standard, .satellite, .hybrid) |
brandingLogo |
UIImage? |
nil |
Custom logo image to display on the metadata overlay |
| Property | Type | Default | Description |
|---|---|---|---|
cameraFacing |
Enum |
.rear |
Initial camera to use (.front or .rear) |
defaultMediaMode |
Enum |
.photo |
Initial capture mode (.photo, .video, .qr) |
imageOutputFormat |
Enum |
.jpeg |
Format for saved photos (.jpeg or .png) |
imageCompressionQuality |
Float |
0.92 |
Compression quality for JPEG (0.0 to 1.0) |
videoResolution |
Enum |
.hd1080p |
Quality for video (.hd720p, .hd1080p, .uhd4k) |
timerDelay |
Enum |
.none |
Countdown delay (.none, .threeSeconds, .tenSeconds) |
maxVideoDuration |
Int |
0 |
Maximum recording time in seconds (0 = unlimited) |
videoOverlayRefreshInterval |
Int |
5 |
How often (in seconds) to update GPS info during video |
| Property | Type | Default | Description |
|---|---|---|---|
addressLanguage |
String |
"en" |
Language for reverse geocoded addresses (e.g., "en", "hi") |
The result object passed to delegate methods contains comprehensive metadata:
| Property | Type | Description |
|---|---|---|
mediaType |
Enum |
.image or .video |
filePath |
String |
Local path to the captured file |
latitude |
Double |
Decimal latitude coordinate |
longitude |
Double |
Decimal longitude coordinate |
formattedAddress |
String |
Human-readable reverse geocoded address |
eloc |
String |
Mappls unique identifier for the location |
timestampFormatted |
String |
Formatted date and time string |
accuracyMetres |
Float |
GPS horizontal accuracy at time of capture |
cameraFacing |
Enum |
.front or .rear |
tamperHash |
String |
A digital signature to verify media integrity |
Implement the delegate method to handle potential issues:
func mapplsCamera(_ controller: MapplsCameraViewController, didFailWithError error: MapplsCameraError) {
switch error {
case .cameraPermissionDenied:
// Handle no camera access
case .locationPermissionDenied:
// Handle no location access
case .poorAccuracy:
// GPS accuracy was below minimumAccuracyMetres threshold
default:
print("SDK Error: \(error.localizedDescription)")
}
}- API Configuration Guide: API_CONFIGURATION.md
- Dependencies Information: DEPENDENCIES.md
- Integration Guide: INTEGRATION_GUIDE.md
- Mappls API Console: https://apis.mappls.com/console/
For any queries and support, please contact:
Email us at apisupport@mappls.com
Support
Need support? contact us!


















