GPS и услугите за геолокация в мобилни приложения — са API за определяне на физическото местоположение на устройството с помощта на сателити, Wi-Fi и мобилни мрежи. Според данни от Google Android Location Guide (2025), над 60% от мобилните приложения използват данни за местоположение за персонализиране на съдържание. Fused Location Provider на Android обединява няколко източника за повишаване на точността и намаляване на консумацията на енергия.
Основни точки
GPS (Global Positioning System) — е сателитна навигационна система, състояща се от 31 активни сателита в орбита на височина приблизително 20 200 km. На мобилни устройства GPS чипът приема сигнали от сателити и изчислява координати на базата на трилатерация — измерване на времето за разпространение на сигнала от няколко сателита. Услугите за геолокация в мобилните операционни системи добавят към GPS данни от Wi-Fi точки за достъп и клетъчни кули за ускоряване на определянето на координати (A-GPS) и подобряване на точността на закрито. Според данни на GPS.gov (2024), точността на гражданския GPS е 3-5 метра при ясно небе и до 15 метра в условия на гъста застройка.
Съвременните мобилни устройства поддържат не само американската GPS система, но и други глобални навигационни системи: руската GLONASS (24 сателита), европейската Galileo (28 сателита) и китайската BeiDou. Едновременната поддръжка на няколко системи повишава точността и скоростта на определяне на координати — устройството може да използва до 40 сателита от различни системи за изчисляване на позиция. На iOS и Android изборът на сателитна система става автоматично на ниво хардуерен чип, разработчикът не трябва да управлява това.
Процесът на определяне на местоположение на мобилно устройство се състои от няколко етапа: събиране на данни от източници (сателити, Wi-Fi, мобилни мрежи), филтриране и корекция на грешки, изчисляване на координати и предаване на резултата на приложението. Операционната система управлява този процес чрез единна услуга за геолокация, която оптимизира работата на всички източници за пестене на батерия. По-долу са описани трите основни източника на данни за местоположение.
Сателитната навигация осигурява максимална точност (3-5 метра), но изисква пряка видимост към небето. На закрито или в гъста градска среда GPS сигналът може да бъде отслабен или напълно загубен. Времето за първото определяне на позиция (TTFF) е 30-60 секунди при студен старт и 5-10 секунди при горещ старт. A-GPS (Assisted GPS) ускорява старта чрез изтегляне на ефемериди на сателити през интернет вместо изчакване на данни от сателитите.
Wi-Fi позиционирането използва база данни с MAC адреси на точки за достъп с известни координати. Точността е 10-50 метра в обхвата на Wi-Fi. Клетъчните кули дават точност от 100 метра до няколко километра в зависимост от гъстотата на кулите. Комбинацията от всички източници (Fused Location) позволява получаване на координати с разумна точност при минимална консумация на енергия — особено когато GPS чипът е изключен или сателитният сигнал не е наличен.
На двете платформи услугите за геолокация са имплементирани чрез системни API с различна степен на абстракция. Android използва FusedLocationProviderClient от Google Play Services, iOS — CLLocationManager от Core Location. И двата API позволяват искане на еднократна позиция или абонамент за редовни актуализации. По-долу е даден пример за получаване на координати на Android с помощта на Fused Location Provider на 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("Местоположение", "Lat: ${location.latitude}, Lng: ${location.longitude}")
}
}
}
if (checkLocationPermission()) {
fusedClient.requestLocationUpdates(
locationRequest, locationCallback,
Looper.getMainLooper()
)
}
В примера LocationRequest се конфигурира с приоритет HIGH_ACCURACY — това включва GPS за максимална точност. setIntervalMillis задава желания интервал за актуализиране (5 секунди), setMinUpdateIntervalMillis — минималния (2 секунди). Callback onLocationResult се извиква всеки път, когато системата получи нови координати. Важно е да проверите разрешението преди да извикате requestLocationUpdates — в противен случай приложението ще падне с 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)")
}
На iOS desiredAccuracy определя точността на заявката: kCLLocationAccuracyBest използва всички налични източници (GPS + Wi-Fi + мобилни мрежи). След искане на разрешение чрез requestWhenUseAuthorization системата показва диалог на потребителя. Делегатът didUpdateLocations получава масив от CLLocation обекти с координати, надморска височина, скорост и посока. За спиране на актуализациите се извиква stopUpdatingLocation за пестене на батерия.
Достъпът до геолокация изисква изрично разрешение от потребителя на двете платформи. На Android се използват разрешенията ACCESS_FINE_LOCATION (GPS) и ACCESS_COARSE_LOCATION (Wi-Fi/мобилни мрежи). От Android 10 нататък, фонов достъп изисква отделно разрешение ACCESS_BACKGROUND_LOCATION. На iOS са достъпни три нива: requestWhenInUseAuthorization (само когато приложението е активно), requestAlwaysAuthorization (на заден план) и времеви печати за точно позициониране. Apple изисква задължително описание в Info.plist: NSLocationWhenInUseUsageDescription или NSLocationAlwaysAndWhenInUseUsageDescription. Без тези ключове искането за разрешение се игнорира.
Непрекъснатото използване на GPS значително намалява живота на батерията — до 30% на час непрекъсната работа на максимална точност. За оптимизиране на консумацията на енергия се препоръчва използване на геолокация само когато е необходимо и спиране на актуализациите, когато приложението премине на заден план. На Android FusedLocationProviderClient автоматично превключва между GPS и мрежови източници в зависимост от наличността и приоритета на заявката. На iOS използвайте significant-change location service (startMonitoringSignificantLocationChanges) за актуализации с минимална консумация на енергия — точността е по-ниска (до 500 метра), но батерията почти не се изтощава. Също така прилагайте пакетна обработка: събирайте координати на интервали от 5-10 минути и ги изпращайте на сървъра с една заявка чрез WorkManager на Android или BGTaskScheduler на iOS. Намаляването на честотата на заявките от 1 секунда на 30 секунди намалява консумацията на енергия за геолокация с 85%.
Геолокацията се използва в широк спектър от мобилни приложения: от навигатори до услуги за доставка. Най-честите сценарии включват показване на потребителя на картата, геотаргетиране на реклами, проследяване на куриери, геозони за push известия и проследяване на фитнес активност. Всеки сценарий изисква свой подход към точността и честотата на актуализациите. По-долу е таблица с препоръки за конфигуриране за различни типове приложения.
| Тип приложение | Точност | Интервал | Фонов режим |
|---|---|---|---|
| Навигатор | HIGH (GPS) | 1-2 сек | Да |
| Доставка | BALANCED (GPS+Wi-Fi) | 10-30 сек | Да |
| Време | LOW (Wi-Fi/мобилни мрежи) | Еднократно | Не |
| Социална мрежа | BALANCED | При отваряне | Не |
| Фитнес | HIGH (GPS) | 5-10 сек | Да |
При проектирането на функционалност за геолокация е важно да се вземе предвид, че потребителите могат по всяко време да оттеглят разрешението чрез системните настройки. Приложението трябва правилно да обработва ситуацията, когато геолокацията не е налична, и да показва разбираемо обяснение защо функционалността е ограничена.
Geofencing — технология за създаване на виртуални граници на картата, при пресичането на които приложението получава известие. На Android геозоните се имплементират чрез GeofencingClient от Google Play Services, на iOS — чрез CLCircularRegion от Core Location. При влизане или излизане от зона системата събужда приложението и изпраща събитие, дори ако приложението е затворено или минимизирано. Това се използва за push известия при приближаване до магазин, напомняния за задачи на база местоположение и автоматизация на IoT устройства. Максималният брой геозони е ограничен: на Android — 100, на iOS — 20 едновременно. Минималният радиус на зоната е 50 метра на двете платформи, в противен случай системата може да не реагира поради грешка в определянето на местоположение. При влизане в зона системата стартира Intent на Android или извиква делегата locationManager:didEnterRegion на iOS.
Често задавани въпроси
GPS в смартфона е вграден приемник на сигнали от сателитната навигационна система, който определя координати с точност 3-5 метра. На устройствата са достъпни също GLONASS, Galileo и BeiDou за повишаване на точността и скоростта на позициониране.
GPS е само сателитният метод за определяне на координати. Услугите за геолокация обединяват GPS, Wi-Fi позициониране и данни от клетъчни кули за по-бързо и енергийно ефективно определяне на местоположение, особено на закрито.
Извикайте requestWhenInUseAuthorization() или requestAlwaysAuthorization() на инстанция на CLLocationManager. Преди това добавете NSLocationWhenInUseUsageDescription в Info.plist с разбираем текст на причината за използване на геолокация.
Използвайте FusedLocationProviderClient на Android и significant-change location service на iOS. Увеличете интервала между заявките до 10-30 секунди, изключете актуализациите, когато екранът е изключен, и приложете пакетно изпращане на координати до сървъра.
Да, без GPS може да се определи приблизително местоположение чрез Wi-Fi точки за достъп (точност 10-50 метра) или клетъчни кули (точност 100-5000 метра). На Android за това се използва ACCESS_COARSE_LOCATION.
Резюме
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също