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 для подписи и сервисов
  • Privacy-ключи (NSCameraUsageDescription) обязательны для доступа к камере, микрофону и геолокации
  • Custom URL schemes настраиваются через ключ 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. Разработчику необходимо убедиться, что все обязательные поля заполнены корректно перед отправкой на ревью.

Bundle идентификаторы

Ключ CFBundleIdentifier задаёт уникальный идентификатор приложения в обратной нотации домена (com.company.appname). Он используется для подписи кода, 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>

Supported interface orientations

Ключи UISupportedInterfaceOrientations определяют поддерживаемые ориентации экрана для iPhone. Для iPad используется отдельный ключ UISupportedInterfaceOrientations~ipad с суффиксом устройства. Каждая ориентация задаётся строкой: UIInterfaceOrientationPortrait, UIInterfaceOrientationLandscapeLeft, UIInterfaceOrientationLandscapeRight, UIInterfaceOrientationPortraitUpsideDown. Если приложение поддерживает только портретную ориентацию, App Store отклонит сборку, если она не является iPhone-only и указан только портрет для iPad.

xml
<key>UISupportedInterfaceOrientations</key>
<array>
    <string>UIInterfaceOrientationPortrait</string>
    <string>UIInterfaceOrientationLandscapeLeft</string>
</array>

Разрешения и Privacy-ключи

Начиная с iOS 10, Apple требует описания каждого запрашиваемого разрешения через ключи с префиксом NS (NeXTStep). Описание отображается пользователю в системном диалоге при первом запросе доступа к приватным API. Отсутствие соответствующего NS-ключа при вызове API, требующего разрешения, приводит к немедленному завершению приложения с исключением, которое фиксируется только в crash-логах.

КлючНазначение
NSCameraUsageDescriptionДоступ к камере для фото и видео
NSPhotoLibraryUsageDescriptionДоступ к библиотеке фотографий
NSLocationWhenInUseUsageDescriptionГеолокация при активном использовании
NSMicrophoneUsageDescriptionДоступ к микрофону для записи звука
NSContactsUsageDescriptionДоступ к контактам устройства

Каждый Privacy-ключ должен содержать понятное пользователю описание причины запроса. Пустые или шаблонные тексты, например "Для работы приложения" или "Нужен доступ", приводят к отклонению App Store. Описание должно объяснять конкретную функциональность: "Доступ к камере нужен для сканирования QR-кодов и создания фотографий профиля". Рекомендуется использовать локализованные версии описаний через InfoPlist.strings файлы для каждого поддерживаемого языка.

Отсутствие нужного NS-ключа при вызове API с доступом к приватным данным вызывает краш приложения. Система завершает процесс с исключением, что заметно только в логах crash reports из Xcode или Firebase Crashlytics. Пользователь видит только внезапное закрытие приложения без какого-либо объяснения. Поэтому перед добавлением новой функциональности, использующей камеру, микрофон или геолокацию, необходимо сначала добавить соответствующий Privacy-ключ в Info.plist, а затем реализовать вызов API.

Custom URL Schemes и App Links

Ключ CFBundleURLTypes регистрирует кастомные URL-схемы для глубоких ссылок в приложении. Это позволяет открывать приложение из браузера, email или других приложений по ссылкам вида myapp://profile/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" слишком короткая и может конфликтовать. Лучше использовать обратную нотацию: myapp:// вместо app://. Также стоит помнить, что если приложение удалено, но другое приложение зарегистрировало ту же схему, пользователь может получить неожиданное поведение при переходе по ссылке.

Конфигурация запуска и фоновые режимы

Ключ 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-only приложений, которые не поддерживают iPad-интерфейс или не прошли адаптацию под большой экран. Однако Apple не рекомендует использовать этот ключ без необходимости, так как пользователи ожидают, что приложения будут работать на всех устройствах под управлением iOS и iPadOS. Если приложение всё же ограничивается iPhone, необходимо убедиться, что это требование обосновано технически и указано в описании App Store.

Ключ UIViewControllerBasedStatusBarAppearance управляет стилем статус-бара. Если установлен в NO, стиль статус-бара задаётся глобально через Info.plist ключ UIStatusBarStyle. Если 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?

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

Итоги

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

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

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также