ITMS-90683: حل خطأ Missing purpose string في Expo
بقلم Mehdi Azizi
نُشر في ، 6 د
ITMS-90683 رفض آلي من Apple لأن Info.plist ينقصه نص الغرض. أضف المفتاح المذكور في الرسالة إلى ios.infoPlist في Expo، ثم أعد البناء.
ITMS-90683 رفض آلي من Apple: يصلك بالبريد الإلكتروني بعد وقت قصير من إرسال البناء (build)، قبل أي مراجعة بشرية. معناه أن ملف Info.plist ينقصه النص الذي يشرح لماذا يصل التطبيق إلى بيانات حساسة. الحل خطوتان: أضف المفتاح المذكور في الرسالة إلى ios.infoPlist، ثم أعد البناء.
واجهت هذا الخطأ في Solys، تطبيق المنبّه بالألعاب الصغيرة الذي طورته، بسبب بيانات لا يستخدمها التطبيق أصلًا. إليك ما تعنيه الرسالة، ولماذا تصلك، وكيف تتجنبها.
ماذا يعني خطأ ITMS-90683؟
عنوان الرسالة الكامل هو "ITMS-90683: Missing purpose string in Info.plist". تقول الرسالة إن كود تطبيقك يشير إلى واجهة برمجية (API) تتعامل مع بيانات حساسة (الصور، الكاميرا، الميكروفون، الموقع، جهات الاتصال)، وإن ملف Info.plist لا يحتوي على مفتاح الوصف المقابل لها. وتذكر الرسالة اسم هذا المفتاح، مثل NSPhotoLibraryUsageDescription.
جملة الوصف هذه اسمها "purpose string". هي النص الذي يعرضه iOS في نافذة طلب الإذن. وتكتب Apple ذلك في توثيقها عن الوصول إلى الموارد المحمية: ترفض App Review التطبيقات التي يصل كودها إلى هذه الموارد دون purpose string.
هذا ليس رفضًا من مراجع بشري. الفحص آلي ويحدث عند تسليم البناء، قبل دخوله المراجعة، مثل ITMS-91053 الخاص بملف الخصوصية (privacy manifest). يُستبعد البناء وعليك إرسال بناء جديد.
لماذا ترفض Apple تطبيقك رغم أنه لا يستخدم هذه البيانات
هذه هي النقطة المفاجئة. تحلل Apple الكود الموجود في البناء، لا ما يفعله تطبيقك فعلًا. إذا كانت مكتبة مضمّنة في تطبيقك تحتوي على إشارة إلى مكتبة الصور، فالمفتاح مطلوب، حتى لو لم تطلب أي شاشة الوصول إلى الصور أبدًا. وتوضح رسالة Apple ذلك بنفسها: قد تشير مكتبة أو SDK خارجي إلى هذه الواجهات، ويبقى الـ purpose string إلزاميًا.
هذا ما حدث معي في 26 سبتمبر 2026. أثناء تنظيف إعدادات Solys، حذفت المفتاح NSPhotoLibraryUsageDescription، لأن التطبيق لا يلمس أي صورة. فرُفض البناء التالي بخطأ ITMS-90683. السبب: مكتبتان من Expo يستخدمهما التطبيق، expo-image وexpo-file-system، تحتويان على كود يشير إلى مكتبة الصور. البناء السابق مرّ لأن المفتاح كان لا يزال موجودًا.
الدرس: لا تحذف مفتاح وصف "لأنك لا تستخدمه". احذفه فقط عندما لا تبقى أي مكتبة في البناء تشير إلى تلك الواجهة.
المفاتيح الأكثر شيوعًا
NSPhotoLibraryUsageDescription: قراءة الصور أو الكتابة فيها.NSPhotoLibraryAddUsageDescription: إضافة صور دون قراءتها.NSCameraUsageDescription: الكاميرا.NSMicrophoneUsageDescription: الميكروفون.NSLocationWhenInUseUsageDescription: الموقع أثناء الاستخدام.NSContactsUsageDescription: جهات الاتصال.NSUserTrackingUsageDescription: التتبع الإعلاني (App Tracking Transparency).
تشرح Apple كل مفتاح في توثيقها، مثل توثيق NSPhotoLibraryUsageDescription: المفتاح مطلوب بمجرد أن يستخدم التطبيق واجهة تقرأ من مكتبة الصور أو تكتب فيها.
حل ITMS-90683 في تطبيق Expo
- انسخ المفتاح المذكور في بريد Apple. الرسالة تعطيك اسمه بالضبط.
- أضفه إلى إعداداتك تحت
ios.infoPlist، كما يوضح توثيق Expo عن الأذونات:
{
"expo": {
"ios": {
"infoPlist": {
"NSPhotoLibraryUsageDescription": "Solys لا يصل إلى صورك. لا يُطلب هذا الإذن أبدًا."
}
}
}
}
- أعد البناء. يوضح Expo أن تعديل Info.plist لا يمر عبر تحديث عن بُعد، بل يتطلب ملفًا تنفيذيًا (binary) جديدًا.
- أرسل البناء إلى Apple من جديد، ثم اختره في نسختك.
فخ إذا كان تطبيقك مترجمًا: ملفات اللغات تترجم المفتاح، لكنها لا تعلن عنه. يجب أن يوجد المفتاح أولًا في ios.infoPlist (أو في إعدادات الإضافة المعنية). وإلا فقد يتعطل التطبيق عند أول استدعاء.
ماذا تكتب إذا كان تطبيقك لا يستخدم البيانات؟
تطلب Apple وصفًا دقيقًا ومفيدًا ومحددًا. إذا كان تطبيقك يستخدم البيانات فعلًا، فاذكر الغرض منها في جملة واحدة: "يستخدم التطبيق الكاميرا لمسح الرمز الشريطي لتذكرتك."
إذا كان المفتاح موجودًا فقط بسبب مكتبة، فإن Apple تقدم حلين: كتابة الجملة، أو حذف الكود الذي يصل إلى البيانات. وعندما يأتي هذا الكود من مكتبة، لا يمكنك حذفه بسهولة. لذلك كتبت الحقيقة في Solys: "Solys لا يصل إلى صورك. لا يُطلب هذا الإذن أبدًا." هذا اختيار عملي: مرّ البناء التالي عند التسليم، لكنني لا أستطيع أن أؤكد لك أن Apple ستقبل هذه الجملة دائمًا.
اكتشف المفاتيح الناقصة قبل الإرسال
من جذر مشروعك، يعرض هذا الأمر ملفات المكتبات التي يشير كود iOS فيها إلى الواجهات الأكثر مراقبة:
grep -rlE "PHPhotoLibrary|AVCaptureDevice|CLLocationManager|CNContactStore|EKEventStore|ATTrackingManager" \
node_modules/*/ios node_modules/@*/*/ios
كل اسم يقابل نوعًا من البيانات: PHPhotoLibrary للصور، وAVCaptureDevice للكاميرا والميكروفون، وCLLocationManager للموقع، وCNContactStore لجهات الاتصال، وEKEventStore للتقويم، وATTrackingManager للتتبع. لكل نتيجة، تحقق من وجود مفتاح الوصف المقابل في إعداداتك.
هذه الشبكة تلتقط الحالات التي واجهتها. لكنها لا تغني عن قراءة بريد Apple، فهو القائمة الوحيدة الموثوقة، كما هو الحال مع الواجهات غير العامة في ITMS-90338. منذ هذا الرفض، أجري هذا الفحص قبل كل بناء: يستغرق بضع ثوانٍ، بينما يكلفك رفض ITMS-90683 بناءً كاملًا والوقت اللازم لإعادته.
أرسل بناءك دون مفاجآت
يُحل ITMS-90683 بسرعة عندما تعرف كيف تقرؤه، تمامًا مثل ITMS-90725 المتعلق بنسخة Xcode. أما حالات الرفض التي تأتي بعد ذلك من مراجع بشري، فتحتاج إلى نظرة أوسع: الخطوات موجودة في صفحة تطبيق رفضته Apple، وأكثر الأسباب شيوعًا في لماذا ترفض Apple تطبيقًا.
لتتحقق من ملفك قبل الإرسال، يجمع Apple Review Kit قائمة التحقق الخاصة بي ومهارات (skills) لـ Claude Code تراجع مشروعك. وإذا تعثر إرسالك وأردت رأيًا بشريًا، احجز ساعة معي: نراجع مشروعك معًا عبر مكالمة فيديو، على شاشتك. وإذا كنت تحضّر إطلاقك الأول، أجرِ التشخيص المجاني: يرتب لك الخطوات ويرسل لك قائمتي لتجنب رفض Apple.
الأسئلة الشائعة
هل ITMS-90683 رفض من App Review؟
ليس بمعنى مراجع بشري. إنه فحص آلي يُجرى على البناء عند تسليمه، قبل دخوله المراجعة، مثل ITMS-90717 الخاص بالأيقونة. لم يفتح أحد تطبيقك. يُستبعد البناء: عليك تصحيح Info.plist وإرسال بناء جديد.
لماذا تطلب Apple مفتاحًا لبيانات لا يستخدمها تطبيقي؟
لأن Apple تحلل الكود الموجود في البناء، لا سلوك التطبيق. إذا كانت مكتبة مضمّنة تشير إلى مكتبة الصور أو الكاميرا، فمفتاح الوصف مطلوب، حتى لو لم تطلب أي شاشة هذا الوصول أبدًا.
هل يمكن حل ITMS-90683 بتحديث عن بُعد؟
لا. المفتاح الناقص موجود في Info.plist، وهو جزء من الملف التنفيذي. التحديث عن بُعد لا يعدّل هذا الملف: عليك إعادة البناء وإرساله إلى Apple من جديد.
أين أضيف NSPhotoLibraryUsageDescription في مشروع Expo؟
في إعدادات تطبيقك، تحت ios.infoPlist، مع جملة تصف الاستخدام. بعض المكتبات توفر أيضًا إعدادًا خاصًا في إضافتها (plugin)، وقد يضيف مفاتيح أخرى، مثل وضع الخلفية. في الحالتين، يجب أن يوجد المفتاح في الإعدادات الأساسية، لا في ملفات الترجمة فقط.
هل يجب حذف مفاتيح الوصف غير المستخدمة؟
فقط إذا لم تعد أي مكتبة في البناء تشير إلى الواجهة المعنية. وإلا فسيُرفض الإرسال التالي بخطأ ITMS-90683. قبل حذف أي مفتاح، ابحث عن اسم الواجهة في كود iOS الخاص بالمكتبات التي يعتمد عليها مشروعك.