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-ја који захтева дозволу доводи до тренутног завршетка апликације са изузетком који се бележи само у crash логовима.
| Кључ | Намена |
|---|---|
| NSCameraUsageDescription | Приступ камери за фотографије и видео |
| NSPhotoLibraryUsageDescription | Приступ библиотеци фотографија |
| NSLocationWhenInUseUsageDescription | Геолокација при активном коришћењу |
| NSMicrophoneUsageDescription | Приступ микрофону за снимање звука |
| NSContactsUsageDescription | Приступ контактима уређаја |
Сваки кључ приватности мора да садржи кориснику разумљив опис разлога захтева. Празни или шаблонски текстови, попут „За рад апликације” или „Потребан приступ”, доводе до одбацивања у App Store-у. Опис треба да објасни специфичну функционалност: „Приступ камери је потребан за скенирање QR кодова и креирање профилних фотографија”. Препоручује се коришћење локализованих верзија описа путем InfoPlist.strings датотека за сваки подржани језик.
Недостак потребног NS кључа при позивању API-ја са приступом приватним подацима изазива падање апликације. Систем завршава процес са изузетком, што је видљиво само у логовима crash извештаја из 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. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође