Entitlements هي حقوق وأذونات رقمية تُمنح للتطبيق أثناء مرحلة توقيع الكود وتحدد الوصول إلى الميزات المحمية لنظام تشغيل Apple. على عكس أذونات المستخدم، يتم فحص Entitlements بواسطة النظام عند بدء تشغيل التطبيق ولا يمكن تغييرها من قبل المستخدم. وفقًا لـ وثائق مطوري Apple (2025)، فإن التكوين الصحيح لـ Entitlements إلزامي لاستخدام iCloud والإشعارات الفورية ومجموعات التطبيقات. Entitlements هي عنصر رئيسي في نموذج أمان iOS وmacOS.
النقاط الرئيسية
Entitlements (تُرجمت من الإنجليزية كـ «حقوق») هي أزواج مفتاح-قيمة مُدرجة في توقيع كود التطبيق أثناء مرحلة البناء وتحدد إمكانيات وبيانات النظام التي يمكن للتطبيق الوصول إليها. تم دمج Entitlements في نموذج أمان Apple منذ إطلاق iOS SDK وهي إلزامية لجميع التطبيقات الموزعة عبر App Store.
يختلف مفهوم Entitlements عن الأذونات التقليدية في Android. بينما تُطلب أذونات Android من المستخدم في لحظة أول استخدام لميزة، يتم التحقق من Entitlements في iOS بواسطة النظام عند بدء تشغيل التطبيق بناءً على التوقيع الرقمي. لا يمكن للمستخدم إلغاء أو تغيير entitlement — هذا الحق يُمنح للمطور عبر App Store Connect ويُدمج في ملف التزويد.
كل entitlement له غرض وتنسيق محددان بدقة. على سبيل المثال، com.apple.security.application-groups يسمح بالوصول إلى حاوية مشتركة لمجموعة من تطبيقات نفس المطور، بينما aps-environment يفعل دعم الإشعارات الفورية. تراجع Apple طلبات entitlements يدويًا أثناء عملية مراجعة التطبيق، مما يمنع إساءة استخدام الحقوق.
تُصنف Entitlements حسب الغرض الوظيفي إلى عدة فئات. خدمات النظام — iCloud، الإشعارات الفورية، Siri. الأمان والبيانات — مجموعات الوصول إلى Keychain، مجموعات التطبيقات، حماية البيانات. الشبكة والاتصال — Multipath TCP، VPN، تكوين نقطة الاتصال. إمكانيات الأجهزة — الكاميرا، الميكروفون، Bluetooth (عبر capabilities ذات الصلة).
يقوم Xcode بتجميع entitlements ذات الصلة في Capabilities — مفاتيح تبديل عالية المستوى في علامة التبويب Signing & Capabilities. يؤدي تمكين Capability إلى إضافة entitlements الضرورية تلقائيًا إلى ملف .entitlements. على سبيل المثال، تمكين Capability الإشعارات الفورية يضيف entitlement aps-environment بقيمة development أو production، بينما تمكين iCloud يضيف مجموعة من entitlements لـ CloudKit وتخزين Key-Value.
تتطلب بعض capabilities تكوينًا إضافيًا على بوابة Apple Developer. على سبيل المثال، App Groups يتطلب تسجيل معرف المجموعة على البوابة، وبعد ذلك يصبح متاحًا للاختيار في Xcode. للإشعارات الفورية، يجب إنشاء مفتاح أو شهادة APNs. بدون هذه الخطوات الأولية، لن يعمل entitlement حتى مع وجود ملف .entitlements صحيح.
يسمح entitlement com.apple.security.application-groups لتطبيقات متعددة لنفس المطور بمشاركة حاوية مشتركة على نظام الملفات. يُستخدم لمشاركة البيانات بين التطبيق الرئيسي والإضافات (Widget، Watch App، Share Extension). يمكن لجميع التطبيقات في نفس المجموعة قراءة وكتابة الملفات في الدليل المشترك /Library/Group Containers/.
مجموعات الوصول إلى Keychain (مفتاح keychain-access-groups) هو entitlement مهم آخر يسمح للتطبيقات من نفس المجموعة بمشاركة الوصول إلى عناصر Keychain. هذا أمر بالغ الأهمية لتنفيذ تسجيل الدخول الموحد: يسجل المستخدم الدخول في تطبيق واحد ويحصل تلقائيًا على الوصول إلى نفس الحساب في تطبيق آخر دون إعادة إدخال كلمة المرور.
يتم تكوين Entitlements في Xcode في علامة التبويب Signing & Capabilities في إعدادات الهدف. يختار المطور Capabilities المطلوبة من القائمة، ويقوم Xcode تلقائيًا بإنشاء أو تحديث ملف .entitlements. يتم تخزين هذا الملف في المشروع بتنسيق XML بهيكل plist ويحتوي على جميع مفاتيح entitlements لهذا الهدف.
<?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 يدويًا، من المهم اتباع تنسيق المفاتيح والبادئات. تستخدم entitlements Apple نمط النطاق العكسي (com.apple.*). كما أن entitlements المخصصة لأغراضك الخاصة ممكنة، ولكن يجب تسجيلها على بوابة المطور. يوفر Xcode الإكمال التلقائي لجميع مفاتيح entitlements القياسية.
لتصحيح أخطاء Entitlements، استخدم الأمر codesign في terminal لنظام macOS. الأمر codesign -d --entitlements :- <مسار_التطبيق> يعرض جميع entitlements التي تم توقيع التطبيق بها. هذا مفيد لتشخيص المشكلات: إذا كان entitlement مفقودًا من المخرجات، فلن يحصل التطبيق على الوصول إلى الوظيفة المقابلة بغض النظر عن إعدادات Xcode.
على الرغم من أن Xcode يُنشئ ملف entitlement تلقائيًا عند تمكين Capabilities، غالبًا ما يقوم المطورون ذوو الخبرة بإنشائه أو تحريره يدويًا للضبط الدقيق. الملف له امتداد .entitlements وتنسيق plist (XML). يمكن إضافة مفاتيح entitlement مخصصة غير موجودة في واجهة Xcode، أو دمج entitlements من capabilities مختلفة في ملف واحد.
عند التحرير يدويًا، من المهم ضمان الصحة النحوية لـ XML. سيؤدي خطأ في هيكل plist إلى عدم تطبيق entitlements أثناء التوقيع. يتحقق Xcode من ملف .entitlements في وقت الترجمة ويخرج خطأ إذا كان التنسيق غير صحيح. للمشاريع المعقدة ذات الأهداف والإضافات المتعددة، يُوصى بتخزين مفاتيح entitlement المشتركة في ملفات منفصلة واستيرادها عبر Build Settings.
// cli: checking entitlements of an installed application
codesign -d --entitlements :- /Applications/Safari.app
// Example output contains a list of active 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 غير الضرورية تزيد من سطح الهجوم وقد تتسبب في رفض التطبيق أثناء مراجعة التطبيق. تتحقق Apple صراحة من تطابق entitlements مع وظائف التطبيق.
تعتبر بعض entitlements حساسة وتتطلب موافقة إضافية من 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، يجب تبرير ضرورتها أثناء عملية مراجعة التطبيق.
عند العمل مع entitlements، من المهم مراعاة الاختلافات بين iOS وmacOS. تطبيقات سطح المكتب macOS (Sandboxed) لديها مجموعة أوسع من entitlements مقارنة بـ iOS. على سبيل المثال، entitlement com.apple.security.temporary-exception.* يسمح بتجاوز sandbox مؤقتًا لعمليات معينة — مثل هذه entitlements غائبة تمامًا في iOS.
ترتبط Entitlements ارتباطًا وثيقًا بملفات التزويد (Provisioning Profiles). ملف التزويد هو ملف يربط شهادة المطور، وقائمة الأجهزة المسموح بها، ومجموعة من entitlements لتطبيق معين. عند تثبيت تطبيق، يقارن النظام entitlements في الكود مع entitlements في ملف التزويد. إذا كان entitlement موجودًا في الكود ولكنه غائب عن ملف التزويد، فلن يحصل التطبيق على الوصول إلى الوظيفة المقابلة.
لتشخيص مشكلات entitlements، تحقق أولاً من ملف التزويد. يُنشئ Xcode تلقائيًا ملفات التزويد بناءً على capabilities المحددة على بوابة Apple Developer. إذا تمت إضافة capability في Xcode ولكنها غير نشطة على البوابة، فسيتعطل التطبيق مع خطأ في التوقيع عند محاولة استخدام وظيفة محمية.
دعنا نلقي نظرة على entitlements الأكثر استخدامًا في تطوير iOS. aps-environment (الإشعارات الفورية) — إلزامي لإرسال الإشعارات الفورية. com.apple.developer.ubiquity-container-identifiers (iCloud) — لمزامنة البيانات عبر CloudKit. com.apple.security.application-groups — لمشاركة البيانات بين التطبيقات والإضافات. com.apple.developer.associated-domains — للروابط العامة و Handoff.
كل من هذه entitlements له إجراء تكوين صارم. الإشعارات الفورية تتطلب إنشاء مفتاح APNs على بوابة Apple Developer وتمكين capability في Xcode. بعد ذلك، يتم تعيين entitlement تلقائيًا في ملف .entitlements. iCloud يتطلب تكوين حاوية على البوابة واختيارها في Xcode من القائمة المنسدلة.
Associated Domains — entitlement يربط التطبيق بنطاق ويب. يُستخدم للروابط العامة (روابط عميقة تفتح مباشرة في التطبيق) و Handoff (مواصلة العمل على جهاز Apple آخر). يحتوي قيمة entitlement على مصفوفة من السلاسل بتنسيق applinks:example.com. يتطلب وضع ملف apple-app-site-association على الخادم.
جدول entitlements الشائعة وأغراضها:
| مفتاح Entitlement | الغرض | يتطلب مراجعة |
|---|---|---|
| aps-environment | الإشعارات الفورية | لا |
| com.apple.developer.ubiquity-* | مزامنة iCloud | لا |
| application-groups | حاوية التطبيقات المشتركة | لا |
| com.apple.developer.healthkit | بيانات HealthKit | نعم |
| com.apple.developer.nfc.* | قراءة علامات NFC | نعم |
| associated-domains | الروابط العامة | لا |
الأسئلة الشائعة
Entitlements هي حقوق ثابتة مدمجة في توقيع التطبيق ويتم التحقق منها بواسطة النظام عند بدء التشغيل. الأذونات هي تصاريح ديناميكية تُطلب من المستخدم في وقت التشغيل (الكاميرا، تحديد الموقع الجغرافي).
استخدم الأمر codesign -d --entitlements في terminal لنظام macOS. لتطبيقات App Store، يتم التحقق من entitlements عبر أداة ProvisionQL أو عبر Xcode Organizer.
تغيير entitlements يتطلب بناء جديد وإعادة توقيع التطبيق. إذا كان entitlement يتطلب موافقة Apple، فستحتاج إلى المرور عبر مراجعة التطبيق مرة أخرى. بدون إعادة التوقيع، تغيير entitlements مستحيل.
ملف .entitlements هو مستند XML بتنسيق plist مخزن في مشروع Xcode. يحتوي على قائمة بجميع entitlements التطبيق بشكل منظم ويتم توقيعه مع الملف القابل للتنفيذ.
Capabilities هي مفاتيح تبديل عالية المستوى في علامة التبويب Signing & Capabilities في Xcode. يؤدي تمكين capability إلى إضافة entitlements المقابلة تلقائيًا إلى ملف .entitlements وتكوين ملف التزويد.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا