Entitlements са цифрови права и разрешения, които се присвояват на приложението на етапа на подписване на кода и определят достъпа до защитените функции на операционната система на Apple. За разлика от потребителските разрешения, Entitlements се проверяват от системата при стартиране на приложението и не могат да бъдат променяни от потребителя. Според Apple Developer Documentation (2025), правилната настройка на Entitlements е задължителна за използване на iCloud, Push известия и App Groups. Entitlements са ключов елемент от модела на сигурност на iOS и macOS.
Основни точки
Entitlements (в превод от английски — „права”) — двойка ключ-стойност, която се включва в подписа на кода на приложението на етапа на изграждане и определя до кои системни функции и данни приложението има достъп. Entitlements са вградени в модела на сигурност на Apple от появата на iOS SDK и са задължителни за всички приложения, разпространявани чрез App Store.
Концепцията на Entitlements се различава от традиционните разрешения (permissions) в Android. Докато разрешенията в Android се изискват от потребителя в момента на първото използване на функцията, Entitlements в iOS се проверяват от системата при стартиране на приложението на базата на цифровия подпис. Потребителят не може да оттегли или промени entitlement — това право се предоставя на разработчика чрез App Store Connect и се фиксира в профила за подписване.
Всяко entitlement има строго определено предназначение и формат. Например com.apple.security.application-groups разрешава достъп до споделен контейнер за набор от приложения на един разработчик, а aps-environment активира поддръжка за Push известия. Apple преглежда ръчно заявките за entitlements в процеса App Review, което предотвратява злоупотреба с права.
Entitlements се класифицират по функционално предназначение в няколко категории. Системни услуги — iCloud, Push Notifications, Siri. Сигурност и данни — Keychain Access Groups, App Groups, Data Protection. Мрежа и комуникации — Multipath TCP, VPN, Hotspot Configuration. Хардуерни възможности — Camera, Microphone, Bluetooth (чрез свързани capabilities).
Xcode групира свързаните entitlements в Capabilities — превключватели на високо ниво в раздела Signing & Capabilities. Включването на Capability автоматично добавя необходимите entitlements във файла .entitlements. Например включването на Capability Push Notifications добавя entitlement aps-environment със стойност development или production, а включването на iCloud добавя набор от entitlements за CloudKit и Key-Value storage.
Някои capabilities изискват допълнителна конфигурация на портала Apple Developer. Например за App Groups трябва да регистрирате идентификатор на групата на портала, след което той става достъпен за избор в Xcode. За Push Notifications трябва да генерирате APNs ключ или сертификат. Без тези подготвителни стъпки entitlement няма да работи дори с правилен .entitlements файл.
Entitlement com.apple.security.application-groups позволява на няколко приложения на един разработчик да имат споделен контейнер във файловата система. Това се използва за споделяне на данни между основното приложение и разширенията (Widget, Watch App, Share Extension). Всички приложения от една група могат да четат и записват файлове в споделената директория /Library/Group Containers/.
Keychain Access Groups (ключ keychain-access-groups) — още едно важно entitlement, което позволява на приложения от една група споделен достъп до елементи на Keychain. Това е критично за реализиране на единно удостоверяване: потребителят влиза в едно приложение и автоматично получава достъп до същия акаунт в друго приложение без повторно въвеждане на парола.
Настройването на Entitlements се извършва в Xcode в раздела Signing & Capabilities в настройките на target. Разработчикът избира необходимите Capabilities от списъка и Xcode автоматично създава или актуализира .entitlements файла. Този файл се съхранява в проекта във формат XML със структура plist и съдържа всички ключове entitlements за този target.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.application-groups</key>
<array>
<string>group.com.example.shared</string>
</array>
<key>aps-environment</key>
<string>development</string>
<key>keychain-access-groups</key>
<array>
<string>$(AppIdentifierPrefix)com.example.keychain</string>
</array>
</dict>
</plist>
При ръчно създаване на entitlement файл е важно да се спазва форматът на ключовете и префиксите. Apple Entitlements използват обратен домейн стил (com.apple.*). Персонализирани entitlements за собствени цели също са възможни, но трябва да бъдат регистрирани на портала за разработчици. Xcode предоставя автоматично довършване за всички стандартни ключове entitlements.
За отстраняване на грешки в Entitlements използвайте командата codesign в macOS терминала. Командата codesign -d --entitlements :- <път_до_приложението> показва всички entitlements, с които е подписано приложението. Това е полезно за диагностициране на проблеми: ако entitlement липсва в изхода, приложението няма да получи достъп до съответната функция независимо от настройките в Xcode.
Въпреки че Xcode генерира entitlement файла автоматично при включване на Capabilities, опитните разработчици често го създават или редактират ръчно за фина настройка. Файлът има разширение .entitlements и формат plist (XML). В него могат да се добавят персонализирани entitlement ключове, които не са представени в интерфейса на Xcode, или да се комбинират entitlements от различни capabilities в един файл.
При ръчно редактиране е важно да се следи синтактичната коректност на XML. Грешка в структурата plist ще доведе до неприлагане на entitlements при подписване. Xcode проверява .entitlements файла на етапа на компилация и показва грешка при неправилен формат. За сложни проекти с множество target-ове и разширения се препоръчва съхраняване на общи entitlement ключове в отделни файлове и импортирането им чрез Build Settings.
// cli: проверка на entitlements на инсталирано приложение
codesign -d --entitlements :- /Applications/Safari.app
// Примерният изход съдържа списък на активните entitlements
<dict>
<key>com.apple.security.ts.apple-wifi</key>
<true/>
<key>com.apple.security.network.client</key>
<true/>
</dict>
Entitlements играят ключова роля в модела на сигурност на Apple. Тъй като entitlements са част от цифровия подпис на приложението, тяхното фалшифициране е невъзможно без повторно подписване на кода. Apple проверява entitlements на няколко нива: при изграждане Xcode подписва entitlements заедно с изпълнимия файл; при инсталиране системата проверява целостта на подписа; при стартиране отново верифицира entitlements.
Едно от важните изисквания за сигурност е принципът на минимално entitlement. Разработчикът трябва да включва само тези entitlements, които реално се използват в приложението. Излишните entitlements увеличават повърхността за атака и могат да доведат до отхвърляне на приложението в App Review. Apple изрично проверява съответствието на entitlements с функционалността на приложението.
Някои entitlements се считат за чувствителни (sensitive) и изискват допълнително одобрение от Apple. Те включват: com.apple.developer.healthkit (HealthKit), com.apple.developer.passkit (Wallet), com.apple.developer.authentication-services.authentication (Sign in with Apple) и com.apple.developer.nfc.readersession.formats (NFC). За получаване на тези entitlements трябва да се обоснове необходимостта им в процеса App Review.
При работа с entitlements е важно да се вземат предвид разликите между iOS и macOS. Десктоп приложенията на macOS (Sandboxed) имат по-широк набор от entitlements в сравнение с iOS. Например entitlement com.apple.security.temporary-exception.* позволява временно заобикаляне на пясъчната кутия за определени операции — в iOS такива entitlements напълно липсват.
Entitlements са тясно свързани с профилите за подписване (Provisioning Profiles). Профилът за подписване е файл, който свързва сертификата на разработчика, списъка с разрешени устройства и набора от entitlements за конкретно приложение. При инсталиране на приложението системата сравнява entitlements в кода с entitlements в профила за подписване. Ако entitlement присъства в кода, но липсва в профила, приложението няма да получи достъп до съответната функция.
За диагностициране на проблеми с entitlements първо проверете профила за подписване. Xcode автоматично генерира профили на базата на избраната capability на портала Apple Developer. Ако capability е добавена в Xcode, но не е активна на портала, приложението ще се срине с грешка при подписване при опит за използване на защитена функция.
Нека разгледаме най-често използваните entitlements в iOS разработката. aps-environment (Push Notifications) — задължителен за изпращане на push известия. com.apple.developer.ubiquity-container-identifiers (iCloud) — за синхронизиране на данни чрез CloudKit. com.apple.security.application-groups — за споделяне на данни между приложения и разширения. com.apple.developer.associated-domains — за Universal Links и Handoff.
За всяко от тези entitlements съществува строга процедура за настройка. Push Notifications изискват генериране на APNs ключ на портала Apple Developer и включване на capability в Xcode. След това entitlement се добавя автоматично във файла .entitlements. iCloud изисква конфигуриране на контейнер на портала и избирането му в Xcode от падащ списък.
Associated Domains — entitlement, който свързва приложението с уеб домейн. Използва се за Universal Links (дълбоки връзки, отварящи се директно в приложението) и Handoff (продължаване на работа на друго Apple устройство). Стойността на entitlement съдържа масив от низове във формат applinks:example.com. За функциониране е необходимо поставяне на файла apple-app-site-association на сървъра.
Таблица на популярни entitlements и тяхното предназначение:
| Entitlement Key | Предназначение | Изисква преглед |
|---|---|---|
| aps-environment | Push известия | Не |
| com.apple.developer.ubiquity-* | iCloud синхронизация | Не |
| application-groups | Споделен контейнер на приложения | Не |
| com.apple.developer.healthkit | HealthKit данни | Да |
| com.apple.developer.nfc.* | Четене на NFC етикети | Да |
| associated-domains | Universal Links | Не |
Често задавани въпроси
Entitlements са статични права, вградени в подписа на приложението и проверявани от системата при стартиране. Permissions са динамични разрешения, изисквани от потребителя по време на изпълнение (камера, геолокация).
Използвайте командата codesign -d --entitlements в macOS терминала. За приложения от App Store entitlement се проверява чрез помощната програма ProvisionQL или чрез Xcode Organizer.
Промяната на entitlements изисква ново изграждане и повторно подписване на приложението. Ако entitlement изисква одобрение от Apple, ще трябва да преминете отново през App Review. Без повторно подписване промяната на entitlements е невъзможна.
.entitlements файлът — XML документ във формат plist, съхраняван в Xcode проекта. Той съдържа структуриран списък на всички entitlements на приложението и се подписва заедно с изпълнимия файл.
Capabilities са превключватели на високо ниво в раздела Signing & Capabilities в Xcode. Включването на capability автоматично добавя съответните entitlements в .entitlements файла и конфигурира профила за подписване.
Резюме
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също