Location Permission je oprávnění, které mobilní aplikace žádá od uživatele pro přístup k údajům o jeho geografické poloze. Bez tohoto oprávnění aplikace nemůže určit souřadnice zařízení, a tedy nemůže poskytovat funkce geolokace. Podle Apple Developer Documentation, 2024 jsou všechny aplikace používající lokalizační služby povinny žádat o výslovný souhlas uživatele prostřednictvím systémového dialogu.
Hlavní body
Location Permission je mechanismus operačního systému, který reguluje přístup aplikací k údajům o geografické poloze zařízení. Bez výslovného souhlasu uživatele aplikace nemůže získat GPS souřadnice, údaje o Wi-Fi sítích nebo informace o mobilních základnových stanicích.
Mobilní platformy Android a iOS implementují vlastní systém oprávnění, ale obecná logika je stejná: aplikace deklaruje požadovaná oprávnění v manifestu nebo konfiguračním souboru a poté o ně žádá za běhu. Podle Android Developers, 2024 patří od Androidu 10 všechna oprávnění k geolokaci do kategorie nebezpečných a vyžadují žádost za běhu.
Důvodem tohoto přístupu je ochrana soukromí uživatelů. Údaje o poloze umožňují vytvářet trasy pohybu, určovat místa práce a odpočinku a také identifikovat osobu. Proto obě platformy vyžadují transparentní vysvětlení v dialogu žádosti: aplikace musí uvést důvod, proč potřebuje přístup ke geolokaci.
Oprávnění k geolokaci je nezbytné pro jakoukoli aplikaci, jejíž funkčnost závisí na znalosti fyzické polohy uživatele. Mapy a navigace, doručovací aplikace, meteorologické služby, sociální sítě s geotagy — všechny tyto kategorie softwaru vyžadují Location Permission.
Bez tohoto oprávnění aplikace nemůže určit souřadnice zařízení žádným z dostupných způsobů: ani přes GPS modul, ani skenováním Wi-Fi, ani určením polohy na základě mobilních základnových stanic. Uživatel může kdykoli odebrat oprávnění v systémových nastaveních, načež aplikace musí odmítnutí správně zpracovat.
Podle výzkumu Pew Research Center (2024) přibližně 45 % uživatelů odebírá přístup ke geolokaci v aplikacích, které ji nepoužívají pro hlavní funkčnost. To znamená, že vývojář musí jasně zdůvodnit žádost a nabídnout alternativní mechanismy pro ty, kteří Location Permission odmítli.
GDPR v Evropě a zákon 152-FZ v Rusku vyžadují získání informovaného souhlasu pro zpracování údajů o poloze. Aplikace musí nejen požádat o oprávnění prostřednictvím systémového dialogu, ale také poskytnout samostatné oznámení o účelech shromažďování údajů. Porušení těchto požadavků má za následek pokuty až 20 milionů eur nebo 4 % ročního obratu společnosti.
Pokud aplikace nežádá o Location Permission nebo uživatel odmítne přístup, musí vývojář zajistit záložní scénář. Pro mapovou aplikaci to může být ruční zadání adresy, pro doručovací aplikaci — výběr ze seznamu uložených adres, pro meteorologickou službu — určení města na základě IP adresy. Graceful degradation (plynulá degradace) je standardní praxí doporučovanou Googlem a Applem.
Úrovně přístupu ke geolokaci se liší na Androidu a iOS, i když obecná myšlenka je stejná: čím přesnější přístup, tím přísnější požadavky platforma na aplikaci klade.
| Úroveň přístupu | Android | iOS |
|---|---|---|
| Při používání | Pouze když je aplikace aktivní | When In Use — pouze v aplikaci |
| Na pozadí | Always — neustále, i na pozadí | Always — vyžaduje dodatečnou kontrolu App Store |
| Přibližný | ACCESS_COARSE_LOCATION (přesnost do 500 m) | S možností Precision = Off (iOS 14+) |
ACCESS_FINE_LOCATION poskytuje přístup k přesným GPS souřadnicím s chybou několika metrů. Pro deklarování tohoto oprávnění v manifestu se používá konstanta android.permission.ACCESS_FINE_LOCATION. ACCESS_COARSE_LOCATION naopak poskytuje přibližnou polohu s přesností do 500 metrů na základě Wi-Fi a mobilních základnových stanic.
When In Use (při používání) umožňuje aplikaci získávat souřadnice pouze tehdy, když je otevřená na obrazovce. Always (vždy) poskytuje přístup ke geolokaci i v režimu na pozadí, ale vyžaduje povinnou revizi v App Store. Od iOS 14 může uživatel samostatně vypnout přesné určování polohy pro každou aplikaci pomocí přepínače Precision.
Žádost o Location Permission na Androidu se provádí ve dvou fázích: deklarace oprávnění v manifestu a žádost za běhu v kódu. Od Androidu 6.0 (API 23) jsou všechna nebezpečná oprávnění vyžadována během provozu aplikace, nikoli při instalaci.
Prvním krokem je přidání potřebných oprávnění do souboru AndroidManifest.xml. Pro přesné a přibližné určování polohy se používají různé konstanty.
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
Po deklaraci v manifestu je třeba vyvolat systémový dialog žádosti o oprávnění v kódu aplikace. Podívejme se na příklad v Kotlinu s použitím Activity Result API.
private val locationPermissionRequest =
registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions ->
when {
permissions.getOrDefault(Manifest.permission.ACCESS_FINE_LOCATION, false) -> {
// Oprávnění získáno
getLocation()
}
permissions.getOrDefault(Manifest.permission.ACCESS_COARSE_LOCATION, false) -> {
// Pouze přibližná poloha
getCoarseLocation()
}
else -> {
// Uživatel odmítl
showLocationExplanation()
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
checkLocationPermission()
}
Pokud uživatel odmítl přístup, systém Android neumožňuje automatické opětovné zobrazení dialogu. Vývojář musí zavolat shouldShowRequestPermissionRationale pro zobrazení předběžného vysvětlení. Při opakovaném odmítnutí s příznakem Never Ask Again je třeba uživatele přesměrovat do systémových nastavení.
private fun checkLocationPermission() {
when {
ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) ==
PackageManager.PERMISSION_GRANTED -> {
getLocation()
}
ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.ACCESS_FINE_LOCATION) -> {
showRationaleDialog {
requestLocationPermission()
}
}
else -> {
openAppSettings()
}
}
}
Žádost o Location Permission na iOS vyžaduje přidání speciálních klíčů do souboru Info.plist a zavolání metody třídy CLLocationManager. Apple věnuje zvláštní pozornost soukromí, proto musí být text vysvětlení v dialogu žádosti co nejkonkrétnější.
Pro vyžádání polohy na iOS je třeba přidat jeden nebo oba klíče do Info.plist: NSLocationWhenInUseUsageDescription pro přístup při používání a NSLocationAlwaysAndWhenInUseUsageDescription pro přístup na pozadí. Hodnotou každého klíče je řetězec, který bude uživateli zobrazen v dialogu.
<key>NSLocationWhenInUseUsageDescription</key>
<string>Aplikace potřebuje vaši polohu k zobrazení nejbližších bodů na mapě.</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Aplikace potřebuje přístup ke geolokaci na pozadí pro sledování trasy.</string>
Ve Swift kódu je žádost provedena prostřednictvím instance CLLocationManager. V závislosti na požadované úrovni přístupu se volá requestWhenInUseAuthorization nebo requestAlwaysAuthorization.
import CoreLocation
class LocationManager: NSObject, CLLocationManagerDelegate {
private let manager = CLLocationManager()
func requestLocationAccess() {
manager.delegate = self
manager.requestWhenInUseAuthorization()
}
func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
switch manager.authorizationStatus {
case .authorizedWhenInUse, .authorizedAlways:
startLocationUpdates()
case .denied, .restricted:
showSettingsAlert()
case .notDetermined:
break
}
}
}
Na rozdíl od Androidu, iOS neposkytuje vývojáři metodu pro kontrolu shouldShowRequestPermissionRationale. Systém sám rozhoduje, kdy zobrazit vysvětlení. Kromě toho, na iOS může uživatel změnit oprávnění pouze prostřednictvím systémových nastavení — aplikace nemůže znovu vyvolat systémový dialog poté, co uživatel provedl volbu. RequestAlwaysAuthorization nejprve žádá When In Use a poté, po získání prvního souhlasu, samostatný dialog pro přístup na pozadí.
Nejlepší postupy práce s Location Permission pomáhají snížit počet odmítnutí uživatelů a splnit požadavky obchodů s aplikacemi. Google a Apple zveřejnily doporučení, jejichž dodržování zvyšuje pravděpodobnost schválení aplikace.
Nezobrazujte dialog žádosti o Location Permission ihned při spuštění aplikace. Uživatel, který právě otevřel aplikaci, ještě nechápe, proč má poskytnout přístup ke geolokaci. Contextual request znamená, že se dialog objeví v okamžiku, kdy uživatel skutečně potřebuje funkci vyžadující oprávnění. Například při stisknutí tlačítka “Najít nejbližší obchod”.
Před systémovým dialogem zobrazte vlastní vysvětlovací obrazovku (pre-permission screen). Na ní vysvětlete, proč aplikace potřebuje geolokaci, jaká data jsou shromažďována a jak budou použita. Poté, co uživatel klikne na “Povolit” na vaší obrazovce, zobrazte systémový dialog. Podle údajů Appsflyer (2024) tento přístup zvyšuje konverzi souhlasu o 25-35%.
Přístup na pozadí ke geolokaci je potřebný pouze pro aplikace pracující na pozadí: navigátory, sledovače aktivit, doručovací aplikace. Pokud vaše aplikace potřebuje souřadnice pouze při otevřené obrazovce, žádejte When In Use. App Store aplikaci zamítne, pokud Always není funkčně odůvodněno. Na Androidu je přístup na pozadí dodatečně regulován oprávněním ACCESS_BACKGROUND_LOCATION.
Často kladené otázky
Aplikace musí odmítnutí správně zpracovat a nabídnout alternativní scénář. Například ruční zadání adresy nebo určení města na základě IP adresy. Systémový dialog se znovu nezobrazuje — je třeba uživatele přesměrovat do nastavení.
Technicky ano, systémový dialog lze vyvolat bez předchozí obrazovky. Nicméně konverze souhlasu bez vysvětlení činí 30-40%, zatímco s předchozí obrazovkou 60-75%. Apple a Google doporučují vždy vysvětlit důvod žádosti.
Použijte ContextCompat.checkSelfPermission s konstantou Manifest.permission.ACCESS_FINE_LOCATION. Metoda vrací PERMISSION_GRANTED nebo PERMISSION_DENIED, což umožňuje určit aktuální stav bez vyvolání systémového dialogu.
ACCESS_FINE_LOCATION poskytuje přístup k přesným GPS souřadnicím s chybou 3-10 metrů. ACCESS_COARSE_LOCATION poskytuje přibližnou polohu s přesností do 500 metrů na základě Wi-Fi a mobilních základnových stanic. Na Androidu 12+ může vývojář žádat o obě oprávnění současně.
Na Androidu je pro skenování BLE zařízení vyžadován ACCESS_FINE_LOCATION nebo ACCESS_COARSE_LOCATION, protože BLE signály mohou být použity pro triangulaci polohy. Na iOS pro BLE stačí oprávnění Bluetooth, Location Permission není vyžadován.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také