EAS Submit iOS: نشر تطبيق Expo على App Store
بقلم Mehdi Azizi
نُشر في ، 8 د
يرسل EAS Submit بناء iOS إلى App Store Connect فيظهر في TestFlight، أما الإرسال للمراجعة فيبقى يدويًا. إليك ملف eas.json جاهزًا والأخطاء الشائعة.
eas submit --platform ios يرسل بناء iOS الخاص بك إلى App Store Connect، فيظهر في TestFlight بعد أن تعالجه Apple. الأمر لا يرسل تطبيقك إلى مراجعة Apple: اختيار البناء وإرساله للمراجعة يبقيان عليك في App Store Connect. ولأتمتة الإرسال، يحتاج الأمر إلى رقم صفحة تطبيقك (ascAppId) ومفتاح API لـ App Store Connect.
أنشر تطبيقاتي على iOS، ومنها Solys وTradaZen وNolera، باستخدام Expo وEAS Build وEAS Submit. يتبع هذا الدليل توثيق Expo حول الإرسال على iOS، الذي راجعته في 25 أكتوبر 2026. إن لم يكن لديك Mac، فالمسار الكامل موجود في نشر تطبيق iOS بدون Mac. هنا نركّز على الإرسال فقط.
ما تحتاجه قبل أول أمر
يذكر Expo ثلاثة متطلبات:
- حساب Apple Developer مدفوع. السعر وخطوات التسجيل في حساب مطوّر Apple.
- معرّف حزمة (bundle identifier) في
ios.bundleIdentifier. بحسب مرجع إعدادات Expo، أنت من يختاره، لكن يجب أن يكون فريدًا على App Store. - تثبيت EAS CLI، ثم تنفيذ
eas loginبحساب Expo الخاص بك.
تحتاج أيضًا إلى بناء إنتاج موقَّع. يصنعه EAS Build بالشهادة والملف الشخصي اللذين يديرهما نيابةً عنك، كما يشرح شهادة iOS وملف provisioning profile.
صفحة التطبيق في App Store Connect: أنت أم EAS؟
يرسل EAS Submit ملفًا ثنائيًا إلى تطبيق يجب أن يكون موجودًا في App Store Connect.
يمكنك إنشاؤها بنفسك. مساعدة Apple تصف نافذة New App: المنصة، والاسم، واللغة الأساسية، ومعرّف الحزمة، وSKU، ووصول المستخدمين. يلزمك دور Account Holder أو Admin أو App Manager.
ويمكن لـ EAS أيضًا إنشاؤها عند أول إرسال. بحسب صفحة Expo عن TestFlight، ينشئ eas submit الصفحة عندما ترسل أول بناء لك. ووفق مرجع eas.json، تعبئة ascAppId تتخطى هذه الخطوة. يأتي الاسم من appName، وإلا فمن name في إعداداتك. وتأتي اللغة الأساسية من language، وقيمتها الافتراضية en-US. إن كان تطبيقك سيصدر أولًا بالفرنسية، فاملأ language قبل هذا الإرسال الأول.
بعد ذلك، انسخ رقم الصفحة إلى ascAppId. يوضح Expo مكانه: افتح تطبيقك في App Store Connect، ثم App Information. إنه حقل Apple ID، تحت General Information. إنه رقم، وليس معرّف الحزمة.
لماذا مفتاح API بدلًا من Apple ID
يتصل EAS Submit بـ Apple إما عبر Apple ID الخاص بك أو عبر مفتاح API لـ App Store Connect.
يصطدم Apple ID بالمصادقة الثنائية، التي تفرضها Apple على جميع مستخدمي App Store Connect: يجب أن يؤكد شخص ما تسجيل الدخول. كلمة المرور الخاصة بالتطبيق، الممرّرة في EXPO_APPLE_APP_SPECIFIC_PASSWORD، تتجاوز هذه الخطوة، لكن Expo يعدّها أقل أمانًا من مفتاح API، وهو طريقته الافتراضية والموصى بها. المفتاح يسمح بالمصادقة دون أي تدخل منك، وبالتالي بأتمتة الإرسال.
طريقتان للحصول عليه:
- دع EAS يديره. شغّل
eas credentials --platform ios، واختر الملفproduction، وسجّل الدخول إلى حساب Apple، ثم اختر «App Store Connect: Manage your API Key». - أحضر مفتاحك الخاص. في App Store Connect: Users and Access، تبويب Integrations، ثم App Store Connect API، ثم Team Keys، ثم Generate API Key. يلزمك حساب Admin، ودليل Expo يمنح المفتاح دور Admin.
في الحالة الثانية، دوّن Key ID، الظاهر في قائمة المفاتيح النشطة، وIssuer ID، أعلى صفحة Integrations. واحتفظ قبل كل شيء بملف .p8: لا يمكنك تنزيله إلا مرة واحدة، ولا تحتفظ Apple بأي نسخة منه.
بحسب Apple، يستطيع مفتاح Admin إنشاء مستخدمي حسابك وحذفهم. وتطلب Apple ألا تضع المفتاح أبدًا في مستودع الشيفرة.
ملف eas.json الأدنى للنسخ
كل القيم وهمية: استبدلها بقيمك.
{
"cli": {
"appVersionSource": "remote"
},
"build": {
"production": {
"autoIncrement": true
}
},
"submit": {
"production": {
"ios": {
"ascAppId": "1234567890",
"appleTeamId": "ABCDE12345",
"ascApiKeyPath": "./keys/AuthKey_XXXXXXXXXX.p8",
"ascApiKeyIssuerId": "your-issuer-id",
"ascApiKeyId": "XXXXXXXXXX"
}
}
}
}
appVersionSourceوautoIncrement: تحتفظ خوادم EAS برقم البناء وترفعه مع كل بناء إنتاج. يوصي Expo بهذا الوضع البعيد منذ EAS CLI 12.ascAppId: رقم صفحة تطبيقك. من دونه يفشل الوضع غير التفاعلي.appleTeamId: معرّف فريقك في Apple Developer.ascApiKeyPathوascApiKeyIssuerIdوascApiKeyId: مفتاح API الخاص بك. الحقول الثلاثة تقبل متغيرات البيئة. أضف المجلدkeysإلى ملف.gitignore.
الحقل appleId لا يفيد إلا إذا سجّلت الدخول بـ Apple ID. وإن كان EAS يدير مفتاحك أصلًا، فاحذف أيضًا حقول ascApiKey الثلاثة. في تطبيقاتي الثلاثة، التي راجعتها في 25 أكتوبر، لا يحتوي ملف إرسال الإنتاج إلا على ascAppId، مع appleTeamId في Solys: لا مفتاح في الملف.
تشغيل البناء ثم الإرسال
eas build --platform ios --profile production
eas submit --platform ios
من دون أي خيار آخر، يطلب منك eas submit اختيار البناء المراد إرساله، ويسألك عند أول تشغيل عن Apple ID. ويُعتمد ملف الإرسال production افتراضيًا إن وُجد. يسرد مرجع EAS CLI الخيارات التي تغنيك عن الاختيار:
| الخيار | ما يفعله |
|---|---|
--latest | يرسل آخر بناء iOS |
--id | يرسل بناء EAS محددًا |
--path | يرسل ملف .ipa محليًا |
--url | يرسل أرشيفًا على الإنترنت |
--groups | يضيف إلى مجموعة داخلية |
--what-to-test | يملأ «What to test» |
لربط كل شيء معًا، أضف --auto-submit إلى أمر البناء. بحسب صفحة Expo عن الإرسال التلقائي، يذهب البناء المكتمل إلى EAS Submit بملف الإرسال الذي يحمل اسم ملف البناء نفسه. ولاختيار ملف آخر: --auto-submit-with-profile=name. يذهب البناء إلى TestFlight، لا إلى المراجعة.
في التكامل المستمر (CI)، أضف --non-interactive ورمز EXPO_TOKEN. عندها لا يستطيع الأمر أن يسألك عن شيء: يحتاج إلى ascAppId في الملف وإلى مفتاح API، سواء الذي ربطه EAS بالتطبيق أو مفتاحك في حقول ascApiKey الثلاثة.
ما يحدث بعد الإرسال
1. تعالج Apple البناء. يجب أن يمر بهذه المعالجة قبل أن يظهر في App Store Connect، وترسل لك Apple بريدًا إلكترونيًا عند انتهائها. يتحدث Expo عادةً عن 10 إلى 15 دقيقة قبل أن تراه في TestFlight.
2. الامتثال للتصدير. حالة Missing Compliance تعني أن إقرارك بشأن التشفير ناقص. يطرح App Store Connect هذه الأسئلة مع كل إصدار جديد، إلا إذا كان ملف Info.plist يجيب عنها مسبقًا. مع Expo، اسم المفتاح هو ios.config.usesNonExemptEncryption:
{
"expo": {
"ios": {
"config": {
"usesNonExemptEncryption": false
}
}
}
}
بحسب Apple، تصلح القيمة false إذا كان تطبيقك، بما فيه المكتبات، لا يستخدم أي تشفير أو يستخدم تشفيرًا معفى فقط. وتشفير النظام، مثل HTTPS عبر URLSession، معفى عادةً. لا تصرّح بـ false إلا إذا كان ذلك صحيحًا لتطبيقك: الإقرار يُلزمك. وكأي مفتاح في Info.plist، يتطلب بناءً جديدًا.
3. TestFlight. في حالة Ready to Submit، بحسب Apple، يمكن أن يذهب البناء إلى المختبرين الداخليين، أو يمر بمراجعة النسخة التجريبية للمختبرين الخارجيين، أو يُرسل إلى مراجعة App Store. الحقل groups في الملف يضيفه إلى مجموعاتك الداخلية. كل الباقي في TestFlight لاختبار تطبيقك.
الإرسال ليس تقديمًا للمراجعة
يكتب Expo ذلك بوضوح: بناء TestFlight لا يُنشر تلقائيًا على App Store. ولا يملأ EAS Submit صفحة تطبيقك ولا لقطات الشاشة. تبقى أربع خطوات في App Store Connect، موصوفة في مساعدة Apple حول الإرسال للمراجعة:
- املأ البيانات الوصفية الإلزامية للإصدار.
- اختر البناء في قسم Build الخاص بالإصدار.
- انقر «Add for Review». ينتقل الإصدار إلى Ready for Review، لكن لم يُرسل شيء إلى المراجعة بعد.
- انقر «Submit for Review». تتحول الحالة إلى In Review عندما تبدأ المراجعة.
الأخطاء الشائعة وطريقة إصلاحها
| الخطأ المعروض | السبب | الإصلاح |
|---|---|---|
| ITMS-90189 | رقم البناء مستخدم مسبقًا | autoIncrement |
| ITMS-90062 أو 90186 | الإصدار مغلق مسبقًا | رفع version |
| «Set ascAppId» | ascAppId غائب في CI | إضافة ascAppId |
| «API Keys cannot» | لا مفتاح مرتبط | eas credentials |
| ITMS-90683 | عبارة سبب الوصول غائبة | ios.infoPlist |
| ITMS-91053 | ملف الخصوصية ناقص | ios.privacyManifests |
| ITMS-90725 | SDK iOS قديم جدًا | رفع إصدار Expo SDK |
| Missing Compliance | التشفير غير مُصرَّح به | usesNonExemptEncryption |
بحسب Expo، رقم البناء المستخدم مسبقًا سبب شائع لرفض الإرسال: كل التفاصيل في رقم البناء والإصدار. ولثلاثة أخطاء أدلة خاصة بها: ITMS-90683 مع Expo وITMS-91053 مع Expo وITMS-90725.
الرسالتان بين علامتي التنصيص تأتيان من EAS وتُصلحان في إعداداته. ويمكن حل Missing Compliance أيضًا بالإجابة عن الأسئلة في App Store Connect. أما بقية الأسطر، فالإصلاح يمس الملف الثنائي: أعد البناء، ثم أرسله من جديد. التحديث عن بُعد لا يغيّر Info.plist ولا ملف الخصوصية ولا الأرقام.
أرسل تطبيقك الأول دون تخبّط
الأمر ليس إلا خطوة واحدة. ينطلق iOS Kit من Starter Code لتطبيقاتي، بما فيه الاشتراكات، ويتبع أربع مراحل حتى App Store، بالسرعة التي تناسبك.
إن كنت تحضّر إصدارك الأول، أجرِ التشخيص المجاني: يخبرك بما يعيقك فعلًا ويرسل لك قائمة التحقق التي أعددتها لتجنب رفض Apple. ولصفحة التطبيق ولقطات الشاشة والقبول، تغطي صفحة نشر تطبيق على App Store كل خطوة.
الأسئلة الشائعة
كيف أنشر تطبيق Expo على App Store؟
شغّل بناء إنتاج بـ EAS Build، ثم أرسله بـ eas submit --platform ios. بعد معالجة Apple، يظهر في TestFlight. ثم في App Store Connect، املأ صفحة التطبيق، واختر هذا البناء في الإصدار، ثم انقر «Add for Review» و«Submit for Review».
هل يرسل EAS Submit تطبيقي إلى مراجعة Apple؟
لا. يرسل EAS Submit الملف الثنائي إلى App Store Connect، ويصل البناء إلى TestFlight. أما الإرسال للمراجعة فيتم يدويًا في App Store Connect، بعد ملء صفحة التطبيق واختيار البناء.
أين أجد ascAppId لتطبيقي؟
في App Store Connect، افتح تطبيقك، ثم App Information. إنه حقل Apple ID، تحت General Information. إنه رقم، فلا تخلط بينه وبين معرّف الحزمة.
هل أحتاج إلى Apple ID لاستخدام eas submit؟
عند أول تشغيل، يطلبه منك الأمر. بعد ذلك، مع وجود ascAppId في الملف ومفتاح API لـ App Store Connect، يمكنه العمل دون تدخل، حتى في التكامل المستمر. مفتاح API هو الطريقة الافتراضية والموصى بها من Expo.
كم من الوقت قبل أن أرى البناء في TestFlight؟
يتحدث Expo عادةً عن 10 إلى 15 دقيقة من المعالجة لدى Apple، التي ترسل لك بريدًا إلكترونيًا عند الانتهاء. إن بقي البناء في حالة Missing Compliance، فأجب عن أسئلة التشفير، ثم صرّح به في إعداداتك للبناءات التالية.