Info.plist е XML файл за конфигурация на iOS и macOS приложения, съдържащ метаданни, разрешения и настройки за стартиране. Той се обработва от системата преди инициализацията на кода на приложението. Според Apple Developer, 2025, без правилно конфигуриран Info.plist приложението не преминава преглед от App Store. Info.plist определя идентификатора на пакета, версията на компилация, исканите разрешения и поддържаните ориентации на екрана.
Основни точки
Info.plist е файл в XML формат с коренов елемент dict, съдържащ двойки ключ-стойност под формата на property list. Намира се в пакета на приложението и се чете от системата при всяко стартиране преди изпълнението на кода. Форматът plist поддържа низове, числа, масиви, речници, дати и булеви стойности, което позволява описването на сложни конфигурации.
Apple използва Info.plist за определяне на идентичността на приложението, неговите възможности и изисквания. Промяната на някои ключове изисква повторно изграждане на пакета, тъй като те влияят на метаданните, проверявани от App Store при качване на компилация. Например промяната на CFBundleVersion или CFBundleIdentifier след публикуване може да наруши процеса на актуализиране на приложението, тъй като App Store Connect използва тези стойности за идентифициране на версии.
Основните ключове се създават автоматично при създаване на проект в Xcode, но повечето настройки се добавят ръчно с развитието на функционалността на приложението. Xcode предоставя графичен редактор на Info.plist с падащи списъци за стандартните ключове, което намалява риска от правописни грешки. Въпреки това, за сложни конфигурации като Scene Manifest или Background Modes, се препоръчва директно редактиране на изходния XML.
Някои ключове на Info.plist са задължителни за публикуване в App Store. Тяхното отсъствие води до отхвърляне на компилацията на етапа на валидиране. Apple автоматично проверява тези ключове при качване на архива чрез Xcode Organizer или Transporter. Разработчикът трябва да се увери, че всички задължителни полета са попълнени правилно преди изпращане за преглед.
Ключът CFBundleIdentifier задава уникален идентификатор на приложението в обърната домейн нотация (com.компания.приложение). Използва се за подписване на код, Push известия, CloudKit, App Groups и много други услуги на Apple. Промяната на идентификатора след публикуване се възприема от App Store като ново приложение и съществуващите потребители няма да получат актуализация. Следователно идентификаторът трябва да остане непроменен през целия жизнен цикъл на приложението.
<key>CFBundleIdentifier</key>
<string>com.itsectr.myapp</string>
Ключовете CFBundleShortVersionString (показвана версия) и CFBundleVersion (номер на компилация) се използват от App Store Connect и системата за управление на актуализации. Версията се посочва във формат major.minor.patch. Номерът на компилация трябва да нараства с всяка компилация, качена в App Store Connect, дори ако версията на приложението не се променя. Apple използва CFBundleVersion, за да определи дали компилацията е нова или дубликат на вече качена. Ако номерът на компилация съвпада с предварително качена, се появява грешка ITMS-90161.
<key>CFBundleShortVersionString</key>
<string>1.2.0</string>
<key>CFBundleVersion</key>
<string>42</string>
Ключовете UISupportedInterfaceOrientations определят поддържаните ориентации на екрана за iPhone. За iPad се използва отделен ключ UISupportedInterfaceOrientations~ipad с суфикс на устройството. Всяка ориентация се задава чрез низ: UIInterfaceOrientationPortrait, UIInterfaceOrientationLandscapeLeft, UIInterfaceOrientationLandscapeRight, UIInterfaceOrientationPortraitUpsideDown. Ако приложението поддържа само портретна ориентация, App Store ще отхвърли компилацията, освен ако не е само за iPhone и е посочена само портретна ориентация за iPad.
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
</array>
От iOS 10 нататък Apple изисква описание на всяко искано разрешение чрез ключове с префикс NS (NeXTStep). Описанието се показва на потребителя в системен диалогов прозорец при първото искане за достъп до частни API. Отсъствието на съответния NS ключ при извикване на API, изискващо разрешение, води до незабавно прекратяване на приложението с изключение, което се записва само в логовете за сривове.
| Ключ | Предназначение |
|---|---|
| NSCameraUsageDescription | Достъп до камера за снимки и видео |
| NSPhotoLibraryUsageDescription | Достъп до библиотеката със снимки |
| NSLocationWhenInUseUsageDescription | Геолокация при активно използване |
| NSMicrophoneUsageDescription | Достъп до микрофон за запис на звук |
| NSContactsUsageDescription | Достъп до контактите на устройството |
Всеки ключ за поверителност трябва да съдържа разбираемо за потребителя описание на причината за искането. Празни или шаблонни текстове, като «За работа на приложението» или «Изисква се достъп», водят до отхвърляне от App Store. Описанието трябва да обяснява конкретната функционалност: «Достъпът до камера е необходим за сканиране на QR кодове и създаване на профилни снимки». Препоръчва се използването на локализирани версии на описанията чрез файлове InfoPlist.strings за всеки поддържан език.
Отсъствието на необходимия NS ключ при извикване на API с достъп до частни данни причинява срив на приложението. Системата прекратява процеса с изключение, което се вижда само в логовете на отчетите за сривове от Xcode или Firebase Crashlytics. Потребителят вижда само внезапно затваряне на приложението без никакво обяснение. Ето защо, преди добавяне на нова функционалност, използваща камера, микрофон или геолокация, първо трябва да добавите съответния ключ за поверителност в Info.plist, а след това да реализирате извикването на API.
Ключът CFBundleURLTypes регистрира персонализирани URL схеми за дълбоки връзки в приложението. Това позволява отваряне на приложението от браузър, имейл или други приложения чрез връзки от вида моетоприложение://профил/123. Всяка схема идентифицира приложението по уникален начин: ако две приложения регистрират една и съща схема, системата показва на потребителя диалогов прозорец за избор.
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>com.itsectr.myapp</string>
<key>CFBundleURLSchemes</key>
<array>
<string>myapp</string>
</array>
</dict>
</array>
За поддръжка на Universal Links е необходим ключът com.apple.developer.associated-domains във файла Entitlements, а не в Info.plist. Universal Links работят само ако има конфигуриран файл apple-app-site-association на сървъра, който свързва домейна с приложението. За разлика от персонализираните URL схеми, Universal Links не показват диалогов прозорец за потвърждение и не влизат в конфликт с други приложения, тъй като използват HTTPS връзки, а не персонализирани схеми. Те обаче изискват домейн с валиден SSL сертификат.
Персонализираните схеми могат да влизат в конфликт със стандартните схеми на iOS. Препоръчва се използването на схеми с дължина поне 4 знака за минимизиране на сблъсъци с други приложения. Например схемата „fb” е твърде кратка и може да причини конфликти. По-добре е да използвате обърната нотация: моетоприложение:// вместо приложение://. Също така трябва да се помни, че ако приложението бъде изтрито, но друго приложение регистрира същата схема, потребителят може да получи неочаквано поведение при навигация чрез връзка.
Ключът UIBackgroundModes декларира фоновите възможности на приложението. Всеки режим изисква съответно описание в Info.plist и потвърждение в capabilities на Xcode проекта. Без посочване на режим системата може принудително да прекрати фоновата задача след 30 секунди или при недостиг на ресурси.
<key>UIBackgroundModes</key>
<array>
<string>fetch</string>
<string>remote-notification</string>
<string>location</string>
<string>processing</string>
</array>
Ключът UIApplicationSupportsMultipleScenes включва поддръжка за многозадачност на iPad и Mac Catalyst. Без този ключ приложението не може да използва SwiftUI ScenePhase или UIKit UISceneDelegate за управление на множество прозорци. На iPadOS потребителите могат да отварят множество прозорци на едно и също приложение, да влачат съдържание между тях и да използват Split View. Ако приложението не поддържа режим на множество прозорци, задаването на този ключ на false деактивира съответната функционалност.
Ключът LSRequiresIPhoneOS забранява инсталирането на приложението на iPad. Използва се за приложения само за iPhone, които не поддържат iPad интерфейс или не са адаптирани за голям екран. Apple обаче не препоръчва използването на този ключ без необходимост, тъй като потребителите очакват приложенията да работят на всички устройства с iOS и iPadOS. Ако приложението все пак е ограничено до iPhone, уверете се, че това изискване е технически обосновано и е посочено в описанието на App Store.
Ключът UIViewControllerBasedStatusBarAppearance управлява стила на лентата на състоянието. Ако е зададен на NO, стилът на лентата на състоянието се задава глобално чрез ключа UIStatusBarStyle в Info.plist. Ако е YES (по подразбиране от iOS 7), всеки ViewController може да управлява своята лента на състоянието чрез предефиниране на preferredStatusBarStyle. За модерни приложения се препоръчва да оставите YES, за да имате различна лента на състоянието на различни екрани, например светла на тъмен фон и тъмна на светъл фон.
Ключът UIApplicationExitsOnSuspend принуждава приложението напълно да прекрати работа при преминаване във фонов режим вместо да бъде спряно. Използва се рядко, само за приложения с високи изисквания за сигурност: банкови приложения или приложения за работа с поверителни данни. В този случай потребителят губи възможността за бързо връщане към приложението и всяко стартиране става от чисто състояние. App Store може да поиска обосновка за използването на този ключ при преглед.
Ключът NSAppTransportSecurity управлява мрежовите връзки на приложението. От iOS 9 нататък App Transport Security (ATS) блокира по подразбиране всички HTTP връзки, изисквайки HTTPS. За временно разрешаване на HTTP заявки към определени домейни се използва речникът NSExceptionDomains вътре в NSAppTransportSecurity. За разработка е позволено пълно изключване на ATS чрез NSAllowsArbitraryLoads = true, но Apple изисква обосновка и не пропуска такива компилации без сериозна причина. В продукционна компилация ATS трябва да бъде активиран за всички домейни, които взаимодействат с потребителски данни.
Често задавани въпроси
Файлът Info.plist се намира в папката на проекта с име, съвпадащо с името на приложението. В Xcode той се показва в навигатора на проекти в групата Supporting Files с икона на синя книга. Може също да бъде намерен чрез Spotlight търсене в проекта.
Да, Info.plist може да се редактира във всеки текстов редактор или чрез графичния интерфейс на Xcode. Ръчното редактиране дава пълен контрол върху съдържанието, но изисква внимание към синтаксиса на XML: всяка отваряща директива <key> трябва да има съответстваща </key>, а типовете данни трябва да съответстват на очакванията на Apple.
В SwiftUI проекти Info.plist работи идентично както в UIKit проекти. Допълнително може да е необходим ключът UIApplicationSceneManifest за конфигуриране на Scene Configuration, ако проектът не използва App protocol за управление на сцени. SwiftUI App protocol автоматично генерира конфигурация на сцените, но за персонализиране е необходимо ръчно добавяне на ключове.
Отворете Info.plist в Xcode, натиснете плюс и въведете името на ключа. За персонализирани ключове използвайте префикс на компанията, за да избегнете конфликти със системните ключове на Apple, например ITSCustomKey вместо CustomKey. Типът стойност (String, Number, Array, Dictionary) се избира в зависимост от очаквания формат на данните.
Типични причини: липса на ключове за поверителност за исканите разрешения, грешен CFBundleIdentifier, несъответствие на версията между Info.plist и App Store Connect, празни стойности на NS ключове. Проверете всички NS ключове за използваните API и се уверете, че всяко описание съдържа смислено обяснение на езика за локализация на приложението.
Резюме
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също