Info.plist: какво е това, задължителни ключове и настройка при стартиране

Автор: IT Sectr Публикувано: 2026-05-31 Време за четене: 8 мин

Info.plist е XML файл за конфигурация на iOS и macOS приложения, съдържащ метаданни, разрешения и настройки за стартиране. Той се обработва от системата преди инициализацията на кода на приложението. Според Apple Developer, 2025, без правилно конфигуриран Info.plist приложението не преминава преглед от App Store. Info.plist определя идентификатора на пакета, версията на компилация, исканите разрешения и поддържаните ориентации на екрана.

Основни точки

  • Info.plist — XML речник с ключове за конфигурация на iOS/macOS приложение във формат plist
  • Bundle identifier — уникален идентификатор на приложението в екосистемата на Apple за подписване и услуги
  • Ключове за поверителност (NSCameraUsageDescription) са задължителни за достъп до камера, микрофон и геолокация
  • Персонализирани URL схеми се конфигурират чрез ключа CFBundleURLTypes за дълбоки връзки
  • UIRequiredDeviceCapabilities задава минималните изисквания към устройството за инсталиране от 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

Някои ключове на Info.plist са задължителни за публикуване в App Store. Тяхното отсъствие води до отхвърляне на компилацията на етапа на валидиране. Apple автоматично проверява тези ключове при качване на архива чрез Xcode Organizer или Transporter. Разработчикът трябва да се увери, че всички задължителни полета са попълнени правилно преди изпращане за преглед.

Идентификатори на пакета

Ключът CFBundleIdentifier задава уникален идентификатор на приложението в обърната домейн нотация (com.компания.приложение). Използва се за подписване на код, Push известия, CloudKit, App Groups и много други услуги на Apple. Промяната на идентификатора след публикуване се възприема от App Store като ново приложение и съществуващите потребители няма да получат актуализация. Следователно идентификаторът трябва да остане непроменен през целия жизнен цикъл на приложението.

xml
<key>CFBundleIdentifier</key>
<string>com.itsectr.myapp</string>

Версия на приложението

Ключовете CFBundleShortVersionString (показвана версия) и CFBundleVersion (номер на компилация) се използват от App Store Connect и системата за управление на актуализации. Версията се посочва във формат major.minor.patch. Номерът на компилация трябва да нараства с всяка компилация, качена в App Store Connect, дори ако версията на приложението не се променя. Apple използва CFBundleVersion, за да определи дали компилацията е нова или дубликат на вече качена. Ако номерът на компилация съвпада с предварително качена, се появява грешка ITMS-90161.

xml
<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.

xml
<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.

Персонализирани URL схеми и App Links

Ключът CFBundleURLTypes регистрира персонализирани URL схеми за дълбоки връзки в приложението. Това позволява отваряне на приложението от браузър, имейл или други приложения чрез връзки от вида моетоприложение://профил/123. Всяка схема идентифицира приложението по уникален начин: ако две приложения регистрират една и съща схема, системата показва на потребителя диалогов прозорец за избор.

xml
<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 секунди или при недостиг на ресурси.

xml
<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 проекта?

Файлът Info.plist се намира в папката на проекта с име, съвпадащо с името на приложението. В Xcode той се показва в навигатора на проекти в групата Supporting Files с икона на синя книга. Може също да бъде намерен чрез Spotlight търсене в проекта.

Може ли Info.plist да се редактира ръчно?

Да, Info.plist може да се редактира във всеки текстов редактор или чрез графичния интерфейс на Xcode. Ръчното редактиране дава пълен контрол върху съдържанието, но изисква внимание към синтаксиса на XML: всяка отваряща директива <key> трябва да има съответстваща </key>, а типовете данни трябва да съответстват на очакванията на Apple.

Какво е Info.plist в SwiftUI проекти?

В SwiftUI проекти Info.plist работи идентично както в UIKit проекти. Допълнително може да е необходим ключът UIApplicationSceneManifest за конфигуриране на Scene Configuration, ако проектът не използва App protocol за управление на сцени. SwiftUI App protocol автоматично генерира конфигурация на сцените, но за персонализиране е необходимо ръчно добавяне на ключове.

Как да добавя персонализиран ключ в Info.plist?

Отворете Info.plist в Xcode, натиснете плюс и въведете името на ключа. За персонализирани ключове използвайте префикс на компанията, за да избегнете конфликти със системните ключове на Apple, например ITSCustomKey вместо CustomKey. Типът стойност (String, Number, Array, Dictionary) се избира в зависимост от очаквания формат на данните.

Защо App Store отхвърли компилацията заради Info.plist?

Типични причини: липса на ключове за поверителност за исканите разрешения, грешен CFBundleIdentifier, несъответствие на версията между Info.plist и App Store Connect, празни стойности на NS ключове. Проверете всички NS ключове за използваните API и се уверете, че всяко описание съдържа смислено обяснение на езика за локализация на приложението.

Резюме

  • Info.plist — XML конфигурация на iOS/macOS приложение с метаданни, разрешения и настройки за стартиране
  • CFBundleIdentifier и CFBundleVersion — задължителни ключове за идентификация и публикуване в App Store
  • Ключове за поверителност (NSCameraUsageDescription) са задължителни за достъп до камера, микрофон и други частни API
  • Персонализирани URL схеми се конфигурират чрез CFBundleURLTypes, Universal Links чрез Entitlements и apple-app-site-association
  • UIBackgroundModes декларира фоновите възможности на приложението за коректна работа във фонов режим
  • Липсата на задължителни ключове води до срив на приложението или отхвърляне на компилацията от App Store
  • Редактиране на Info.plist е възможно чрез интерфейса на Xcode или текстов редактор с контрол на XML синтаксиса

Ще разработим мобилно приложение под ключ

IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.

Обсъдете проекта

Прочетете също