Mobile App for Car Rental
A car rental app combines geolocation, document workflows, payment system, and IoT integration with the vehicle itself. The last point is where most MVPs break: unlocking a car with a smartphone sounds simple, practically — it's BLE, NFC, or telematics box with unstable GPRS.
Map with Available Vehicles
User opens map and sees available cars within radius. Markers with model icon, on tap — card: photo, mileage, fuel/battery level (for EVs), price per hour/day.
Clustering mandatory for cities with large fleet. Mapbox SymbolLayer + SymbolClustering or Google Maps MarkerClusterManager. On zoom-in, cluster expands to individual markers.
Filters: car class, fuel type, capacity, special options (child seat, AC). Filtering on server via query params, client only displays result.
Driver Verification
Before first ride — upload driver's license and passport. Document shot directly from app (not gallery — to prevent fakes). CameraX / AVCaptureSession with document detection via MLKit Document Scanner (Android) or Vision + VNDetectRectanglesRequest (iOS) for auto-cropping.
Data verification — on service side: Sumsub, Onfido or similar. Third-party KYC services with SDK for integration — no need to implement OCR and liveness-check yourself.
Verification status displayed in profile. Until verified — rental button blocked with explanation.
Unlocking Car from Smartphone
Three approaches depending on budget and fleet:
| Method | Range | Reliability | Car Requirements |
|---|---|---|---|
| BLE (Bluetooth Low Energy) | 5-15 meters | High | BLE module (install) |
| NFC | Up to 10 cm | Very High | NFC tag |
| Telematics (GPRS/LTE) | Any distance | Network-dependent | Telematics box |
BLE: CoreBluetooth (iOS) / Android BluetoothGatt. App discovers device with needed UUID service, sends encrypted command to unlock characteristic. Issues: Bluetooth off on user (need check and request to enable), iOS requires NSBluetoothAlwaysUsageDescription, 1-3 second connection delay.
Telematics: command goes via server → MQTT/HTTP → telematics box → lock relay. Client waits for execution confirmation. Timeout 10-15 seconds (GPRS slow), spinner with explanation. If command not confirmed — show error, don't auto-retry (car might unlock with delay).
Vehicle Handover Document
Before ride, driver photos vehicle from all sides directly in app. Minimum 4 photos (front, rear, left side, right side). Geotag and timestamp mandatory. Photos uploaded to server, digital handover document generated.
Custom camera overlay: corner markings where car should be placed, green "good" / red "move" indicator. Implemented via AVCaptureVideoPreviewLayer with CALayer overlay or CameraX + custom PreviewView.
Booking and Payment
Rental time selection: date/time picker with availability zone support (car occupied 2-6 PM — can't select those hours). UIDatePicker / Material DateRangePicker or custom calendar.
Card pre-authorization: Stripe PaymentIntent with capture_method: manual — funds reserved, charged after rental completion with actual calculation by time and mileage. Deposit — separate PaymentIntent.
Timeline: 10 to 18 weeks. Cost calculated individually.







