Developing a Taxi Mobile App for Passengers
The address input field is the most frequently used in the app. If autocomplete works slower than 150 ms, the user leaves. The real-time map with moving cars is another pain point: jerky icons cause negative reviews. Payments are the third stumbling block: unreadable errors or long processing lose loyalty. On every project, we encounter these bottlenecks and know how to bypass them. We have accumulated experience on 30+ projects and know how to avoid these problems.
How to Ensure Address Autocomplete within 150 ms?
Google Places Autocomplete API gives quality results, but with high query volume it's expensive. Mapbox Search API is 2-3 times cheaper with comparable quality. For CIS, 2GIS Suggest API is effective. Use sessionToken in Google Places API: one token combines a series of autocompletes plus one Place Details request into one billing session. Without a token, each character is a separate query at full price. Savings can reach $500 per month at 10,000 trips/day. An alternative is Mapbox, which reduces costs by 60-70%.
| API | Speed | Cost per 10,000 requests | Region |
|---|---|---|---|
| Google Places Autocomplete | 150-200 ms | ~$2.83 (without sessionToken) | Worldwide |
| Mapbox Search API | 100-150 ms | ~$1.00 (with package) | Worldwide |
| 2GIS Suggest API | 100-200 ms | Free up to 100,000 requests/day | CIS |
Determining the current location as the pickup point: CLLocationManager / FusedLocationProviderClient with a one-time request (requestLocation() on iOS), then reverse geocoding to get a readable address. Accuracy matters: if reverse geocoding returns "N street" instead of "N street, 15" — the user won't know where the car will arrive.
Why Car Interpolation Is Critical for UX?
Real-time car movement on the map is animation of markers based on received coordinates. A naive implementation: got new coordinate → moved marker. Result: jerky car icons.
The correct implementation is interpolation between points. On iOS: CADisplayLink with calculation of intermediate positions, GMSMarker.position changes smoothly via CABasicAnimation. On Android: ValueAnimator with LatLngInterpolator — animate the LatLng of the marker between previous and new position over the update interval (typically 3-5 seconds). The car icon must also rotate according to the direction of travel: the angle is calculated via Math.atan2 from two consecutive points.
WebSocket or MQTT — for receiving driver coordinates in real time. When entering the background, iOS disconnects WebSocket. When the user returns to the app, a reconnect and a REST request for current positions are needed, otherwise the driver marker remains at the old location. Experience shows that without interpolation, the number of complaints about "frozen" cars increases by 4 times.
How to Solve Notification Delay?
Push notifications: driver accepted → driver en route → driver arrived → trip started → trip completed. Each state has its own text and sound. On iOS, custom sound files are added to the bundle and specified in the APNs payload aps.sound. On Android — NotificationChannel with sound configured via AudioAttributes.
The "driver arrived" notification is especially critical — the user must come out within 2-3 minutes. If push is delayed due to Doze mode, the user is late, the driver leaves, and a bad review follows. For this notification, use high-priority push (APNs apns-priority: 10, FCM priority: high) and duplicate via in-app WebSocket event. This reduces late arrival percentage by 30%.
| Notification Channel | Delay (typical) | Dependency on power saving modes |
|---|---|---|
| APNs High-Priority | 1-3 seconds | Low |
| FCM High-Priority | 1-5 seconds | Medium (Doze) |
| In-app WebSocket | < 1 second | None (foreground only) |
Payments Without Headache
Stripe SDK (iOS, Android) is the standard for international projects. PaymentSheet — ready UI with support for Apple Pay, Google Pay, cards. Integration takes 1-2 days. For Russia/CIS — YooKassa (Yandex.Kassa) or CloudPayments SDK.
Apple Pay requires a separate entitlement (com.apple.developer.in-app-payments) and registered merchant ID in Apple Developer Portal. Google Pay — declaration in AndroidManifest.xml and passing production access review from Google.
Payment errors must give understandable text, not a code like card_declined_insufficient_funds. Stripe returns a decline_code — we map it to human-readable messages in all app languages. We guarantee that the user will never see a technical error code.
Stages and Timeline
- Requirements audit — 1-2 days
- Passenger flow design — 3-5 days
- Map and geocoding integration — 5-7 days
- Real-time tracking — 7-10 days
- Payment module — 3-5 days
- Push notifications — 2-3 days
- Testing (including edge cases) — 5-7 days
- Publication on App Store and Google Play — 3-5 days
Timeline: 8 to 14 weeks. Cost is calculated individually after requirements analysis.
What Is Included?
- App source code in Swift/Kotlin/Flutter with full strict mode
- API integration documentation (maps, payments, notifications)
- Deployment and store publication instructions
- Consultation on passing App Store Review Guidelines and Google Play Policy
- 30-day warranty support after launch (bug fixes, consultations)
Get a consultation — contact us to discuss your project. Order your taxi mobile app development today.







