رقم البناء في App Store Connect: الإصدار و build number
بقلم Mehdi Azizi
نُشر في ، 8 د
الإصدار هو الرقم الذي يراه عملاؤك، ورقم البناء يميّز كل رفع. يجب أن يكون الزوج فريدًا، ومع Expo يرفع EAS رقم البناء عنك.
رقم البناء (build number) في App Store Connect هو المفتاح CFBundleVersion، وهو يميّز كل عملية رفع. أما الإصدار، أي CFBundleShortVersionString، فهو الرقم الذي يراه عملاؤك على App Store. تشترط Apple أن يكون زوج الإصدار ورقم البناء فريدًا: رقم البناء يُستخدم مرة واحدة فقط للإصدار نفسه.
مع Expo، أنت تحدد الإصدار بنفسك، ويمكن لـ EAS أن يرفع رقم البناء تلقائيًا مع كل بناء إنتاج. يشرح هذا الدليل الرقمين، وقواعد Apple، والخطأين ITMS-90062 وITMS-90189، وما الذي تتحقق منه عندما لا يظهر البناء.
أنشر تطبيقاتي على iOS باستخدام Expo وEAS، ومنها Solys وTradaZen وNolera. الإعدادات المعروضة أدناه مأخوذة من ملفات eas.json الخاصة بها.
الإصدار ورقم البناء: ما الفرق؟
مفتاحان في ملف Info.plist يحددان تطبيقك. توثيق Apple لـ CFBundleShortVersionString يصفه بأنه الإصدار الظاهر للمستخدم: ثلاثة أعداد صحيحة تفصل بينها نقاط، مثل 10.14.1. أما توثيق CFBundleVersion فيتحدث عن إصدار البناء: من عدد واحد إلى ثلاثة أعداد صحيحة، بأرقام ونقاط فقط.
| العنصر | مفتاح iOS | من يراه | حقل Expo |
|---|---|---|---|
| الإصدار | CFBundleShortVersionString | عملاؤك | version |
| رقم البناء | CFBundleVersion | أنت وApple | ios.buildNumber |
مثال افتراضي: للإصدار 1.4.0، ترفع البناءات 12 و13 و14 أثناء الاختبار، ثم تختار واحدًا منها للمراجعة. مساعدة App Store Connect تلخص الأمر: الإصدار يربط البناء بصفحته، ورقم البناء يميّزه في كل مكان داخل النظام.
قواعد Apple للزيادة
- يجب أن يكون الزوج فريدًا. وفقًا لـتوثيق Xcode Cloud، يشترط App Store Connect تركيبة فريدة من الإصدار ورقم البناء. لذلك يمكن لتطبيق iPhone أن يعود إلى 1 مع إصدار جديد. أما تطبيق Mac فلا: يجب أن يرتفع رقمه دائمًا.
- الإصدار المعتمد مغلق. بعد أن توافق Apple على الإصدار 1.4.0، لا يمكنك إضافة أي بناء إليه. الإصدار التالي يجب أن يحمل رقمًا أعلى.
- كل رقم يُقارَن كعدد صحيح. الإصدار 1.10 يأتي بعد 1.9، لأن 10 أكبر من 9. إصدار 1.9 يُرفع بعد إصدار 1.20 معتمد سيُرفض.
نصيحتي: احتفظ برقم بناء صحيح يرتفع دائمًا، ولا تُعِده إلى 1. العودة إلى 1 مسموحة على iPhone، لكن رقمًا فريدًا طوال عمر التطبيق يمنع الخلط بين بناءين في TestFlight. هذا ما أراه في تطبيقاتي بالوضع البعيد: العدّاد يستمر من إصدار إلى آخر.
إدارة الإصدار والبناء مع Expo وEAS
صفحة Expo عن الإصدارات، المحدّثة في 25 سبتمبر 2026، تفصل بين الدورين. الإصدار (version في app.json) يبقى بيدك: تغيّره عندما تجهّز إصدارًا جديدًا. أما رقم البناء (ios.buildNumber) فيمكن أن تتركه لـ EAS. وتذكر Expo أن نسيان زيادته سبب شائع لرفض الرفع.
كل شيء يُضبط في eas.json:
{
"cli": {
"appVersionSource": "remote"
},
"build": {
"production": {
"autoIncrement": true
}
}
}
"remote": خوادم EAS تحتفظ برقم البناء. هذا هو السلوك الموصى به منذ EAS CLI 12. يبدأ العدّاد من القيمة الموجودة في إعداداتك، أو من 1، ثم يتم تجاهلios.buildNumber."local": إعداداتك هي المرجع. معautoIncrement، يعدّل EAS قيمةios.buildNumberفي ملفك، وعليك عمل commit لهذا التغيير مع كل بناء.autoIncrement: مرجع eas.json يقبلtrueأو"buildNumber"للبناء، و"version"لرفع الرقم الأخير من الإصدار. في الوضع البعيد، توضح Expo أن"version"غير مدعوم.
عندي، TradaZen وNolera على remote. أما Solys فبقي على local: رقم بنائه موجود في app.json وكل بناء إنتاج يرفعه داخل الملف. الطريقتان تعملان، لكن الوضع البعيد يلغي خطر نسيان commit.
أمران يكملان المنظومة. eas build:version:set يهيّئ العدّاد البعيد: أدخل آخر رقم رفعته إلى Apple. وeas build:version:sync ينسخ القيم البعيدة إلى مشروعك، وهذا مفيد إذا قمت بالبناء يومًا عبر Xcode. مع EAS Update، لا يعمل الوضع البعيد مع سياسة nativeVersion: تنصح Expo باستخدام appVersion.
ITMS-90062: الإصدار معتمد مسبقًا
تبدو الرسالة هكذا (أرقام افتراضية):
ERROR ITMS-90062: This bundle is invalid. The value for key
CFBundleShortVersionString [1.4.0] in the Info.plist file must
contain a higher version than that of the previously approved
version [1.4.0].
وافقت Apple مسبقًا على الإصدار 1.4.0: لم يعد بإمكانك إضافة بناء إليه. ارفع الإصدار في app.json، مثلًا إلى 1.4.1، ثم أعد تشغيل البناء. تغيير رقم البناء وحده لا يكفي.
إذا عاد الخطأ رغم تحديث version، فابحث عن حقل ios.version. وفقًا لـمرجع إعدادات Expo، هذا الحقل يتقدم على version في iOS. والعلاج نفسه للخطأ القريب ITMS-90186، "Invalid Pre-Release Train"، الذي يشير إلى إصدار مغلق أمام البناءات الجديدة.
ITMS-90189: Redundant Binary Upload
هنا، المشكلة في رقم البناء:
ERROR ITMS-90189: Redundant Binary Upload. You've already uploaded
a build with build number '12' for version number '1.4.0'.
الزوج 1.4.0 (12) موجود بالفعل لدى Apple. مع Expo، تتكرر أربعة أسباب:
- الملف الشخصي (profile) المستخدم لا يحتوي على
autoIncrement. إذا أنشأت ملفًا منفصلًا لـ TestFlight، مثل ملف Nolera، فأضف الخيار إليه. - العدّاد البعيد متأخر. انتقلت إلى
remoteبعد عمليات رفع يدوية: شغّلeas build:version:setبآخر رقم تعرفه Apple. - نسيت الـ commit في الوضع المحلي. البناء التالي يبدأ من الرقم القديم.
- ترفع الملف الثنائي نفسه مرة أخرى. مع
eas submit، اختر البناء الجديد، لا القديم.
الحل واحد دائمًا: بناء جديد برقم أعلى.
"No builds available": البناء لا يظهر
تم رفع البناء، لكن صفحة التطبيق لا تعرضه. تحقق بهذا الترتيب.
- ما زال قيد المعالجة. تعالج Apple كل بناء قبل عرضه وترسل لك بريدًا إلكترونيًا عند الانتهاء. تتحدث Expo عادة عن 10 إلى 15 دقيقة. ووفقًا لـ Apple، إذا تجاوزت المعالجة 24 ساعة، يجب فتح تذكرة في Feedback Assistant.
- ينتظر إقرارك بشأن التشفير. هذه هي الحالة Missing Compliance، والتفاصيل أدناه.
- الإصدار غير متطابق. بناء بالإصدار 1.4.1 لا يندرج تحت صفحة مُعدّة للإصدار 1.5.0 في App Store Connect. وحّد الاثنين.
- صدر إصدار في الأثناء. وفقًا لـالمساعدة حول اختيار البناء، تعرض القائمة حينها فقط البناءات المرفوعة بعد ذلك الإصدار.
- المختبِر هو من لا يراه. في تطبيق TestFlight، تعني "no builds available" غالبًا أن البناء ليس في أي مجموعة، أو ينتظر مراجعة النسخة التجريبية، أو انتهت صلاحيته. التفاصيل في TestFlight لاختبار تطبيق iPhone.
الحالات التي يجب أن تعرفها
هذه الحالات هي الأكثر تفسيرًا لغياب البناء، وفقًا لـقائمة Apple. الحالتان Processing وFailed غير موجودتين فيها: إنهما حالتا الرفع الموصوفتان في متابعة البناءات.
| الحالة | معناها | الحل |
|---|---|---|
| Processing | Apple تعالج البناء | انتظر البريد الإلكتروني |
| Failed | خطأ أثناء المعالجة | اقرأ الخطأ، ثم أعد الرفع |
| Missing Compliance | التشفير غير مُصرَّح به | أجب أو استخدم Info.plist |
| Invalid Binary | رفع غير مطابق | صحّح، ثم بناء جديد |
| Expired | تجاوز 90 يومًا | بناء جديد |
| Ready to Submit | جاهز للاختبار أو المراجعة | أضفه إلى مجموعة |
صرّح بالتشفير مرة واحدة وإلى الأبد
بدون المفتاح ITSAppUsesNonExemptEncryption، تطرح عليك Apple أسئلة الامتثال مع كل إصدار جديد. في Expo، اسم الحقل ios.config.usesNonExemptEncryption:
{
"expo": {
"ios": {
"config": {
"usesNonExemptEncryption": false
}
}
}
}
القيمة false تعني: لا تشفير، أو تشفير معفى فقط. توضح Apple أن التشفير المدمج في النظام، مثل اتصالات HTTPS، معفى عمومًا، وأن الإجابة تشمل مكتباتك أيضًا. تطبيقاتي الثلاثة تصرّح بـ false. لا تضع false إلا إذا كان ذلك صحيحًا لتطبيقك: الإقرار يُلزمك.
هل يمكن تغيير رقم بناء تم رفعه؟
لا. الرقم مسجّل داخل الملف الثنائي الموقَّع: لتصحيحه، تحتاج إلى بناء جديد.
ما يمكنك تغييره هو البناء المرتبط بإصدارك. تسمح Apple ببناء واحد لكل إصدار، لكن يمكنك استبداله كلما أردت حتى إرساله للمراجعة:
- افتح الإصدار في App Store Connect، قسم Build.
- مرّر المؤشر فوق البناء الحالي وانقر زر الحذف، علامة الناقص.
- انقر زر الإضافة، علامة الزائد، واختر البناء الصحيح، ثم احفظ.
إزالة بناء من إصدار لا تحذفه من حسابك. إذا كان الإصدار قيد المراجعة، اسحب الإرسال أولًا: ستبدأ المراجعة من الصفر.
قبل عملية الرفع التالية
رقم البناء ليس سوى واحد من فحوصات الرفع. صورة البناء قد تسبب ITMS-90725، وللتوقيع فخاخه الخاصة، المشروحة في شهادة مطوّر iOS وملف provisioning profile. السلسلة الكاملة، من البناء إلى TestFlight، موجودة في نشر تطبيق iOS بدون Mac، ومدد المراجعة في مدة الموافقة على App Store. كل الخطوات مجمّعة في صفحة نشر تطبيق على App Store.
إذا كنت تجهّز إصدارك الأول، قم بالتشخيص المجاني: يخبرك بما يعيق مشروعك ويرسل لك قائمة التحقق الخاصة بي لتجنب رفض Apple. ولبناء التطبيق، وربط الاشتراكات، ونشره، يرافقك iOS & Android Kit في مسار من أربع مراحل مع الكود الأساسي لتطبيقاتي، وفق إيقاعك.
الأسئلة الشائعة
ما الفرق بين الإصدار و build number في App Store Connect؟
الإصدار هو الرقم العلني لإصدارك، مثل 1.4.0. أما build number فيميّز ملفًا ثنائيًا محددًا مرفوعًا إلى Apple لهذا الإصدار. يمكنك رفع عدة بناءات للإصدار نفسه، لكل منها رقمه.
هل يجب تغيير رقم البناء مع كل رفع؟
نعم، للإصدار نفسه. ترفض Apple رفعًا ثانيًا بالزوج نفسه من الإصدار ورقم البناء، وهذا هو الخطأ ITMS-90189. مع EAS، يتكفل autoIncrement بذلك مع كل بناء إنتاج.
هل يجب أن يعود رقم البناء إلى 1 مع كل إصدار؟
ليس ذلك إلزاميًا. على iPhone، تقبل Apple رقمًا أقل لإصدار جديد، لأن الزوج وحده يجب أن يكون فريدًا. لكن العدّاد الذي يرتفع دائمًا أسهل في المتابعة.
كيف أغيّر build number في App Store Connect؟
لا يمكنك تعديل رقم بناء تم رفعه. لكن يمكنك استبدال البناء المرتبط بإصدارك، من قسم Build في الصفحة، ما دام الإصدار ليس قيد المراجعة. للحصول على رقم جديد، أعد البناء.
لماذا لا يظهر البناء في App Store Connect؟
في الغالب، ما زال قيد المعالجة أو ينتظر إقرارك بشأن التشفير. تحقق أيضًا من أن إصداره يطابق إصدار صفحتك. إذا تجاوزت المعالجة 24 ساعة، تطلب Apple فتح تذكرة.

