Taxi Passenger Mobile App Development
Passenger app for taxi — interface with which end user interacts. Poor UX here kills conversion, technical errors become 1-star App Store reviews. Main difficulty — real-time map with moving objects, accurate address selection, reliable payment.
Address input and geocoding
Address input field — most frequently used in app. Autocomplete must work with latency under 150-200 ms, else user leaves before third character. Google Places Autocomplete API gives quality results, but expensive at high volume. Alternatives: Mapbox Search API, Nominatim (OpenStreetMap, free but slower), 2GIS Suggest API for CIS.
Important nuance: sessionToken in Google Places API. One token groups series of autocompletes + one Place Details request into one billing session. Without token each character — separate full-price request. Implementation without sessionToken at 10,000 trips/day gives 5-10x bigger bill.
Setting current location as pickup point: CLLocationManager / FusedLocationProviderClient with single request (requestLocation() on iOS), then reverse geocoding for readable address. Accuracy matters: if reverse geocoding returns "Street N" instead of "Street N, 15" — user doesn't know where car arrives.
Map with driver display
Real-time vehicle movement on map — marker animation by received coordinates. Naive: got new coordinate → moved marker. Result — jerking car icons.
Right implementation — interpolation between points. On iOS: CADisplayLink with intermediate position calculation, GMSMarker.position changes smoothly via CABasicAnimation. On Android: ValueAnimator with LatLngInterpolator — animate LatLng marker between previous and new position over time equal to update interval (usually 3-5 seconds). Car icon should also rotate by movement direction: angle via Math.atan2 on two sequential points.
WebSocket or MQTT — for receiving driver coordinates in real time. iOS disconnects WebSocket on backgrounding. When user returns — need reconnect and actual position request via REST, else driver marker stays on old place.
Payment
Stripe SDK (iOS, Android) — standard for international projects. PaymentSheet — ready UI with Apple Pay, Google Pay, cards. Integration takes 1-2 days. For Russia/CIS — ЮKassa (Yandex.Kassa) or CloudPayments SDK.
Apple Pay requires separate entitlement (com.apple.developer.in-app-payments) and registered merchant ID in Apple Developer Portal. Google Pay — declaration in AndroidManifest.xml and production access review from Google.
Payment error must give clear text, not card_declined_insufficient_funds. Stripe returns decline_code — need to map to human-readable messages in all app languages.
Trip status notifications
Pushes: driver accepted → driver en route → driver arrived → trip started → trip completed. Each state — own text and sound. On iOS custom sound files added to bundle specified in APNs payload aps.sound. On Android — NotificationChannel with sound setup via AudioAttributes.
"Driver arrived" notification especially critical — user must leave in 2-3 minutes. If push delayed by Doze mode — user late, driver leaves, bad review. For this notification use high-priority push (APNs apns-priority: 10, FCM priority: high) and duplicate via in-app WebSocket event.
Stages and timeline
Requirements audit → passenger flow design → maps and geocoding integration → real-time tracking → payment module → push notifications → testing (including edge cases: no geolocation, no internet, payment declined) → App Store and Google Play publishing.
Timeline: 8 to 14 weeks. Cost calculated individually after requirements analysis.







