Entitlements sunt drepturi și permisiuni digitale atribuite aplicației în faza de semnare a codului, care determină accesul la funcțiile protejate ale sistemului de operare Apple. Spre deosebire de permisiunile utilizatorului, Entitlements sunt verificate de sistem la pornirea aplicației și nu pot fi modificate de utilizator. Potrivit Apple Developer Documentation (2025), configurarea corectă a Entitlements este obligatorie pentru utilizarea iCloud, notificărilor Push și App Groups. Entitlements sunt un element cheie al modelului de securitate iOS și macOS.
Principalele puncte
Entitlements (din engleză — „drepturi”) — este o pereche cheie-valoare care este inclusă în semnătura de cod a aplicației în faza de construire și determină la ce funcții și date de sistem are acces aplicația. Entitlements sunt încorporate în modelul de securitate Apple de la apariția iOS SDK și sunt obligatorii pentru toate aplicațiile distribuite prin App Store.
Conceptul Entitlements diferă de permisiunile tradiționale (permissions) din Android. Dacă permisiunile Android sunt solicitate de la utilizator în momentul primei utilizări a funcției, Entitlements în iOS sunt verificate de sistem la pornirea aplicației pe baza semnăturii digitale. Utilizatorul nu poate revoca sau modifica un entitlement — acest drept este acordat dezvoltatorului prin App Store Connect și fixat în profilul de semnare.
Fiecare entitlement are o destinație și un format strict definite. De exemplu, com.apple.security.application-groups permite accesul la un container comun pentru un set de aplicații ale aceluiași dezvoltator, iar aps-environment activează suportul pentru notificări Push. Apple analizează manual solicitările de entitlements în procesul App Review, ceea ce previne abuzul de drepturi.
Entitlements sunt clasificate după destinația funcțională în mai multe categorii. Servicii de sistem — iCloud, Push Notifications, Siri. Securitate și date — Keychain Access Groups, App Groups, Data Protection. Rețea și comunicații — Multipath TCP, VPN, Hotspot Configuration. Capabilități hardware — Camera, Microphone, Bluetooth (prin capabilities asociate).
Xcode grupează entitlements asociate în Capabilities — comutatoare de nivel înalt în fila Signing & Capabilities. Activarea unei Capability adaugă automat entitlements necesare în fișierul .entitlements. De exemplu, activarea Capability Push Notifications adaugă entitlement aps-environment cu valoarea development sau production, iar activarea iCloud adaugă un set de entitlements pentru CloudKit și Key-Value storage.
Unele capabilities necesită configurare suplimentară pe portalul Apple Developer. De exemplu, pentru App Groups trebuie înregistrat un identificator de grup pe portal, după care devine disponibil pentru selecție în Xcode. Pentru Push Notifications trebuie generată o cheie APNs sau un certificat. Fără acești pași preliminari, entitlement nu va funcționa chiar și cu un fișier .entitlements corect.
Entitlement com.apple.security.application-groups permite mai multor aplicații ale aceluiași dezvoltator să aibă un container comun în sistemul de fișiere. Acesta este utilizat pentru partajarea datelor între aplicația principală și extensii (Widget, Watch App, Share Extension). Toate aplicațiile dintr-un grup pot citi și scrie fișiere în directorul comun /Library/Group Containers/.
Keychain Access Groups (cheia keychain-access-groups) — un alt entitlement important, care permite aplicațiilor dintr-un grup accesul comun la elementele Keychain. Acest lucru este esențial pentru implementarea autentificării unificate: utilizatorul se autentifică într-o aplicație și obține automat acces la același cont în altă aplicație fără a reintroduce parola.
Configurarea Entitlements se realizează în Xcode în fila Signing & Capabilities din setările targetului. Dezvoltatorul selectează Capabilities necesare din listă, iar Xcode creează sau actualizează automat fișierul .entitlements. Acest fișier este stocat în proiect în format XML cu structură plist și conține toate cheile entitlements pentru acest 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>
La crearea manuală a fișierului entitlement, este important să se respecte formatul cheilor și prefixurile. Entitlements Apple folosesc stilul de domeniu inversat (com.apple.*). Entitlements personalizate pentru propriile scopuri sunt de asemenea posibile, dar trebuie înregistrate pe portalul dezvoltatorului. Xcode oferă completare automată pentru toate cheile standard de entitlements.
Pentru depanarea Entitlements utilizați comanda codesign în terminalul macOS. Comanda codesign -d --entitlements :- <calea_către_aplicație> afișează toate entitlements cu care este semnată aplicația. Acest lucru este util pentru diagnosticarea problemelor: dacă entitlement lipsește din rezultat, aplicația nu va primi acces la funcția corespunzătoare indiferent de setările din Xcode.
Deși Xcode generează fișierul entitlement automat la activarea Capabilities, dezvoltatorii experimentați îl creează sau editează adesea manual pentru o reglare fină. Fișierul are extensia .entitlements și formatul plist (XML). În el se pot adăuga chei entitlement personalizate care nu sunt prezente în interfața Xcode sau se pot combina entitlements din diferite capabilities într-un singur fișier.
La editarea manuală este important să se monitorizeze corectitudinea sintactică a XML-ului. O eroare în structura plist va face ca entitlements să nu fie aplicate la semnare. Xcode verifică fișierul .entitlements în etapa de compilare și afișează o eroare la format incorect. Pentru proiecte complexe cu mai multe targeturi și extensii, se recomandă stocarea cheilor comune de entitlement în fișiere separate și importarea lor prin Build Settings.
// cli: verificarea entitlements ale aplicației instalate
codesign -d --entitlements :- /Applications/Safari.app
// Exemplu de ieșire care conține lista entitlements active
<dict>
<key>com.apple.security.ts.apple-wifi</key>
<true/>
<key>com.apple.security.network.client</key>
<true/>
</dict>
Entitlements joacă un rol cheie în modelul de securitate Apple. Deoarece entitlements fac parte din semnătura digitală a aplicației, falsificarea lor este imposibilă fără resemnarea codului. Apple verifică entitlements la mai multe niveluri: la construire, Xcode semnează entitlements împreună cu fișierul executabil; la instalare, sistemul verifică integritatea semnăturii; la pornire, verifică din nou entitlements.
Una dintre cerințele importante de securitate este principiul entitlement minim. Dezvoltatorul trebuie să activeze doar acele entitlements care sunt efectiv utilizate în aplicație. Entitlements inutile măresc suprafața de atac și pot duce la respingerea aplicației în App Review. Apple verifică explicit conformitatea entitlements cu funcționalitatea aplicației.
Unele entitlements sunt considerate sensibile (sensitive) și necesită aprobarea suplimentară a Apple. Acestea includ: com.apple.developer.healthkit (HealthKit), com.apple.developer.passkit (Wallet), com.apple.developer.authentication-services.authentication (Sign in with Apple) și com.apple.developer.nfc.readersession.formats (NFC). Pentru obținerea acestor entitlements, trebuie justificată necesitatea lor în procesul App Review.
La lucrul cu entitlements este important să se țină cont de diferențele dintre iOS și macOS. Aplicațiile desktop macOS (Sandboxed) au un set mai larg de entitlements comparativ cu iOS. De exemplu, entitlement com.apple.security.temporary-exception.* permite ocolirea temporară a sandbox-ului pentru anumite operațiuni — în iOS astfel de entitlements lipsesc complet.
Entitlements sunt strâns legate de profilele de semnare (Provisioning Profiles). Profilul de semnare este un fișier care leagă certificatul dezvoltatorului, lista dispozitivelor permise și setul de entitlements pentru o aplicație specifică. La instalarea aplicației, sistemul compară entitlements din cod cu entitlements din profilul de semnare. Dacă entitlement este prezent în cod, dar lipsește din profil, aplicația nu va primi acces la funcția corespunzătoare.
Pentru diagnosticarea problemelor legate de entitlements, verificați mai întâi profilul de semnare. Xcode generează automat profile pe baza capability selectate pe portalul Apple Developer. Dacă capability a fost adăugată în Xcode, dar nu este activă pe portal, aplicația va eșua cu eroare de semnare la încercarea de a utiliza o funcție protejată.
Să analizăm cele mai frecvent utilizate entitlements în dezvoltarea iOS. aps-environment (Push Notifications) — obligatoriu pentru trimiterea notificărilor push. com.apple.developer.ubiquity-container-identifiers (iCloud) — pentru sincronizarea datelor prin CloudKit. com.apple.security.application-groups — pentru partajarea datelor între aplicații și extensii. com.apple.developer.associated-domains — pentru Universal Links și Handoff.
Pentru fiecare dintre aceste entitlements există o procedură strictă de configurare. Push Notifications necesită generarea unei chei APNs pe portalul Apple Developer și activarea capability în Xcode. După aceasta, entitlement este adăugat automat în fișierul .entitlements. iCloud necesită configurarea unui container pe portal și selectarea lui în Xcode din lista derulantă.
Associated Domains — entitlement care leagă aplicația de un domeniu web. Este utilizat pentru Universal Links (linkuri profunde care se deschid direct în aplicație) și Handoff (continuarea lucrului pe alt dispozitiv Apple). Valoarea entitlement conține un array de șiruri în format applinks:example.com. Pentru funcționare, este necesară plasarea fișierului apple-app-site-association pe server.
Tabelul entitlements populare și destinația lor:
| Entitlement Key | Destinație | Necesită revizuire |
|---|---|---|
| aps-environment | Notificări Push | Nu |
| com.apple.developer.ubiquity-* | Sincronizare iCloud | Nu |
| application-groups | Container comun al aplicațiilor | Nu |
| com.apple.developer.healthkit | Date HealthKit | Da |
| com.apple.developer.nfc.* | Citire etichete NFC | Da |
| associated-domains | Universal Links | Nu |
Întrebări frecvente
Entitlements sunt drepturi statice încorporate în semnătura aplicației și verificate de sistem la pornire. Permissions sunt permisiuni dinamice solicitate de la utilizator în runtime (cameră, geolocație).
Utilizați comanda codesign -d --entitlements în terminalul macOS. Pentru aplicațiile din App Store, entitlement se verifică prin utilitarul ProvisionQL sau prin Xcode Organizer.
Modificarea entitlements necesită o nouă construire și resemnarea aplicației. Dacă entitlement necesită aprobarea Apple, va trebui să treceți din nou prin App Review. Fără resemnare, modificarea entitlements este imposibilă.
Fișierul .entitlements — un document XML în format plist stocat în proiectul Xcode. Acesta conține lista tuturor entitlements ale aplicației în formă structurată și este semnat împreună cu fișierul executabil.
Capabilities — comutatoare de nivel înalt în fila Signing & Capabilities din Xcode. Activarea unei capability adaugă automat entitlements corespunzătoare în fișierul .entitlements și configurează profilul de semnare.
Rezumat
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și