Info.plist is een XML-configuratiebestand voor iOS- en macOS-apps dat metadata, machtigingen en opstartinstellingen bevat. Het wordt door het systeem verwerkt voordat de app-code wordt geïnitialiseerd. Volgens Apple Developer, 2025 komt een app zonder correct geconfigureerd Info.plist niet door de App Store-review. Info.plist bepaalt de bundel-ID, buildversie, gevraagde machtigingen en ondersteunde schermoriëntaties.
Belangrijkste punten
Info.plist is een bestand in XML-formaat met een root-element dict dat sleutel-waardeparen bevat in de vorm van een property list. Het bevindt zich in de bundel van de app en wordt door het systeem gelezen bij elke start voordat de code wordt uitgevoerd. Het plist-formaat ondersteunt strings, getallen, arrays, woordenboeken, datums en booleaanse waarden, waardoor complexe configuraties kunnen worden beschreven.
Apple gebruikt Info.plist om de identiteit, mogelijkheden en vereisten van de app te definiëren. Het wijzigen van sommige sleutels vereist herbouw van de bundel, omdat deze van invloed zijn op de metadata die door de App Store worden gecontroleerd bij het uploaden van een build. Als u bijvoorbeeld CFBundleVersion of CFBundleIdentifier na publicatie wijzigt, kan dit het updateproces van de app verstoren, omdat App Store Connect deze waarden gebruikt om versies te identificeren.
Basis sleutels worden automatisch aangemaakt bij het maken van een project in Xcode, maar de meeste instellingen worden handmatig toegevoegd naarmate de functionaliteit van de app zich ontwikkelt. Xcode biedt een grafische editor voor Info.plist met keuzelijsten voor standaardsleutels, wat het risico op typefouten vermindert. Voor complexe configuraties zoals Scene Manifest of Background Modes wordt echter aanbevolen om de bron-XML rechtstreeks te bewerken.
Sommige Info.plist-sleutels zijn verplicht voor publicatie in de App Store. Het ontbreken ervan leidt tot afwijzing van de build in de validatiefase. Apple controleert deze sleutels automatisch bij het uploaden van het archief via Xcode Organizer of Transporter. De ontwikkelaar moet ervoor zorgen dat alle verplichte velden correct zijn ingevuld voordat deze ter beoordeling worden verzonden.
De sleutel CFBundleIdentifier stelt een unieke identificatie van de app in in omgekeerde domeinnotatie (com.bedrijf.appnaam). Het wordt gebruikt voor codesignering, Push-meldingen, CloudKit, App Groups en vele andere Apple-services. Het wijzigen van de identifier na publicatie wordt door de App Store als een nieuwe app beschouwd en bestaande gebruikers ontvangen geen update. Daarom moet de identifier gedurende de gehele levenscyclus van de app onveranderd blijven.
<key>CFBundleIdentifier</key>
<string>com.itsectr.myapp</string>
De sleutels CFBundleShortVersionString (weergegeven versie) en CFBundleVersion (buildnummer) worden door App Store Connect en het systeem gebruikt voor updatebeheer. De versie wordt opgegeven in de notatie major.minor.patch. Het buildnummer moet toenemen met elke build die naar App Store Connect wordt geüpload, zelfs als de app-versie niet verandert. Apple gebruikt CFBundleVersion om te bepalen of de build nieuw is of een duplicaat van een reeds geüploade. Als het buildnummer overeenkomt met een eerder geüploade, wordt fout ITMS-90161 gegenereerd.
<key>CFBundleShortVersionString</key>
<string>1.2.0</string>
<key>CFBundleVersion</key>
<string>42</string>
De sleutels UISupportedInterfaceOrientations definiëren de ondersteunde schermoriëntaties voor iPhone. Voor iPad wordt een aparte sleutel UISupportedInterfaceOrientations~ipad met apparaatsuffix gebruikt. Elke oriëntatie wordt opgegeven als een string: UIInterfaceOrientationPortrait, UIInterfaceOrientationLandscapeLeft, UIInterfaceOrientationLandscapeRight, UIInterfaceOrientationPortraitUpsideDown. Als de app alleen de portretoriëntatie ondersteunt, wijst de App Store de build af, tenzij deze alleen voor iPhone is en alleen portret voor iPad is opgegeven.
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
</array>
Sinds iOS 10 vereist Apple een beschrijving van elke gevraagde machtiging via sleutels met het voorvoegsel NS (NeXTStep). De beschrijving wordt aan de gebruiker getoond in het systeemdialoogvenster bij de eerste aanvraag voor toegang tot private API's. Het ontbreken van de overeenkomstige NS-sleutel bij het aanroepen van een API die toestemming vereist, leidt tot onmiddellijke beëindiging van de app met een uitzondering die alleen wordt geregistreerd in crashlogboeken.
| Sleutel | Doel |
|---|---|
| NSCameraUsageDescription | Toegang tot camera voor foto en video |
| NSPhotoLibraryUsageDescription | Toegang tot fotobibliotheek |
| NSLocationWhenInUseUsageDescription | Geolocatie bij actief gebruik |
| NSMicrophoneUsageDescription | Toegang tot microfoon voor geluidsopname |
| NSContactsUsageDescription | Toegang tot apparaatcontacten |
Elke privacy-sleutel moet een voor de gebruiker begrijpelijke beschrijving van de reden van de aanvraag bevatten. Lege of sjabloonteksten zoals „Voor werking van de app” of „Toegang vereist” leiden tot afwijzing in de App Store. De beschrijving moet de specifieke functionaliteit uitleggen: „Toegang tot de camera is nodig voor het scannen van QR-codes en het maken van profielfoto’s”. Het wordt aanbevolen om gelokaliseerde versies van beschrijvingen te gebruiken via InfoPlist.strings-bestanden voor elke ondersteunde taal.
Het ontbreken van de benodigde NS-sleutel bij het aanroepen van een API met toegang tot privégegevens veroorzaakt een crash van de app. Het systeem beëindigt het proces met een uitzondering, die alleen zichtbaar is in de logboeken van crashrapporten uit Xcode of Firebase Crashlytics. De gebruiker ziet alleen het plotseling sluiten van de app zonder enige uitleg. Daarom moet u voordat u nieuwe functionaliteit toevoegt die de camera, microfoon of geolocatie gebruikt, eerst de bijbehorende privacy-sleutel in Info.plist toevoegen en vervolgens de API-aanroep implementeren.
De sleutel CFBundleURLTypes registreert aangepaste URL-schema's voor diepe links in de app. Hiermee kan de app worden geopend vanuit een browser, e-mail of andere apps via links van de vorm mijnapp://profiel/123. Elk schema identificeert de app op unieke wijze: als twee apps hetzelfde schema registreren, toont het systeem de gebruiker een keuzedialoogvenster.
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>com.itsectr.myapp</string>
<key>CFBundleURLSchemes</key>
<array>
<string>myapp</string>
</array>
</dict>
</array>
Voor ondersteuning van Universal Links is de sleutel com.apple.developer.associated-domains in het Entitlements-bestand vereist, niet in Info.plist. Universal Links werken alleen als er een geconfigureerd apple-app-site-association-bestand op de server is dat het domein aan de app koppelt. In tegenstelling tot aangepaste URL-schema's tonen Universal Links geen bevestigingsdialoog en conflicteren ze niet met andere apps, omdat ze HTTPS-links gebruiken in plaats van aangepaste schema's. Ze vereisen echter een domein met een geldig SSL-certificaat.
Aangepaste schema's kunnen conflicteren met standaard schema's van iOS. Het wordt aanbevolen om schema's van ten minste 4 tekens te gebruiken om botsingen met andere apps te minimaliseren. Het schema „fb” is bijvoorbeeld te kort en kan conflicten veroorzaken. U kunt beter omgekeerde notatie gebruiken: mijnapp:// in plaats van app://. Houd er ook rekening mee dat als de app wordt verwijderd maar een andere app hetzelfde schema heeft geregistreerd, de gebruiker onverwacht gedrag kan ervaren bij het navigeren via een link.
De sleutel UIBackgroundModes declareert de achtergrondmogelijkheden van de app. Elke modus vereist een overeenkomstige beschrijving in Info.plist en bevestiging in de capabilities van het Xcode-project. Zonder opgave van de modus kan het systeem de achtergrondtaak na 30 seconden of bij gebrek aan resources geforceerd beëindigen.
<key>UIBackgroundModes</key>
<array>
<string>fetch</string>
<string>remote-notification</string>
<string>location</string>
<string>processing</string>
</array>
De sleutel UIApplicationSupportsMultipleScenes schakelt ondersteuning voor multitasking op iPad en Mac Catalyst in. Zonder deze sleutel kan de app geen SwiftUI ScenePhase of UIKit UISceneDelegate gebruiken voor het beheren van meerdere vensters. Op iPadOS kunnen gebruikers meerdere vensters van dezelfde app openen, inhoud ertussen slepen en Split View gebruiken. Als de app geen multi-venstermodus ondersteunt, schakelt het instellen van deze sleutel op false de bijbehorende functionaliteit uit.
De sleutel LSRequiresIPhoneOS verbiedt installatie van de app op iPad. Wordt gebruikt voor iPhone-only apps die de iPad-interface niet ondersteunen of niet zijn aangepast voor het grote scherm. Apple raadt het gebruik van deze sleutel echter niet aan zonder noodzaak, omdat gebruikers verwachten dat apps werken op alle apparaten met iOS en iPadOS. Als de app toch beperkt is tot iPhone, moet u ervoor zorgen dat deze vereiste technisch gerechtvaardigd is en vermeld staat in de App Store-beschrijving.
De sleutel UIViewControllerBasedStatusBarAppearance beheert de stijl van de statusbalk. Indien ingesteld op NO, wordt de stijl van de statusbalk globaal ingesteld via de sleutel UIStatusBarStyle in Info.plist. Indien YES (standaard sinds iOS 7), kan elke ViewController zijn eigen statusbalk beheren door preferredStatusBarStyle te overschrijven. Voor moderne apps wordt aanbevolen YES te laten staan om een verschillende statusbalk op verschillende schermen te hebben, bijvoorbeeld licht op een donkere achtergrond en donker op een lichte achtergrond.
De sleutel UIApplicationExitsOnSuspend dwingt de app om volledig te stoppen bij overgang naar de achtergrond in plaats van te worden onderbroken. Wordt zelden gebruikt, alleen voor apps met hoge beveiligingseisen: bankapps of apps voor het werken met vertrouwelijke gegevens. In dit geval verliest de gebruiker de mogelijkheid om snel terug te keren naar de app en vindt elke start plaats vanuit een schone toestand. De App Store kan tijdens de review om rechtvaardiging van het gebruik van deze sleutel vragen.
De sleutel NSAppTransportSecurity beheert de netwerkverbindingen van de app. Sinds iOS 9 blokkeert App Transport Security (ATS) standaard alle HTTP-verbindingen en vereist HTTPS. Voor tijdelijke toestemming van HTTP-verzoeken aan specifieke domeinen wordt het woordenboek NSExceptionDomains binnen NSAppTransportSecurity gebruikt. Voor ontwikkeling is volledige uitschakeling van ATS via NSAllowsArbitraryLoads = true toegestaan, maar Apple vereist rechtvaardiging en laat dergelijke builds niet zonder goede reden door. In de productie-build moet ATS zijn ingeschakeld voor alle domeinen die met gebruikersgegevens omgaan.
Veelgestelde vragen
Het bestand Info.plist bevindt zich in de projectmap met dezelfde naam als de app. In Xcode wordt het weergegeven in de projectnavigator in de groep Supporting Files met een pictogram van een blauw boekje. Het kan ook worden gevonden via Spotlight-zoekopdracht in het project.
Ja, Info.plist kan worden bewerkt in elke teksteditor of via de grafische interface van Xcode. Handmatig bewerken geeft volledige controle over de inhoud, maar vereist aandacht voor XML-syntaxis: elke openende <key>-directive moet een overeenkomstige </key> hebben en gegevenstypen moeten overeenkomen met wat Apple verwacht.
In SwiftUI-projecten werkt Info.plist identiek aan UIKit-projecten. Daarnaast kan de sleutel UIApplicationSceneManifest nodig zijn voor het configureren van Scene Configuration, als het project geen App-protocol gebruikt voor het beheren van scènes. Het SwiftUI App-protocol genereert automatisch de scèneconfiguratie, maar voor aanpassing is handmatige toevoeging van sleutels vereist.
Open Info.plist in Xcode, klik op het plusteken en voer de naam van de sleutel in. Gebruik voor aangepaste sleutels het bedrijfsvoorvoegsel om conflicten met systeemsleutels van Apple te voorkomen, bijvoorbeeld ITSCustomKey in plaats van CustomKey. Het waardetype (String, Number, Array, Dictionary) wordt gekozen op basis van het verwachte gegevensformaat.
Typische oorzaken: ontbrekende privacy-sleutels voor gevraagde machtigingen, onjuiste CFBundleIdentifier, versieverschil tussen Info.plist en App Store Connect, lege waarden van NS-sleutels. Controleer alle NS-sleutels voor gebruikte API's en zorg ervoor dat elke beschrijving een zinvolle uitleg bevat in de lokalisatietaal van de app.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook