GPS and geolocation services in mobile apps are APIs for determining the physical location of a device using satellites, Wi-Fi, and mobile networks. According to the Google Android Location Guide (2025), over 60% of mobile apps use location data for content personalization. The Fused Location Provider on Android combines multiple sources to improve accuracy and reduce power consumption.
Key Takeaways
GPS (Global Positioning System) is a satellite navigation system consisting of 31 active satellites in orbit at an altitude of approximately 20,200 km. On mobile devices, the GPS chip receives signals from satellites and calculates coordinates based on trilateration — measuring the signal travel time from multiple satellites. Geolocation services in mobile OSes add data from Wi-Fi access points and cell towers to GPS for faster positioning (A-GPS) and improved accuracy indoors. According to GPS.gov (2024), civilian GPS accuracy is 3-5 meters in clear sky conditions and up to 15 meters in dense urban areas.
Modern mobile devices support not only the American GPS system but also other global navigation satellite systems: Russia’s GLONASS (24 satellites), Europe’s Galileo (28 satellites), and China’s BeiDou. Support for multiple systems simultaneously improves accuracy and speed of positioning — the device can use up to 40 satellites from different systems to calculate its position. On iOS and Android, satellite system selection is handled automatically at the hardware chip level, and developers do not need to manage this.
The process of determining location on a mobile device consists of several stages: collecting data from sources (satellites, Wi-Fi, cells), filtering and correcting errors, calculating coordinates, and delivering the result to the app. The operating system manages this process through a unified geolocation service that optimizes all sources for battery savings. Below are the three main sources of location data.
Satellite navigation provides maximum accuracy (3-5 meters) but requires a clear view of the sky. Indoors or in dense urban areas, the GPS signal may be weakened or completely lost. Time to First Fix (TTFF) is 30-60 seconds for a cold start and 5-10 seconds for a hot start. A-GPS (Assisted GPS) speeds up the start by downloading satellite ephemeris data via the internet instead of waiting for data from the satellites.
Wi-Fi positioning uses a database of MAC addresses of access points with known coordinates. Accuracy is 10-50 meters within Wi-Fi coverage. Cell towers provide accuracy from 100 meters to several kilometers depending on tower density. Combining all sources (Fused Location) allows obtaining coordinates with reasonable accuracy at minimal power consumption — especially when the GPS chip is turned off or satellite signals are unavailable.
On both platforms, geolocation services are implemented through system APIs with varying degrees of abstraction. Android uses FusedLocationProviderClient from Google Play Services, iOS uses CLLocationManager from Core Location. Both APIs allow requesting a one-time position or subscribing to regular updates. Below is an example of obtaining coordinates on Android using the Fused Location Provider in Kotlin.
val fusedClient = LocationServices.getFusedLocationProviderClient(this)
val locationRequest = LocationRequest.Builder(
Priority.PRIORITY_HIGH_ACCURACY
)
.setIntervalMillis(5000)
.setMinUpdateIntervalMillis(2000)
.build()
val locationCallback = object : LocationCallback() {
override fun onLocationResult(result: LocationResult) {
result.lastLocation?.let { location ->
Log.d("Location", "Lat: ${location.latitude}, Lng: ${location.longitude}")
}
}
}
if (checkLocationPermission()) {
fusedClient.requestLocationUpdates(
locationRequest, locationCallback,
Looper.getMainLooper()
)
}
In the example, LocationRequest is configured with PRIORITY_HIGH_ACCURACY — this enables GPS for maximum accuracy. setIntervalMillis sets the desired update interval (5 seconds), setMinUpdateIntervalMillis sets the minimum interval (2 seconds). The onLocationResult callback is invoked each time the system receives new coordinates. It is important to check the permission before calling requestLocationUpdates — otherwise the app will crash with a SecurityException.
import CoreLocation
let locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestWhenInUseAuthorization()
locationManager.startUpdatingLocation()
// MARK: - CLLocationManagerDelegate
func locationManager(
_ manager: CLLocationManager,
didUpdateLocations locations: [CLLocation]
) {
guard let location = locations.last else { return }
print("Location: \(location.coordinate.latitude), \(location.coordinate.longitude)")
}
On iOS, desiredAccuracy determines the request accuracy: kCLLocationAccuracyBest uses all available sources (GPS + Wi-Fi + cells). After requesting permission via requestWhenInUseAuthorization, the system shows a dialog to the user. The didUpdateLocations delegate receives an array of CLLocation objects with coordinates, altitude, speed, and course. To stop updates, call stopUpdatingLocation to save battery power.
Access to geolocation requires explicit user permission on both platforms. On Android, the permissions ACCESS_FINE_LOCATION (GPS) and ACCESS_COARSE_LOCATION (Wi-Fi/cells) are used. Starting from Android 10, background access requires a separate permission ACCESS_BACKGROUND_LOCATION. On iOS, three levels are available: requestWhenInUseAuthorization (only when the app is active), requestAlwaysAuthorization (in the background), and temporary timestamps for precise positioning. Apple requires a mandatory description in Info.plist: NSLocationWhenInUseUsageDescription or NSLocationAlwaysAndWhenInUseUsageDescription. Without these keys, the permission request is ignored.
Continuous use of GPS significantly drains the battery — up to 30% per hour of continuous operation at maximum accuracy. To optimize power consumption, it is recommended to use geolocation only when necessary and stop updates when the app goes into the background. On Android, FusedLocationProviderClient automatically switches between GPS and network sources depending on availability and request priority. On iOS, use the significant-change location service (startMonitoringSignificantLocationChanges) for updates with minimal power consumption — accuracy is lower (up to 500 meters), but battery is barely drained. Also practice batch processing: collect coordinates at 5-10 minute intervals and send them to the server in one request via WorkManager on Android or BGTaskScheduler on iOS. Reducing request frequency from 1 second to 30 seconds reduces geolocation power consumption by 85%.
Geolocation is used in a wide range of mobile apps: from navigators to delivery services. The most common scenarios include displaying the user on a map, geotargeting ads, tracking couriers, geofencing for push notifications, and fitness activity tracking. Each scenario requires its own approach to accuracy and update frequency. Below is a table with configuration recommendations for different app types.
| App Type | Accuracy | Interval | Background Mode |
|---|---|---|---|
| Navigation | HIGH (GPS) | 1-2 sec | Yes |
| Delivery | BALANCED (GPS+Wi-Fi) | 10-30 sec | Yes |
| Weather | LOW (Wi-Fi/cells) | Once | No |
| Social Network | BALANCED | On open | No |
| Fitness | HIGH (GPS) | 5-10 sec | Yes |
When designing geolocation functionality, it is important to consider that users may revoke permission at any time through system settings. The app should properly handle situations where geolocation is unavailable and show a clear explanation of why the functionality is limited.
Geofencing is a technology for creating virtual boundaries on a map. When these boundaries are crossed, the app receives a notification. On Android, geofences are implemented through GeofencingClient from Google Play Services, on iOS — through CLCircularRegion from Core Location. When entering or leaving a zone, the system wakes the app and sends an event even if the app is closed or minimized. This is used for push notifications when approaching a store, location-based task reminders, and IoT device automation. The maximum number of geofences is limited: 100 on Android, 20 on iOS simultaneously. The minimum zone radius is 50 meters on both platforms — otherwise the system may not trigger due to location determination inaccuracies. When entering a zone, the system starts an Intent on Android or calls the locationManager:didEnterRegion delegate on iOS.
Frequently Asked Questions
GPS in a smartphone is a built-in receiver of satellite navigation system signals that determines coordinates with an accuracy of 3-5 meters. Devices also support GLONASS, Galileo, and BeiDou for improved accuracy and positioning speed.
GPS is only a satellite method of determining coordinates. Geolocation services combine GPS, Wi-Fi positioning, and cell tower data for faster and more energy-efficient location determination, especially indoors.
Call requestWhenInUseAuthorization() or requestAlwaysAuthorization() on a CLLocationManager instance. First, add NSLocationWhenInUseUsageDescription to Info.plist with a clear explanation of why geolocation is needed.
Use FusedLocationProviderClient on Android and the significant-change location service on iOS. Increase the interval between requests to 10-30 seconds, disable updates when the screen is off, and apply batch sending of coordinates to the server.
Yes, without GPS you can determine approximate location using Wi-Fi access points (accuracy 10-50 meters) or cell towers (accuracy 100-5000 meters). On Android, ACCESS_COARSE_LOCATION is used for this.
Summary
We will develop a mobile application turnkey
IT Sectr creates iOS and Android applications for startups and businesses since 2017. We will advise you and propose the best solution.
Read also