Info.plist je XML konfigurační soubor iOS a macOS aplikací obsahující metadata, oprávnění a nastavení spuštění. Je zpracováván systémem před inicializací kódu aplikace. Podle Apple Developer, 2025 bez správně nakonfigurovaného Info.plist aplikace neprojde recenzí App Store. Info.plist určuje identifikátor balíčku, verzi sestavení, požadovaná oprávnění a podporované orientace obrazovky.
Hlavní body
Info.plist je soubor ve formátu XML s kořenovým prvkem dict obsahujícím páry klíč-hodnota ve formě property list. Nachází se uvnitř balíčku aplikace a je čten systémem při každém spuštění před provedením kódu. Formát plist podporuje řetězce, čísla, pole, slovníky, data a booleovské hodnoty, což umožňuje popis složitých konfigurací.
Apple používá Info.plist k určení identity aplikace, jejích schopností a požadavků. Změna některých klíčů vyžaduje přestavbu balíčku, protože ovlivňují metadata kontrolovaná App Store při nahrávání sestavení. Například změna CFBundleVersion nebo CFBundleIdentifier po publikaci může narušit proces aktualizace aplikace, protože App Store Connect používá tyto hodnoty k identifikaci verzí.
Základní klíče jsou vytvářeny automaticky při vytvoření projektu v Xcode, ale většina nastavení se přidává ručně s rozvojem funkcionality aplikace. Xcode poskytuje grafický editor Info.plist s rozbalovacími seznamy pro standardní klíče, což snižuje riziko překlepů. Pro složité konfigurace, jako je Scene Manifest nebo Background Modes, se však doporučuje přímá editace zdrojového XML.
Některé klíče Info.plist jsou povinné pro publikaci v App Store. Jejich absence vede k zamítnutí sestavení ve fázi validace. Apple tyto klíče automaticky kontroluje při nahrávání archivu přes Xcode Organizer nebo Transporter. Vývojář se musí ujistit, že všechna povinná pole jsou správně vyplněna před odesláním k recenzi.
Klíč CFBundleIdentifier nastavuje jedinečný identifikátor aplikace v obrácené doménové notaci (com.společnost.aplikace). Používá se pro podepisování kódu, Push notifikace, CloudKit, App Groups a mnoho dalších služeb Apple. Změna identifikátoru po publikaci je App Store vnímána jako nová aplikace a stávající uživatelé nedostanou aktualizaci. Proto musí identifikátor zůstat nezměněn po celý životní cyklus aplikace.
<key>CFBundleIdentifier</key>
<string>com.itsectr.myapp</string>
Klíče CFBundleShortVersionString (zobrazená verze) a CFBundleVersion (číslo sestavení) jsou používány App Store Connect a systémem pro správu aktualizací. Verze se uvádí ve formátu major.minor.patch. Číslo sestavení musí růst s každým sestavením nahraným do App Store Connect, i když se verze aplikace nemění. Apple používá CFBundleVersion k určení, zda je sestavení nové nebo duplikát již nahraného. Pokud se číslo sestavení shoduje s dříve nahraným, zobrazí se chyba ITMS-90161.
<key>CFBundleShortVersionString</key>
<string>1.2.0</string>
<key>CFBundleVersion</key>
<string>42</string>
Klíče UISupportedInterfaceOrientations určují podporované orientace obrazovky pro iPhone. Pro iPad se používá samostatný klíč UISupportedInterfaceOrientations~ipad s příponou zařízení. Každá orientace je určena řetězcem: UIInterfaceOrientationPortrait, UIInterfaceOrientationLandscapeLeft, UIInterfaceOrientationLandscapeRight, UIInterfaceOrientationPortraitUpsideDown. Pokud aplikace podporuje pouze orientaci na výšku, App Store sestavení zamítne, pokud není pouze pro iPhone a je uvedena pouze orientace na výšku pro iPad.
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
</array>
Počínaje iOS 10 Apple vyžaduje popis každého požadovaného oprávnění prostřednictvím klíčů s předponou NS (NeXTStep). Popis se zobrazuje uživateli v systémovém dialogu při prvním požadavku na přístup k soukromým API. Absence odpovídajícího klíče NS při volání API vyžadujícího oprávnění vede k okamžitému ukončení aplikace s výjimkou, která je zaznamenána pouze v crash logách.
| Klíč | Účel |
|---|---|
| NSCameraUsageDescription | Přístup k kameře pro foto a video |
| NSPhotoLibraryUsageDescription | Přístup k knihovně fotografií |
| NSLocationWhenInUseUsageDescription | Geolokace při aktivním používání |
| NSMicrophoneUsageDescription | Přístup k mikrofonu pro nahrávání zvuku |
| NSContactsUsageDescription | Přístup ke kontaktům zařízení |
Každý klíč soukromí musí obsahovat srozumitelný popis důvodu požadavku. Prázdné nebo šablonové texty, jako „Pro fungování aplikace” nebo „Vyžadován přístup”, vedou k zamítnutí v App Store. Popis by měl vysvětlovat konkrétní funkcionalitu: „Přístup k kameře je potřebný pro skenování QR kódů a vytváření profilových fotografií”. Doporučuje se používat lokalizované verze popisů prostřednictvím souborů InfoPlist.strings pro každý podporovaný jazyk.
Absence potřebného klíče NS při volání API s přístupem k soukromým datům způsobuje pád aplikace. Systém ukončí proces s výjimkou, která je viditelná pouze v logách crash reports z Xcode nebo Firebase Crashlytics. Uživatel vidí pouze náhlé zavření aplikace bez jakéhokoli vysvětlení. Proto před přidáním nové funkcionality používající kameru, mikrofon nebo geolokaci je třeba nejprve přidat odpovídající klíč soukromí do Info.plist a poté implementovat volání API.
Klíč CFBundleURLTypes registruje vlastní URL schémata pro hluboké odkazy v aplikaci. To umožňuje otevírat aplikaci z prohlížeče, emailu nebo jiných aplikací pomocí odkazů ve tvaru mojeaplikace://profil/123. Každé schéma identifikuje aplikaci jedinečným způsobem: pokud dvě aplikace zaregistrují stejné schéma, systém zobrazí uživateli dialog výběru.
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>com.itsectr.myapp</string>
<key>CFBundleURLSchemes</key>
<array>
<string>myapp</string>
</array>
</dict>
</array>
Pro podporu Universal Links je vyžadován klíč com.apple.developer.associated-domains v souboru Entitlements, nikoli v Info.plist. Universal Links fungují pouze při existenci nakonfigurovaného souboru apple-app-site-association na serveru, který propojuje doménu s aplikací. Na rozdíl od vlastních URL schémat nezobrazují Universal Links potvrzovací dialog a nekolidují s jinými aplikacemi, protože používají HTTPS odkazy, nikoli vlastní schémata. Vyžadují však doménu s platným SSL certifikátem.
Vlastní schémata mohou kolidovat se standardními schématy iOS. Doporučuje se používat schémata o délce nejméně 4 znaků pro minimalizaci kolizí s jinými aplikacemi. Například schéma „fb” je příliš krátké a může způsobovat konflikty. Lepší je používat obrácenou notaci: mojeaplikace:// místo aplikace://. Je také třeba pamatovat, že pokud je aplikace smazána, ale jiná aplikace zaregistrovala stejné schéma, uživatel může při navigaci přes odkaz zaznamenat neočekávané chování.
Klíč UIBackgroundModes deklaruje možnosti běhu na pozadí aplikace. Každý režim vyžaduje odpovídající popis v Info.plist a potvrzení v capabilities projektu Xcode. Bez uvedení režimu může systém vynutit ukončení úlohy na pozadí po 30 sekundách nebo při nedostatku zdrojů.
<key>UIBackgroundModes</key>
<array>
<string>fetch</string>
<string>remote-notification</string>
<string>location</string>
<string>processing</string>
</array>
Klíč UIApplicationSupportsMultipleScenes zapíná podporu multitaskingu na iPad a Mac Catalyst. Bez tohoto klíče aplikace nemůže používat SwiftUI ScenePhase nebo UIKit UISceneDelegate pro správu více oken. Na iPadOS mohou uživatelé otevřít více oken stejné aplikace, přetahovat obsah mezi nimi a používat Split View. Pokud aplikace nepodporuje režim více oken, nastavení tohoto klíče na false deaktivuje odpovídající funkcionalitu.
Klíč LSRequiresIPhoneOS zakazuje instalaci aplikace na iPad. Používá se pro aplikace pouze pro iPhone, které nepodporují iPad rozhraní nebo nejsou přizpůsobeny velké obrazovce. Apple však nedoporučuje používat tento klíč bez potřeby, protože uživatelé očekávají, že aplikace budou fungovat na všech zařízeních s iOS a iPadOS. Pokud je aplikace přesto omezena na iPhone, je třeba zajistit, že tento požadavek je technicky odůvodněn a uveden v popisu App Store.
Klíč UIViewControllerBasedStatusBarAppearance řídí styl stavového řádku. Pokud je nastaven na NO, styl stavového řádku je globálně určen klíčem UIStatusBarStyle v Info.plist. Pokud YES (výchozí od iOS 7), každý ViewController může spravovat svůj stavový řádek přepsáním preferredStatusBarStyle. Pro moderní aplikace se doporučuje ponechat YES, aby byl různý stavový řádek na různých obrazovkách, například světlý na tmavém pozadí a tmavý na světlém pozadí.
Klíč UIApplicationExitsOnSuspend nutí aplikaci k úplnému ukončení při přechodu do režimu na pozadí místo pozastavení. Používá se zřídka, pouze pro aplikace s vysokými bezpečnostními požadavky: bankovní aplikace nebo aplikace pro práci s důvěrnými daty. V tomto případě uživatel ztrácí možnost rychlého návratu k aplikaci a každé spuštění probíhá z čistého stavu. App Store může při recenzi požadovat odůvodnění použití tohoto klíče.
Klíč NSAppTransportSecurity spravuje síťová připojení aplikace. Počínaje iOS 9 App Transport Security (ATS) ve výchozím nastavení blokuje všechna HTTP připojení a vyžaduje HTTPS. Pro dočasné povolení HTTP požadavků na konkrétní domény se používá slovník NSExceptionDomains uvnitř NSAppTransportSecurity. Pro vývoj je povoleno úplné vypnutí ATS pomocí NSAllowsArbitraryLoads = true, ale Apple vyžaduje odůvodnění a taková sestavení bez závažného důvodu nepovoluje. V produkčním sestavení musí být ATS povoleno pro všechny domény, které interagují s uživatelskými daty.
Často kladené otázky
Soubor Info.plist se nachází ve složce projektu s názvem shodujícím se s názvem aplikace. V Xcode je zobrazen v navigátoru projektů ve skupině Supporting Files s ikonou modré knihy. Lze jej také najít pomocí vyhledávání Spotlight v projektu.
Ano, Info.plist lze upravovat v libovolném textovém editoru nebo prostřednictvím grafického rozhraní Xcode. Ruční úprava poskytuje plnou kontrolu nad obsahem, ale vyžaduje pozornost k syntaxi XML: každá otevírací direktiva <key> musí mít odpovídající </key> a typy dat musí odpovídat očekáváním Apple.
V projektech SwiftUI funguje Info.plist identicky jako v projektech UIKit. Dodatečně může být vyžadován klíč UIApplicationSceneManifest pro konfiguraci Scene Configuration, pokud projekt nepoužívá App protocol pro správu scén. SwiftUI App protocol automaticky generuje konfiguraci scén, ale pro přizpůsobení je vyžadováno ruční přidání klíčů.
Otevřete Info.plist v Xcode, klikněte na plus a zadejte název klíče. Pro vlastní klíče používejte prefix společnosti, abyste předešli konfliktům s systémovými klíči Apple, například ITSCustomKey místo CustomKey. Typ hodnoty (String, Number, Array, Dictionary) se volí v závislosti na očekávaném formátu dat.
Typické příčiny: absence klíčů soukromí pro požadovaná oprávnění, nesprávný CFBundleIdentifier, nesoulad verze v Info.plist a App Store Connect, prázdné hodnoty klíčů NS. Zkontrolujte všechny klíče NS pro používaná API a ujistěte se, že každý popis obsahuje smysluplné vysvětlení v jazyce lokalizace aplikace.
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é