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 البيئي للتوقيع والخدمات
  • مفاتيح الخصوصية (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. يجب على المطور التأكد من ملء جميع الحقول الإلزامية بشكل صحيح قبل الإرسال للمراجعة.

معرفات الحزمة

المفتاح CFBundleIdentifier يحدد معرفاً فريداً للتطبيق بترميز النطاق العكسي (com.company.appname). يُستخدم لتوقيع الكود والإشعارات الفورية و 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>

اتجاهات الواجهة المدعومة

المفاتيح UISupportedInterfaceOrientations تحدد اتجاهات الشاشة المدعومة لـ iPhone. بالنسبة لـ iPad، يُستخدم مفتاح منفصل UISupportedInterfaceOrientations~ipad ببادئة الجهاز. يتم تحديد كل اتجاه كسلسلة: UIInterfaceOrientationPortrait، UIInterfaceOrientationLandscapeLeft، UIInterfaceOrientationLandscapeRight، UIInterfaceOrientationPortraitUpsideDown. إذا كان التطبيق يدعم الاتجاه العمودي فقط ولم يكن مخصصاً لـ iPhone فقط، سيرفض App Store البناء إذا تم تحديد العمودي فقط لـ iPad.

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

الأذونات ومفاتيح الخصوصية

منذ iOS 10، تطلب Apple وصفاً لكل إذن مطلوب من خلال مفاتيح ببادئة NS (NeXTStep). يتم عرض الوصف للمستخدم في حوار نظام عند الطلب الأول للوصول إلى APIs الخاصة. يؤدي غياب مفتاح NS المقابل عند استدعاء API يتطلب إذناً إلى إنهاء فوري للتطبيق مع استثناء يتم تسجيله فقط في سجلات الأعطال.

المفتاحالغرض
NSCameraUsageDescriptionالوصول إلى الكاميرا للصور والفيديو
NSPhotoLibraryUsageDescriptionالوصول إلى مكتبة الصور
NSLocationWhenInUseUsageDescriptionالموقع الجغرافي أثناء الاستخدام
NSMicrophoneUsageDescriptionالوصول إلى الميكروفون لتسجيل الصوت
NSContactsUsageDescriptionالوصول إلى جهات اتصال الجهاز

يجب أن يحتوي كل مفتاح خصوصية على وصف مفهوم للمستخدم لسبب الطلب. النصوص الفارغة أو النمطية مثل «لتشغيل التطبيق» أو «يلزم الوصول» تؤدي إلى رفض App Store. يجب أن يشرح الوصف الوظيفة المحددة: «الوصول إلى الكاميرا مطلوب لمسح رموز QR وإنشاء صور الملف الشخصي.» يوصى باستخدام إصدارات مترجمة من الأوصاف عبر ملفات InfoPlist.strings لكل لغة مدعومة.

غياب مفتاح NS المطلوب عند استدعاء API يصل إلى بيانات خاصة يسبب تعطل التطبيق. ينهي النظام العملية مع استثناء لا يظهر إلا في سجلات تقارير الأعطال من Xcode أو Firebase Crashlytics. يرى المستخدم فقط إغلاقاً مفاجئاً للتطبيق دون أي تفسير. لذلك، قبل إضافة وظيفة جديدة تستخدم الكاميرا أو الميكروفون أو الموقع الجغرافي، يجب أولاً إضافة مفتاح الخصوصية المقابل في Info.plist ثم تنفيذ استدعاء API.

Custom URL Schemes و App Links

المفتاح CFBundleURLTypes يسجل مخططات URL مخصصة للروابط العميقة في التطبيق. هذا يسمح بفتح التطبيق من المتصفح أو البريد الإلكتروني أو التطبيقات الأخرى عبر روابط مثل 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 وتأكيداً في إمكانيات مشروع 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 فقط التي لا تدعم واجهة iPad أو لم تتكيف مع الشاشة الكبيرة. لكن Apple لا توصي باستخدام هذا المفتاح دون ضرورة، حيث يتوقع المستخدمون أن تعمل التطبيقات على جميع الأجهزة التي تعمل بنظام iOS و iPadOS. إذا كان التطبيق مقصوراً على iPhone، تأكد من أن هذا المطلب مبرر تقنياً ومذكور في وصف App Store.

المفتاح UIViewControllerBasedStatusBarAppearance يتحكم في نمط شريط الحالة. إذا تم تعيينه إلى NO، يتم تعيين نمط شريط الحالة عالمياً عبر مفتاح Info.plist UIStatusBarStyle. إذا YES (الافتراضي منذ iOS 7)، يمكن لكل ViewController إدارة شريط الحالة الخاص به عبر تجاوز preferredStatusBarStyle. للتطبيقات الحديثة، يوصى بالاحتفاظ بـ YES للحصول على أنماط مختلفة لشريط الحالة على شاشات مختلفة، مثلاً فاتح على خلفية داكنة وداكن على خلفية فاتحة.

المفتاح UIApplicationExitsOnSuspend يجبر التطبيق على الإنهاء الكامل عند الدخول إلى الخلفية بدلاً من التعليق. يُستخدم نادراً، فقط للتطبيقات ذات متطلبات الأمان العالية: التطبيقات المصرفية أو التطبيقات التي تتعامل مع بيانات سرية. في هذه الحالة، يفقد المستخدم القدرة على العودة السريعة للتطبيق، ويبدأ كل تشغيل من حالة نظيفة. قد تطلب Apple تبريراً لاستخدام هذا المفتاح أثناء المراجعة.

المفتاح 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 مطلوباً لتكوين المشهد إذا كان المشروع لا يستخدم بروتوكول App لإدارة المشاهد. يولد بروتوكول App في SwiftUI تكوين المشاهد تلقائياً، لكن التخصيص يتطلب إضافة مفاتيح يدوياً.

كيف يمكن إضافة مفتاح مخصص في Info.plist؟

افتح Info.plist في Xcode، انقر على زر الزائد وأدخل اسم المفتاح. للمفاتيح المخصصة، استخدم بادئة الشركة لتجنب التعارض مع مفاتيح النظام في Apple، مثلاً ITSCustomKey بدلاً من CustomKey فقط. يتم اختيار نوع القيمة (String, Number, Array, Dictionary) حسب تنسيق البيانات المتوقع.

لماذا رفض App Store بنائي بسبب Info.plist؟

الأسباب النموذجية: نقص مفاتيح الخصوصية للأذونات المطلوبة، CFBundleIdentifier غير صحيح، عدم تطابق الإصدار بين Info.plist و App Store Connect، قيم فارغة لمفاتيح NS. تحقق من جميع مفاتيح NS لواجهات API المستخدمة وتأكد من أن كل وصف يحتوي على شرح مفيد بلغة توطين التطبيق.

الخلاصة

  • Info.plist هو تكوين XML لتطبيقات iOS/macOS يحتوي على بيانات وصفية وأذونات وإعدادات تشغيل
  • CFBundleIdentifier و CFBundleVersion مفتاحان إلزاميان للتحديد والنشر في App Store
  • مفاتيح الخصوصية (NSCameraUsageDescription) إلزامية للوصول إلى الكاميرا والميكروفون و APIs الخاصة الأخرى
  • Custom URL schemes تُضبط عبر CFBundleURLTypes، و Universal Links عبر Entitlements و apple-app-site-association
  • UIBackgroundModes يعلن عن إمكانيات الخلفية للتشغيل السليم في الخلفية
  • غياب المفاتيح الإلزامية يؤدي إلى تعطل التطبيق أو رفض بناء App Store
  • تحرير Info.plist متاح عبر واجهة Xcode أو محرر نصوص مع التحكم في بناء XML

سنقوم بتطوير تطبيق جوال جاهز

تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.

مناقشة المشروع

اقرأ أيضًا