Info.plist este un fișier XML de configurare a aplicațiilor iOS și macOS care conține metadate, permisiuni și setări de pornire. Este procesat de sistem înainte de inițializarea codului aplicației. Conform Apple Developer, 2025, fără un Info.plist configurat corect, aplicația nu trece de revizia App Store. Info.plist definește identificatorul pachetului, versiunea de build, permisiunile solicitate și orientările de ecran suportate.
Principalele puncte
Info.plist este un fișier în format XML cu elementul rădăcină dict care conține perechi cheie-valoare sub formă de property list. Se află în interiorul pachetului aplicației și este citit de sistem la fiecare pornire înainte de executarea codului. Formatul plist suportă șiruri de caractere, numere, array-uri, dicționare, date și valori booleene, permițând descrierea configurațiilor complexe.
Apple folosește Info.plist pentru a defini identitatea aplicației, capacitățile și cerințele acesteia. Modificarea unor chei necesită reconstruirea pachetului, deoarece acestea afectează metadatele verificate de App Store la încărcarea build-ului. De exemplu, schimbarea CFBundleVersion sau CFBundleIdentifier după publicare poate perturba procesul de actualizare a aplicației, deoarece App Store Connect folosește aceste valori pentru identificarea versiunilor.
Cheile de bază sunt create automat la crearea proiectului în Xcode, dar majoritatea setărilor se adaugă manual pe măsură ce funcționalitatea aplicației se dezvoltă. Xcode oferă un editor grafic Info.plist cu liste derulante pentru cheile standard, ceea ce reduce riscul greșelilor de tastare. Cu toate acestea, pentru configurații complexe precum Scene Manifest sau Background Modes, se recomandă editarea directă a XML-ului sursă.
Unele chei Info.plist sunt obligatorii pentru publicarea în App Store. Absența lor duce la respingerea build-ului în faza de validare. Apple verifică automat aceste chei la încărcarea arhivei prin Xcode Organizer sau Transporter. Dezvoltatorul trebuie să se asigure că toate câmpurile obligatorii sunt completate corect înainte de a trimite spre revizuire.
Cheia CFBundleIdentifier stabilește un identificator unic al aplicației în notație inversă de domeniu (com.companie.aplicație). Este folosit pentru semnarea codului, notificări Push, CloudKit, App Groups și multe alte servicii Apple. Modificarea identificatorului după publicare este percepută de App Store ca o aplicație nouă, iar utilizatorii existenți nu vor primi actualizarea. Prin urmare, identificatorul trebuie să fie neschimbat pe tot parcursul ciclului de viață al aplicației.
<key>CFBundleIdentifier</key>
<string>com.itsectr.myapp</string>
Cheile CFBundleShortVersionString (versiunea afișată) și CFBundleVersion (numărul de build) sunt folosite de App Store Connect și sistem pentru gestionarea actualizărilor. Versiunea se indică în format major.minor.patch. Numărul de build trebuie să crească cu fiecare build încărcat în App Store Connect, chiar dacă versiunea aplicației nu se schimbă. Apple folosește CFBundleVersion pentru a determina dacă build-ul este nou sau un duplicat al unuia deja încărcat. Dacă numărul de build coincide cu unul încărcat anterior, se emite eroarea ITMS-90161.
<key>CFBundleShortVersionString</key>
<string>1.2.0</string>
<key>CFBundleVersion</key>
<string>42</string>
Cheile UISupportedInterfaceOrientations definesc orientările de ecran suportate pentru iPhone. Pentru iPad se folosește o cheie separată UISupportedInterfaceOrientations~ipad cu sufixul dispozitivului. Fiecare orientare este specificată printr-un șir: UIInterfaceOrientationPortrait, UIInterfaceOrientationLandscapeLeft, UIInterfaceOrientationLandscapeRight, UIInterfaceOrientationPortraitUpsideDown. Dacă aplicația suportă doar orientarea portret, App Store va respinge build-ul dacă nu este exclusiv pentru iPhone și este specificat doar portret pentru iPad.
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
</array>
Începând cu iOS 10, Apple solicită descrierea fiecărei permisiuni solicitate prin chei cu prefixul NS (NeXTStep). Descrierea este afișată utilizatorului în dialogul de sistem la prima solicitare de acces la API-uri private. Absența cheii NS corespunzătoare la apelarea unui API care necesită permisiune duce la terminarea imediată a aplicației cu o excepție care este înregistrată doar în logurile de crash.
| Cheie | Scop |
|---|---|
| NSCameraUsageDescription | Acces la cameră pentru foto și video |
| NSPhotoLibraryUsageDescription | Acces la biblioteca foto |
| NSLocationWhenInUseUsageDescription | Geolocalizare în timpul utilizării active |
| NSMicrophoneUsageDescription | Acces la microfon pentru înregistrare audio |
| NSContactsUsageDescription | Acces la contactele dispozitivului |
Fiecare cheie de confidențialitate trebuie să conțină o descriere ușor de înțeles pentru utilizator a motivului solicitării. Textele goale sau șablon, precum „Pentru funcționarea aplicației” sau „Acces necesar”, duc la respingerea în App Store. Descrierea trebuie să explice funcționalitatea specifică: „Accesul la cameră este necesar pentru scanarea codurilor QR și crearea fotografiilor de profil”. Se recomandă utilizarea versiunilor localizate ale descrierilor prin fișierele InfoPlist.strings pentru fiecare limbă suportată.
Absența cheii NS necesare la apelarea unui API cu acces la date private provoacă un crash al aplicației. Sistemul termină procesul cu o excepție, vizibilă doar în logurile rapoartelor de crash din Xcode sau Firebase Crashlytics. Utilizatorul vede doar închiderea bruscă a aplicației fără nicio explicație. Prin urmare, înainte de a adăuga o nouă funcționalitate care folosește camera, microfonul sau geolocalizarea, trebuie mai întâi să adăugați cheia de confidențialitate corespunzătoare în Info.plist, apoi să implementați apelul API.
Cheia CFBundleURLTypes înregistrează scheme URL personalizate pentru linkuri profunde în aplicație. Acest lucru permite deschiderea aplicației din browser, email sau alte aplicații prin linkuri de forma aplicațiamea://profil/123. Fiecare schemă identifică aplicația în mod unic: dacă două aplicații înregistrează aceeași schemă, sistemul afișează utilizatorului un dialog de alegere.
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>com.itsectr.myapp</string>
<key>CFBundleURLSchemes</key>
<array>
<string>myapp</string>
</array>
</dict>
</array>
Pentru suportul Universal Links este necesară cheia com.apple.developer.associated-domains în fișierul Entitlements, nu în Info.plist. Universal Links funcționează doar dacă există un fișier apple-app-site-association configurat pe server care leagă domeniul de aplicație. Spre deosebire de schemele URL personalizate, Universal Links nu afișează un dialog de confirmare și nu intră în conflict cu alte aplicații, deoarece folosesc linkuri HTTPS, nu scheme personalizate. Cu toate acestea, necesită un domeniu cu un certificat SSL valid.
Schemele personalizate pot intra în conflict cu schemele standard iOS. Se recomandă utilizarea schemelor cu o lungime de cel puțin 4 caractere pentru a minimiza coliziunile cu alte aplicații. De exemplu, schema „fb” este prea scurtă și poate cauza conflicte. Este mai bine să folosiți notația inversă: aplicațiamea:// în loc de aplicație://. De asemenea, trebuie reținut că dacă aplicația este ștearsă, dar o altă aplicație a înregistrat aceeași schemă, utilizatorul poate avea un comportament neașteptat la navigarea printr-un link.
Cheia UIBackgroundModes declară capacitățile de fundal ale aplicației. Fiecare mod necesită o descriere corespunzătoare în Info.plist și confirmare în capabilities ale proiectului Xcode. Fără specificarea modului, sistemul poate termina forțat sarcina de fundal după 30 de secunde sau la lipsa resurselor.
<key>UIBackgroundModes</key>
<array>
<string>fetch</string>
<string>remote-notification</string>
<string>location</string>
<string>processing</string>
</array>
Cheia UIApplicationSupportsMultipleScenes activează suportul pentru multitasking pe iPad și Mac Catalyst. Fără această cheie, aplicația nu poate folosi SwiftUI ScenePhase sau UIKit UISceneDelegate pentru gestionarea mai multor ferestre. Pe iPadOS, utilizatorii pot deschide mai multe ferestre ale aceleiași aplicații, pot trage conținut între ele și pot folosi Split View. Dacă aplicația nu suportă modul multi-fereastră, setarea acestei chei la false dezactivează funcționalitatea corespunzătoare.
Cheia LSRequiresIPhoneOS interzice instalarea aplicației pe iPad. Este folosită pentru aplicațiile doar pentru iPhone care nu suportă interfața iPad sau nu au fost adaptate pentru ecranul mare. Cu toate acestea, Apple nu recomandă utilizarea acestei chei fără necesitate, deoarece utilizatorii se așteaptă ca aplicațiile să funcționeze pe toate dispozitivele cu iOS și iPadOS. Dacă aplicația este totuși limitată la iPhone, trebuie să vă asigurați că această cerință este justificată tehnic și menționată în descrierea App Store.
Cheia UIViewControllerBasedStatusBarAppearance controlează stilul barei de stare. Dacă este setată la NO, stilul barei de stare este definit global prin cheia UIStatusBarStyle din Info.plist. Dacă YES (implicit din iOS 7), fiecare ViewController poate gestiona propria bară de stare prin suprascrierea preferredStatusBarStyle. Pentru aplicațiile moderne, se recomandă să lăsați YES pentru a avea o bară de stare diferită pe diferite ecrane, de exemplu deschisă pe fundal întunecat și întunecată pe fundal deschis.
Cheia UIApplicationExitsOnSuspend forțează aplicația să se termine complet la trecerea în modul fundal în loc să fie suspendată. Este folosită rar, doar pentru aplicații cu cerințe înalte de securitate: aplicații bancare sau aplicații pentru lucrul cu date confidențiale. În acest caz, utilizatorul pierde posibilitatea de a reveni rapid la aplicație, iar fiecare pornire are loc de la zero. App Store poate solicita justificarea utilizării acestei chei în timpul revizuirii.
Cheia NSAppTransportSecurity gestionează conexiunile de rețea ale aplicației. Începând cu iOS 9, App Transport Security (ATS) blochează implicit toate conexiunile HTTP, solicitând HTTPS. Pentru a permite temporar cereri HTTP către anumite domenii, se folosește dicționarul NSExceptionDomains în interiorul NSAppTransportSecurity. Pentru dezvoltare, este permisă dezactivarea completă a ATS prin NSAllowsArbitraryLoads = true, dar Apple necesită justificare și nu acceptă astfel de build-uri fără un motiv întemeiat. În build-ul de producție, ATS trebuie să fie activat pentru toate domeniile care interacționează cu datele utilizatorului.
Întrebări frecvente
Fișierul Info.plist se află în folderul proiectului cu numele care coincide cu numele aplicației. În Xcode, este afișat în navigatorul de proiecte în grupul Supporting Files cu o iconiță de carte albastră. De asemenea, poate fi găsit prin căutarea Spotlight în proiect.
Da, Info.plist poate fi editat în orice editor de text sau prin interfața grafică Xcode. Editarea manuală oferă control complet asupra conținutului, dar necesită atenție la sintaxa XML: fiecare directivă <key> de deschidere trebuie să aibă un </key> corespunzător, iar tipurile de date trebuie să corespundă așteptărilor Apple.
În proiectele SwiftUI, Info.plist funcționează identic ca în proiectele UIKit. Suplimentar, poate fi necesară cheia UIApplicationSceneManifest pentru configurarea Scene Configuration, dacă proiectul nu folosește protocolul App pentru gestionarea scenelor. SwiftUI App protocol generează automat configurarea scenelor, dar pentru personalizare este necesară adăugarea manuală a cheilor.
Deschideți Info.plist în Xcode, apăsați pe plus și introduceți numele cheii. Pentru chei personalizate, utilizați prefixul companiei pentru a evita conflictele cu cheile de sistem Apple, de exemplu ITSCustomKey în loc de CustomKey. Tipul valorii (String, Number, Array, Dictionary) se alege în funcție de formatul așteptat al datelor.
Cauze tipice: absența cheilor de confidențialitate pentru permisiunile solicitate, CFBundleIdentifier incorect, neconcordanța versiunii între Info.plist și App Store Connect, valori goale ale cheilor NS. Verificați toate cheile NS pentru API-urile utilizate și asigurați-vă că fiecare descriere conține o explicație relevantă în limba de localizare a aplicației.
Rezumat
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și