Taxi Dispatcher Mobile App Development
A taxi dispatcher application is a real-time dashboard on a smartphone or tablet displaying dozens of drivers simultaneously, order queues, and ride statuses. This application requires higher map rendering performance than driver or passenger apps, with significantly more complex business logic.
Map with Dozens of Moving Markers
Displaying 50-100 driver markers simultaneously is where naive implementations break down. Google Maps SDK and MapKit have performance limitations when constantly updating a large number of markers. On Android, updating 80 markers every 3 seconds via marker.position = newLatLng causes noticeable frame drops on budget devices.
Solutions:
Clustering — merge nearby markers at low zoom levels. Google Maps Utility Library (MarkerClusterManager on Android, GMUClusterManager on iOS) or Supercluster (JavaScript port via React Native Maps). When zooming into a specific area, clusters break down into individual vehicles.
Renderer optimization — use GoogleMap.setOnCameraIdleListener on Android to update only the visible region. Update markers only for drivers within the current VisibleRegion, batch others and update when the map scrolls.
Canvas rendering — for aggressive scaling: Mapbox GL JS (WebView variant) or Mapbox Maps SDK with native layer via SymbolLayer — symbol positions update via GeoJSON source without creating/deleting markers. This is fundamentally faster for 100+ objects.
Order Distribution
The dispatcher can operate in two modes: manual distribution and automation control. In manual mode — the dispatcher sees an order on the map, clicks "assign", and selects a driver from the nearest list (sorted by distance from pickup point via Distance Matrix API or server calculation using PostGIS).
Conflict on simultaneous assignment: two dispatchers assign the same order to different drivers. Optimistic locking on the server (version field on the order) + error message on UI with an option to reload the list.
Offline Mode and Unstable Internet
A dispatcher in a taxi depot may have poor Wi-Fi. WebSocket reconnect with exponential backoff is mandatory. On connection break — show a "no connection" banner, request a state snapshot (all orders, all drivers) on recovery, rather than relying on all missed events coming through the queue.
Notifications and Sound Alerts
New order — sound signal + vibration, even if the app is backgrounded. On iOS: notification content extension for custom notification UI. On Android: NotificationChannel.IMPORTANCE_HIGH + custom sound via Uri resource. The dispatcher tablet should sound like a radio — no system "ding".
Real-time Analytics
A small statistics module right in the app: active drivers count, orders in progress, average wait time. Data from WebSocket events, aggregated locally. No need for separate backend endpoint for each metric — aggregate from the event stream in memory.
Architecture: MVVM or MVI, reactive state (StateFlow / RxSwift), WebSocket via OkHttp (Android) or URLSessionWebSocketTask (iOS), maps — Google Maps SDK or Mapbox. For cross-platform — Flutter with native plugins.
Timeline: 10 to 18 weeks including integration with all system clients. Cost calculated individually.







