Info.plist Usage Description — jsou povinné klíče v souboru Info.plist aplikace iOS, které obsahují text zobrazený uživateli při žádosti o přístup k systémovým funkcím: kameře, mikrofonu, geolokaci, fotoalbu a dalším. Každý takový klíč má předponu NS*UsageDescription a poskytuje řetězec vysvětlující důvod žádosti o přístup. Podle Apple Information Property List Guide vede absence klíče pro požadovaný zdroj k okamžitému pádu aplikace.
Hlavní body
Info.plist Usage Description — jsou řetězcové hodnoty klíčů s předponou NS*UsageDescription, které určují text systémového dialogu při žádosti o přístup k chráněným zdrojům iOS. Když aplikace poprvé zavolá API vyžadující souhlas uživatele (např. AVCaptureDevice pro kameru), iOS zobrazí dialog s tímto textem a tlačítky pro povolení nebo odmítnutí.
Text popisu je jediná věc, kterou může vývojář v systémovém dialogu ovládat. Název dialogu „Aplikace chce získat přístup k [zdroji]“ je generován automaticky iOS na základě typu požadovaného zdroje. Vývojář nemůže změnit název, tlačítka ani vzhled — pouze vysvětlující text.
Usage Description je úzce spojen s modelem runtime permissions v iOS. Uživatel uděluje povolení pro jednu žádost, které může být později odvoláno prostřednictvím Nastavení. Při opakované žádosti se dialog nezobrazí — aplikace musí zkontrolovat stav povolení a odpovídajícím způsobem reagovat.
Apple důrazně doporučuje uvést v popisu konkrétní důvod žádosti o přístup. Například „Pro pořizování profilových fotografií“ je lepší než „Pro přístup ke kameře“. Konkrétní texty zvyšují důvěru uživatele a procento udělených povolení. Podle údajů Localytics (2023) zvyšují vlastní popisy souhlas o 15-25% ve srovnání s obecnými formulacemi.
Nepleťte si NS*UsageDescription s ATT (App Tracking Transparency). Usage Description je žádost o přístup k systémovým zdrojům (kamera, geolokace, foto), zatímco ATT je žádost o sledování (přístup k IDFA). ATT používá samostatný framework AppTrackingTransparency a klíč NSUserTrackingUsageDescription, který nepatří do NS*UsageDescription.
Společné mají to, že oba používají systémový dialog s textem, který aplikace nemůže upravit. Rozdíl je v tom, že Usage Description pracuje na úrovni zdrojů, zatímco ATT na úrovni identifikátoru zařízení. Klíče NS*UsageDescription byly zavedeny v iOS 6, ATT — v iOS 14.5.
S každým vydáním iOS Apple přidával nové chráněné zdroje a odpovídající klíče. iOS 6: kontakty, kalendář, připomínky, foto. iOS 7: mikrofon. iOS 8: HomeKit, Health. iOS 10: knihovna médií, Siri. iOS 11: NFC. iOS 14: sledování (ATT). iOS 17: přístup ke schránce (vyžaduje dodatečné potvrzení).
Důležité: pokud aplikace používá API zavedené v určité verzi iOS, ale minimální podporovaná verze je nižší, klíč je stále povinný. iOS kontroluje přítomnost klíče před prvním voláním API, bez ohledu na verzi, na které aplikace běží.
Úplný seznam klíčů závisí na tom, jaké funkce aplikace používá. Podívejme se na 14 hlavních klíčů, které jsou nejčastěji vyžadovány v mobilních aplikacích.
Klíč NSCameraUsageDescription — povinný při přístupu ke kameře přes AVCaptureDevice nebo UIImagePickerController se zdrojem .camera. Klíč NSMicrophoneUsageDescription — při nahrávání zvuku přes AVAudioRecorder nebo při nahrávání videa se zvukem. Oba klíče jsou často vyžadovány společně, pokud aplikace nahrává video.
Klíč NSPhotoLibraryUsageDescription — při čtení fotografií a videí z knihovny médií uživatele přes PHPicker nebo UIImagePickerController. Klíč NSPhotoLibraryAddUsageDescription — pokud aplikace pouze ukládá fotografie, ale nečte je. První požaduje přístup pro čtení, druhý — pouze pro zápis.
Klíč NSLocationWhenInUseUsageDescription — přístup ke geolokaci, když je aplikace aktivní (na obrazovce). NSLocationAlwaysAndWhenInUseUsageDescription — přístup vždy (včetně režimu na pozadí). iOS vyžaduje oba klíče, pokud je potřeba trvalý přístup: nejprve WhenInUse, potom Always.
Klíče NSLocationTemporaryUsageDescription a NSLocationPreciseUsageDescription — další klíče pro žádost o dočasný přístup nebo přesnou geolokaci. Přesná poloha vyžaduje samostatné povolení a uživatel může zapnout pouze přibližnou.
| Klíč | Zdroj | Dostupný od iOS |
|---|---|---|
| NSCameraUsageDescription | Kamera | 6.0 |
| NSMicrophoneUsageDescription | Mikrofon | 7.0 |
| NSPhotoLibraryUsageDescription | Knihovna médií (čtení) | 6.0 |
| NSPhotoLibraryAddUsageDescription | Knihovna médií (zápis) | 11.0 |
| NFCReaderUsageDescription | NFC | 11.0 |
Klíč NSContactsUsageDescription — přístup ke kontaktům uživatele přes CNContactStore. NSCalendarsUsageDescription — přístup ke kalendáři pro čtení a vytváření událostí. NSRemindersUsageDescription — přístup k připomínkám. NSBluetoothAlwaysUsageDescription — přístup k Bluetooth na pozadí (např. pro zařízení BLE).
Klíč NSHealthShareUsageDescription — přístup ke čtení dat HealthKit. NSHealthUpdateUsageDescription — přístup k zápisu dat do HealthKit. Oba jsou povinné, pokud aplikace pracuje v oblasti zdraví. Apple pečlivě kontroluje aplikace používající HealthKit a může je odmítnout, pokud popis použití neodpovídá funkčnosti.
Text v Usage Description by měl být konkrétní, pravdivý a výstižný. Apple poskytuje doporučení pro formulace a moderátoři kontrolují jejich shodu s funkčností.
Dobrý popis se skládá ze tří částí: co přesně aplikace se zdrojem dělá, proč to uživatel potřebuje a jaký přínos má uživatel z poskytnutí přístupu. Příklad: „Pro pořizování profilových fotografií a jejich nahrání do formuláře“. Vyhýbejte se obecným frázím: „Pro zlepšení fungování aplikace“ nevysvětluje, proč je kamera potřeba.
Apple zakazuje zavádějící popisy. Pokud je napsáno „Pro pořizování fotografií“, ale aplikace také nahrává video, může to být považováno za klamání. Moderátor může aplikaci odmítnout nebo požádat o vysvětlení. V iOS 17 Apple přidal automatickou kontrolu: popis musí obsahovat klíčová slova odpovídající požadovanému zdroji.
Lokalizace: popis by měl být přeložen do všech jazyků, které aplikace podporuje. Pokud je aplikace dostupná v 10 jazycích, každý klíč Usage Description musí mít překlady v souborech Localizable.strings nebo InfoPlist.strings. Apple doporučuje používat InfoPlist.strings pro lokalizaci klíčů Info.plist.
Pro lokalizaci Usage Description není nutné duplikovat Info.plist pro každý jazyk. Vytvořte soubor InfoPlist.strings v každém jazykovém adresáři a uveďte hodnoty klíčů. iOS automaticky použije odpovídající jazyk v dialogu. Xcode podporuje základní lokalizaci pro Info.plist od verze 14.
<!-- InfoPlist.strings (Russian) -->
"NSCameraUsageDescription" =
"Pro skenování QR kódů";
"NSPhotoLibraryUsageDescription" =
"Pro nahrávání obrázků do profilu";
"NSLocationWhenInUseUsageDescription" =
"Pro zobrazení nejbližších obchodů na mapě";
Správná implementace Usage Description zahrnuje přidání klíčů do Info.plist, kontrolu stavu povolení v kódu a zpracování odmítnutí.
V Xcode otevřete Info.plist, najeďte na řádek a klikněte na „+". Zadejte název klíče (např. NSCameraUsageDescription) a uveďte řetězec popisu. Xcode automaticky doplňuje názvy klíčů, což snižuje riziko překlepů. Po přidání přestavějte projekt a zkontrolujte, že se klíč zobrazuje ve výsledném binárním souboru.
Důležité: klíče rozlišují velká a malá písmena. NSCameraUsageDescription — správně, NSCamerausagedescription — chyba. Nesprávný klíč je ignorován a aplikace spadne při volání API. Používejte kopírování z dokumentace Apple nebo automatické doplňování Xcode, abyste předešli překlepům.
import AVFoundation
import Photos
final class PermissionManager {
static func checkCameraPermission() {
let status = AVCaptureDevice.authorizationStatus(for: .video)
switch status {
case .notDetermined:
AVCaptureDevice.requestAccess(for: .video) { granted in
print("Camera access: \(granted)")
}
case .denied:
print("Camera access denied")
case .authorized:
print("Camera access authorized")
@unknown default:
break
}
}
static func requestPhotoLibraryAccess() {
PHPhotoLibrary.requestAuthorization { status in
print("Photo library status: \(status.rawValue)")
}
}
}
Pokud uživatel odmítl přístup, aplikace by neměla znovu vyvolávat systémový dialog — to není možné. Místo toho zobrazte informační obrazovku s vysvětlením, jak zapnout přístup přes Nastavení, a tlačítko „Otevřít nastavení" (UIApplicationOpenSettingsURLString). Tato praxe zlepšuje uživatelský zážitek a zvyšuje pravděpodobnost, že uživatel přístup zapne.
Nezobrazujte alert s žádostí o zapnutí přístupu ihned po odmítnutí — dejte uživateli možnost pochopit, proč by tuto funkci mohl potřebovat. Lepší je zobrazit vysvětlení při pokusu o použití funkčnosti, která vyžaduje dané povolení. UX Movement (2023) doporučuje zobrazit vysvětlující obrazovku 2-3 relace po odmítnutí.
func showSettingsAlert(for feature: String) {
let alert = UIAlertController(
title: "Přístup k \(feature)",
message: "Povolte přístup v Nastavení, "
+ "pro použití této funkce",
preferredStyle: .alert
)
alert.addAction(UIAlertAction(
title: "Otevřít Nastavení",
style: .default
) { _ in
if let url = URL(string: UIApplication.openSettingsURLString) {
UIApplication.shared.open(url)
}
})
alert.addAction(UIAlertAction(
title: "Nyní ne", style: .cancel
))
UIApplication.shared.keyWindow?.rootViewController?.present(alert, animated: true)
}
Absence povinného klíče Usage Description vede k okamžitému pádu aplikace při prvním volání odpovídajícího API. To není varování Xcode, ale pád za běhu s výjimkou NSInvalidArgumentException a zprávou v konzoli: „This app has crashed because it attempted to access privacy-sensitive data without a usage description".
iOS kontroluje přítomnost klíče NS*UsageDescription v Info.plist při prvním volání API pro chráněný zdroj. Pokud klíč chybí, systém okamžitě ukončí aplikaci signálem SIGABRT. K tomu dochází i na zařízeních s laděním — Xcode zobrazí výjimku v logu, ale debugger ji nezachytí jako bod přerušení.
K pádu dochází na skutečných zařízeních i simulátoru. Jediný způsob, jak se mu vyhnout, je přidat klíč před voláním API. Statický analyzátor Xcode ne vždy varuje před absencí klíče, zejména pokud je API voláno prostřednictvím SDK třetích stran. TestFlight testeři také uvidí pád, což může vést k negativním recenzím.
Zvláštní situace s iOS 17+: Apple zavedl dodatečnou kontrolu pro přístup ke schránce (UIPasteboard). Pokud aplikace čte schránku bez výslovné akce uživatele, iOS zobrazí varovný banner, i když klíč Usage Description existuje. Pro schránku není vyžadován samostatný klíč, ale Apple doporučuje minimalizovat automatické čtení.
Kromě pádu za běhu může absence klíče být důvodem pro odmítnutí aplikace při moderaci. Apple kontroluje Info.plist ve fázi revize a může odmítnout build, pokud zjistí volání API bez odpovídajících klíčů. Xcode neblokuje archivaci, ale App Store Connect může vrátit chybu při zpracování binárního souboru.
Pokud aplikace nevyužívá zdroj přímo, ale SDK třetí strany to dělá (např. analytické SDK žádá IDFA), vývojář musí stejně přidat odpovídající klíč. Apple kontroluje všechna volání API v binárním souboru, včetně kódu ze statických a dynamických knihoven. Chyba „Missing Info.plist key" je jedním z nejčastějších důvodů odmítnutí aktualizací.
Často kladené otázky
Ano, pokud SDK třetí strany volá API pro přístup ke zdroji (kamera, geolokace, foto), klíč je povinný. iOS kontroluje celý binární soubor včetně závislostí a způsobí pád aplikace při absenci klíče.
Ne, každý chráněný zdroj vyžaduje samostatný klíč. Například NSCameraUsageDescription nenahrazuje NSMicrophoneUsageDescription. Systém hledá konkrétní klíč podle názvu při volání každého API.
Zobrazte obrazovku s vysvětlením, jak zapnout přístup přes Nastavení → Aplikace, a nabídněte tlačítko pro otevření nastavení aplikace. Systémový dialog nelze programově znovu vyvolat.
Vytvořte soubor InfoPlist.strings pro každý jazyk a uveďte překlady. iOS automaticky použije jazyk zařízení při zobrazení dialogu. Xcode také podporuje základní lokalizaci Info.plist.
Simulátor iOS plně reprodukuje chování zařízení včetně kontroly Usage Description. Pokud klíč chybí, simulátor také ukončí aplikaci s výjimkou. Toto je očekávané chování pro ladě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é