Guideline 2.5.1: واجهات API العامة وتحديث SDK مع Expo
بقلم Mehdi Azizi
نُشر في ، 9 د
تفرض Guideline 2.5.1 استخدام واجهات API العامة فقط، وأن يعمل تطبيقك على إصدار iOS الحالي، وأن تستخدم كل framework لغرضه. مع Expo، افحص الوحدات الأصلية أولًا.
تضع Guideline 2.5.1 أربعة شروط: ألا تستخدم إلا واجهات API العامة، وأن يعمل التطبيق على إصدار iOS الحالي، وأن تتخلى عما توقف Apple دعمه، وأن تستخدم كل framework للغرض المخصص له. مع Expo، نادرًا ما يأتي الخطر من كود JavaScript الخاص بك: بل يأتي من الوحدات الأصلية (native modules) التي تثبّتها ومن الـ SDK الذي تبني به.
أنشر Solys وTradaZen وNolera باستخدام Expo SDK 57. يعتمد Solys على واجهة Screen Time من Apple، وهي framework استخدامه مقيّد. يتناول هذا الدليل قاعدة المراجعة. أما الخطأ الذي يصلك عند رفع الـ build، فاقرأ دليل ITMS-90338. وبالنسبة لأوضاع العمل في الخلفية، وهي في القسم نفسه، اقرأ دليل guideline 2.5.4.
ماذا تقول Guideline 2.5.1؟
القاعدة موجودة في القسم 2.5، «Software Requirements»، من App Review Guidelines: «Apps may only use public APIs and must run on the currently shipping OS. Keep your apps up-to-date and make sure you phase out any deprecated features, frameworks or technologies that will no longer be supported in future versions of an OS. Apps should use APIs and frameworks for their intended purposes and indicate that integration in their app description.»
بوضوح، هناك أربعة التزامات:
- واجهات API العامة فقط، أي الموثقة من Apple.
- تطبيق يعمل على إصدار iOS الحالي، وهو iOS 27 منذ سبتمبر 2026.
- لا شيء متوقف الدعم وسيختفي: تستبدل ما تعلن Apple نهاية عمره.
- كل framework في مكانه، ومذكور في الوصف: HomeKit للمنزل الذكي، وHealthKit للصحة والرياضة، مرتبطًا بتطبيق Health.
ومن هنا عنوان الرفض: «Guideline 2.5.1 - Performance - Software Requirements».
واجهات API العامة: أين يختبئ الخطر في تطبيق Expo
واجهة API الخاصة هي وظيفة في النظام لا توثقها Apple. لا تضمن Apple سلوكها ولا وجودها في الإصدار التالي من iOS، ولهذا هي ممنوعة.
كود JavaScript الخاص بك لا يلمس iOS مباشرة أبدًا: بل يمر عبر وحدات أصلية. وحدات Expo SDK يصونها فريق Expo. أما الوحدات الأخرى فتحمل كودًا لم تكتبه أنت، وApple تفحصه كما لو كان كودك. يوضح دليل ITMS-90683 الآلية نفسها مع نصوص طلب الأذونات: تحكم Apple على الكود الموجود في الـ build، لا على ما يفعله التطبيق.
في Solys، بتاريخ 15 أكتوبر 2026، تحتوي 42 تبعية مباشرة على كود iOS أصلي، منها 14 خارج Expo SDK. من بينها RevenueCat وSentry وAppsFlyer وreact-native-device-activity، الجسر نحو واجهة Screen Time.
يمكن اكتشاف واجهة API خاصة في لحظتين. عند الرفع، قد يُرجع التحليل الآلي في App Store Connect الخطأ ITMS-90338. وأثناء المراجعة، يستشهد المراجِع بالقاعدة 2.5.1.
واجهات API المتوقف دعمها: من UIWebView إلى UIScene
المثال الأشهر هو UIWebView، المكوّن القديم لعرض صفحات الويب. توقفت Apple عن قبوله في التطبيقات الجديدة في أبريل 2020، ثم في التحديثات في ديسمبر 2020. أي مكتبة قديمة كانت لا تزال تشير إليه كانت تمنع الرفع. في Solys، لا يجد البحث المذكور في قائمة التحقق أدناه أي إشارة إليه.
التغيير القادم معلن مسبقًا. تقول المذكرة التقنية TN3187 من Apple: «In the next major release following iOS 26, UIScene lifecycle will be required when building with the latest SDK; otherwise, your app won't launch.» بوضوح، التطبيق المبني بـ SDK الخاص بـ iOS 27 دون دورة الحياة القائمة على المشاهد (scenes) لن يعمل.
ثلاثة تواريخ يجب ربطها:
- منذ أبريل 2026، تشترط Apple استخدام Xcode 26: وهذا موضوع دليل ITMS-90725.
- في أبريل 2027، تعلن صفحة الرفع لدى Apple أن SDK الخاص بـ iOS 27 سيصبح إلزاميًا.
- Expo SDK 58، المتاح كنسخة تجريبية منذ 15 سبتمبر 2026، يولّد إدارة المشاهد مسبقًا، حسب إعلان Expo.
مع Expo SDK 57 وXcode 26، ما زلت تبني بـ SDK الخاص بـ iOS 26: لا شيء ينكسر اليوم. الوحدات التي تعدّل الـ AppDelegate يجب أن تواكب التغيير قبل أبريل 2027.
استخدام frameworks خارج غرضها المخصص
يتحقق المراجِع من أن أي framework حساسة تخدم وظيفة ظاهرة، وأن صفحة تطبيقك تذكرها.
- HealthKit مخصصة للصحة والرياضة. تقول إرشادات الواجهة من Apple: «If your app doesn't provide health and fitness functionality, don't request access to people's private health data.»
- HomeKit مخصصة للمنزل الذكي، ولا شيء غيره.
- PushKit مخصصة لمكالمات الصوت عبر الإنترنت (VoIP). توثيق PushKit واضح: «If you are unable to support CallKit in your app, you cannot use PushKit to handle push notifications.» إشعار VoIP يوقظ التطبيق دون مكالمة هو إساءة استخدام.
- Family Controls، واجهة Screen Time، تتطلب إذنًا خاصًا. يوضح توثيقها: «Before submitting your app to the App Store, you must request permission to use the entitlement.»
بالنسبة لـ Solys، طلبت إذن التوزيع هذا في 23 سبتمبر 2026، ومنحته Apple في اليوم نفسه. الاستخدام مطابق للـ framework: يختار المستخدم التطبيقات التي يريد إيقافها مؤقتًا، ويحظرها Solys لمدة 30 أو 45 أو 60 دقيقة بعد الاستيقاظ. يقول وصف الصفحة ذلك في جملة واحدة: «يستخدم Solys إذن Screen Time من Apple لإيقاف التطبيقات المختارة مؤقتًا.» وهذا ما تطلبه نهاية القاعدة 2.5.1: ذكر هذا التكامل في الوصف.
النسخ التجريبية: نعم لـ TestFlight، لا لـ App Store
تُظهر ملاحظات إصدار App Store Connect القاعدة عمليًا. في 14 أكتوبر 2026، قُبلت الـ builds المبنية بـ Xcode 27.2 beta 3 «for internal and external testing»، أي لـ TestFlight. وفي 5 أكتوبر، قُبلت builds الخاصة بـ Xcode 27.1 RC «for the App Store».
الـ build المبني بنسخة تجريبية من Xcode يذهب إلى TestFlight، ولا يذهب إلى المراجعة أبدًا. للإرسال، تحتاج إلى نسخة نهائية، أو نسخة RC فتحتها Apple لـ App Store.
توضيحان لتطبيق Expo:
- النسخة التجريبية من Expo ليست نسخة تجريبية من Apple. تتحقق Apple من إصدار Xcode وiOS SDK، لا من إصدار Expo. وأضاف إعلان SDK 58 أن صور EAS المزودة بـ Xcode 27 ستصل قريبًا.
- الاختبار على iOS الحالي يبقى إلزاميًا، حتى لو كنت تبني بـ SDK الخاص بـ iOS 26. شغّل التطبيق من حالة الإغلاق التام على iPhone أو محاكٍ محدَّث.
قائمة التحقق: التبعيات الأصلية قبل الإرسال
راجعها قبل كل build إنتاجي. تُنفَّذ الأوامر من جذر مشروع Expo:
npx expo-doctor
npx expo install --check
grep -rlw "UIWebView" node_modules --include='*.m' --include='*.mm' --include='*.swift' --include='*.h'
npx expo-doctorلا يُظهر أي فشل. في Solys، بتاريخ 15 أكتوبر 2026: نجح 20 فحصًا من 21. جاء الفشل من 13 حزمة Expo متأخرة بتصحيح واحد، يوحّدهاnpx expo install --check.- كل وحدة خارج Expo SDK موجودة في React Native Directory. يجري Expo Doctor هذا الفحص افتراضيًا، كما يوضح توثيق Expo. أي حزمة مجهولة تستحق قراءة كود iOS الخاص بها.
- كل وحدة أصلية تواكب إصدار React Native لديك. يربط جدول إصدارات Expo بين SDK 57 وReact Native 0.86. الوحدة التي لم يُنشر لها إصدار منذ عدة إصدارات علامة تحذير.
- البحث عن UIWebView لا يُرجع شيئًا. افعل الشيء نفسه مع أي API تعلن Apple نهاية عمرها.
- كل framework حساسة لها وظيفتها الظاهرة: الصحة، Screen Time، المكالمات، المنزل. الوصف يذكرها، والإذن الخاص ممنوح.
- الـ build مبني بنسخة نهائية من Xcode. تحقق من الإصدار في سجلات بناء EAS.
- التطبيق يعمل من حالة الإغلاق التام على إصدار iOS الحالي، بحساب جديد.
- الوحدات التي تمس الـ AppDelegate تعلن دعمها لـ UIScene قبل انتقالك إلى SDK الخاص بـ iOS 27.
كيف ترد على رفض بسبب 2.5.1؟
تذكر الرسالة عادةً الـ API أو الـ framework المعنية. هناك حالتان:
- الـ framework لا تخدم أي شيء ظاهر: احذف الوحدة أو القدرة (capability)، وأعد بناء الـ build، ثم رد في جملتين.
- الـ framework تخدم وظيفة حقيقية: أعطِ المسار الدقيق، ولقطة شاشة أو فيديو قصيرًا، واذكر التكامل في وصف الصفحة.
حذف وحدة أصلية يغيّر الملف التنفيذي: التحديث عن بُعد لا يكفي. يشرح دليل guideline 2.1 لماذا لا يرى المراجِع إلا الكود المضمَّن. بعد ذلك تجري المحادثة في App Store Connect، كما في دليل الرد على App Review.
افحص مشروعك قبل الرفع
يجمع Review Kit قائمة التحقق التي أستخدمها قبل الرفع، وحالات الرفض التي صححتها، وskills لـ Claude Code تراجع مشروع Expo الخاص بك. وإن أردت نظرة بشرية، احجز ساعة معي: نقرأ معًا رسالة Apple وتبعياتك. الطريقة الكاملة موجودة في صفحة تطبيق رفضته Apple.
هل تستعد لإطلاقك الأول؟ أجرِ التشخيص المجاني: يرسل لك قائمة التحقق التي أستخدمها لتجنب رفض Apple.
الأسئلة الشائعة
ماذا يعني «Guideline 2.5.1 - Performance - Software Requirements»؟
هذا عنوان الرفض عندما ترى Apple أن تطبيقك يستخدم API غير عامة، أو تقنية متوقفًا دعمها، أو framework خارج غرضها المخصص. تذكر الرسالة عادةً العنصر المعني.
ما الفرق بين Guideline 2.5.1 والخطأ ITMS-90338؟
ITMS-90338 خطأ آلي يصلك عند رفع الـ build، عندما يكتشف التحليل رمزًا غير عام. أما 2.5.1 فهي قاعدة مراجعة يطبقها شخص، وتشمل أيضًا إساءة استخدام الـ frameworks والتقنيات المتوقف دعمها.
هل يمكن إرسال تطبيق مبني بنسخة تجريبية من Xcode؟
لا. يقبل App Store Connect هذه الـ builds لـ TestFlight فقط. للمراجعة، ابنِ بنسخة نهائية من Xcode، أو بنسخة RC فتحتها Apple لـ App Store في ملاحظات الإصدار.
هل يمكن لتطبيق Expo أن يستخدم API خاصة دون أن يعلم؟
نعم، عبر وحدة أصلية من طرف ثالث. كود JavaScript الخاص بك لا يستدعي iOS بنفسه، لكن كل حزمة أصلية تضم كود Objective-C أو Swift. راجع قائمة الوحدات الموجودة خارج Expo SDK قبل كل إصدار.
هل يجب الانتقال إلى Expo SDK 58 فورًا؟
ليس من أجل 2.5.1 بتاريخ 15 أكتوبر 2026: SDK 57 يبني بـ SDK الخاص بـ iOS 26، وما زال مقبولًا. خطط للترقية قبل أبريل 2027، حين ستشترط Apple SDK الخاص بـ iOS 27 ودورة الحياة القائمة على المشاهد.

