# رقم البناء في App Store Connect: الإصدار و build number

> الإصدار هو الرقم الذي يراه عملاؤك، ورقم البناء يميّز كل رفع. يجب أن يكون الزوج فريدًا، ومع Expo يرفع EAS رقم البناء عنك.

الصفحة الأصلية: [رقم البناء في App Store Connect: الإصدار و build number](https://devoria.fr/ar/blog/app-store-connect-build-number-version)
الكاتب: [Mehdi Azizi](https://devoria.fr/ar/mehdi-azizi)
النشر: 2026-11-04
آخر مراجعة للمحتوى: 2026-11-04


رقم البناء (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](https://developer.apple.com/documentation/bundleresources/information-property-list/cfbundleshortversionstring) يصفه بأنه الإصدار الظاهر للمستخدم: ثلاثة أعداد صحيحة تفصل بينها نقاط، مثل 10.14.1. أما [توثيق CFBundleVersion](https://developer.apple.com/documentation/bundleresources/information-property-list/cfbundleversion) فيتحدث عن إصدار البناء: من عدد واحد إلى ثلاثة أعداد صحيحة، بأرقام ونقاط فقط.

| العنصر     | مفتاح iOS                  | من يراه    | حقل Expo          |
| ---------- | -------------------------- | ---------- | ----------------- |
| الإصدار    | CFBundleShortVersionString | عملاؤك     | `version`         |
| رقم البناء | CFBundleVersion            | أنت وApple | `ios.buildNumber` |

مثال افتراضي: للإصدار 1.4.0، ترفع البناءات 12 و13 و14 أثناء الاختبار، ثم تختار واحدًا منها للمراجعة. [مساعدة App Store Connect](https://developer.apple.com/help/app-store-connect/manage-builds/upload-builds) تلخص الأمر: الإصدار يربط البناء بصفحته، ورقم البناء يميّزه في كل مكان داخل النظام.

## قواعد Apple للزيادة

1. **يجب أن يكون الزوج فريدًا.** وفقًا لـ[توثيق Xcode Cloud](https://developer.apple.com/documentation/xcode/setting-the-next-build-number-for-xcode-cloud-builds)، يشترط App Store Connect تركيبة فريدة من الإصدار ورقم البناء. لذلك يمكن لتطبيق iPhone أن يعود إلى 1 مع إصدار جديد. أما تطبيق Mac فلا: يجب أن يرتفع رقمه دائمًا.
2. **الإصدار المعتمد مغلق.** بعد أن توافق Apple على الإصدار 1.4.0، لا يمكنك إضافة أي بناء إليه. الإصدار التالي يجب أن يحمل رقمًا أعلى.
3. **كل رقم يُقارَن كعدد صحيح.** الإصدار 1.10 يأتي بعد 1.9، لأن 10 أكبر من 9. إصدار 1.9 يُرفع بعد إصدار 1.20 معتمد سيُرفض.

نصيحتي: **احتفظ برقم بناء صحيح يرتفع دائمًا، ولا تُعِده إلى 1.** العودة إلى 1 مسموحة على iPhone، لكن رقمًا فريدًا طوال عمر التطبيق يمنع الخلط بين بناءين في TestFlight. هذا ما أراه في تطبيقاتي بالوضع البعيد: العدّاد يستمر من إصدار إلى آخر.

## إدارة الإصدار والبناء مع Expo وEAS

[صفحة Expo عن الإصدارات](https://docs.expo.dev/build-reference/app-versions/)، المحدّثة في 25 سبتمبر 2026، تفصل بين الدورين. الإصدار (`version` في app.json) يبقى بيدك: تغيّره عندما تجهّز إصدارًا جديدًا. أما رقم البناء (`ios.buildNumber`) فيمكن أن تتركه لـ EAS. وتذكر Expo أن نسيان زيادته سبب شائع لرفض الرفع.

كل شيء يُضبط في eas.json:

```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](https://docs.expo.dev/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: الإصدار معتمد مسبقًا

تبدو الرسالة هكذا (أرقام افتراضية):

```text
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](https://docs.expo.dev/versions/latest/config/app/)، هذا الحقل يتقدم على `version` في iOS. والعلاج نفسه للخطأ القريب ITMS-90186، "Invalid Pre-Release Train"، الذي يشير إلى إصدار مغلق أمام البناءات الجديدة.

## ITMS-90189: Redundant Binary Upload

هنا، المشكلة في رقم البناء:

```text
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": البناء لا يظهر

تم رفع البناء، لكن صفحة التطبيق لا تعرضه. تحقق بهذا الترتيب.

1. **ما زال قيد المعالجة.** تعالج Apple كل بناء قبل عرضه وترسل لك بريدًا إلكترونيًا عند الانتهاء. تتحدث [Expo](https://docs.expo.dev/submit/ios/) عادة عن 10 إلى 15 دقيقة. و[وفقًا لـ Apple](https://developer.apple.com/help/app-store-connect/manage-builds/view-builds-and-metadata)، إذا تجاوزت المعالجة 24 ساعة، يجب فتح تذكرة في Feedback Assistant.
2. **ينتظر إقرارك بشأن التشفير.** هذه هي الحالة Missing Compliance، والتفاصيل أدناه.
3. **الإصدار غير متطابق.** بناء بالإصدار 1.4.1 لا يندرج تحت صفحة مُعدّة للإصدار 1.5.0 في App Store Connect. وحّد الاثنين.
4. **صدر إصدار في الأثناء.** وفقًا لـ[المساعدة حول اختيار البناء](https://developer.apple.com/help/app-store-connect/manage-builds/choose-a-build-to-submit)، تعرض القائمة حينها فقط البناءات المرفوعة بعد ذلك الإصدار.
5. **المختبِر هو من لا يراه.** في تطبيق TestFlight، تعني "no builds available" غالبًا أن البناء ليس في أي مجموعة، أو ينتظر مراجعة النسخة التجريبية، أو انتهت صلاحيته. التفاصيل في [TestFlight لاختبار تطبيق iPhone](https://devoria.fr/ar/blog/testflight-test-iphone-app-before-submission).

### الحالات التي يجب أن تعرفها

هذه الحالات هي الأكثر تفسيرًا لغياب البناء، وفقًا لـ[قائمة Apple](https://developer.apple.com/help/app-store-connect/reference/app-build-statuses). الحالتان Processing وFailed غير موجودتين فيها: إنهما حالتا الرفع الموصوفتان في [متابعة البناءات](https://developer.apple.com/help/app-store-connect/manage-builds/view-builds-and-metadata).

| الحالة             | معناها                    | الحل                     |
| ------------------ | ------------------------- | ------------------------ |
| Processing         | Apple تعالج البناء        | انتظر البريد الإلكتروني  |
| Failed             | خطأ أثناء المعالجة        | اقرأ الخطأ، ثم أعد الرفع |
| Missing Compliance | التشفير غير مُصرَّح به    | أجب أو استخدم Info.plist |
| Invalid Binary     | رفع غير مطابق             | صحّح، ثم بناء جديد       |
| Expired            | تجاوز 90 يومًا            | بناء جديد                |
| Ready to Submit    | جاهز للاختبار أو المراجعة | أضفه إلى مجموعة          |

### صرّح بالتشفير مرة واحدة وإلى الأبد

بدون المفتاح `ITSAppUsesNonExemptEncryption`، تطرح عليك [Apple](https://developer.apple.com/documentation/bundleresources/information-property-list/itsappusesnonexemptencryption) أسئلة الامتثال مع كل إصدار جديد. في Expo، اسم الحقل `ios.config.usesNonExemptEncryption`:

```json
{
  "expo": {
    "ios": {
      "config": {
        "usesNonExemptEncryption": false
      }
    }
  }
}
```

القيمة `false` تعني: لا تشفير، أو تشفير معفى فقط. [توضح Apple](https://developer.apple.com/documentation/security/complying-with-encryption-export-regulations) أن التشفير المدمج في النظام، مثل اتصالات HTTPS، معفى عمومًا، وأن الإجابة تشمل مكتباتك أيضًا. تطبيقاتي الثلاثة تصرّح بـ `false`. **لا تضع `false` إلا إذا كان ذلك صحيحًا لتطبيقك: الإقرار يُلزمك.**

## هل يمكن تغيير رقم بناء تم رفعه؟

لا. الرقم مسجّل داخل الملف الثنائي الموقَّع: لتصحيحه، تحتاج إلى بناء جديد.

ما يمكنك تغييره هو البناء المرتبط بإصدارك. تسمح Apple ببناء واحد لكل إصدار، لكن [يمكنك استبداله كلما أردت](https://developer.apple.com/help/app-store-connect/manage-builds/choose-a-build-to-submit) حتى إرساله للمراجعة:

1. افتح الإصدار في App Store Connect، قسم Build.
2. مرّر المؤشر فوق البناء الحالي وانقر زر الحذف، علامة الناقص.
3. انقر زر الإضافة، علامة الزائد، واختر البناء الصحيح، ثم احفظ.

إزالة بناء من إصدار لا تحذفه من حسابك. إذا كان الإصدار قيد المراجعة، [اسحب الإرسال أولًا](https://developer.apple.com/help/app-store-connect/manage-submissions-to-app-review/remove-a-submission-from-review): ستبدأ المراجعة من الصفر.

## قبل عملية الرفع التالية

رقم البناء ليس سوى واحد من فحوصات الرفع. صورة البناء قد تسبب [ITMS-90725](https://devoria.fr/ar/blog/itms-90725-sdk-version-issue-expo)، وللتوقيع فخاخه الخاصة، المشروحة في [شهادة مطوّر iOS وملف provisioning profile](https://devoria.fr/ar/blog/ios-certificate-provisioning-profile-expo). السلسلة الكاملة، من البناء إلى TestFlight، موجودة في [نشر تطبيق iOS بدون Mac](https://devoria.fr/ar/blog/publish-ios-app-without-mac-expo-eas)، ومدد المراجعة في [مدة الموافقة على App Store](https://devoria.fr/ar/blog/app-store-review-time-how-long). كل الخطوات مجمّعة في صفحة [نشر تطبيق على App Store](https://devoria.fr/ar/expertise/publish-an-app-on-the-app-store).

إذا كنت تجهّز إصدارك الأول، [قم بالتشخيص المجاني](https://devoria.fr/ar/diagnostic): يخبرك بما يعيق مشروعك ويرسل لك قائمة التحقق الخاصة بي لتجنب رفض Apple. ولبناء التطبيق، وربط الاشتراكات، ونشره، يرافقك [iOS & Android Kit](https://devoria.fr/ar/kits/ios) في مسار من أربع مراحل مع الكود الأساسي لتطبيقاتي، وفق إيقاعك.

## الأسئلة الشائعة

### ما الفرق بين الإصدار و 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 فتح تذكرة.


## مشروعك

[Review Kit](https://devoria.fr/ar/kits/app-review): قائمة التحقق التي أستخدمها لمراجعة App Store، وحالات رفض Apple التي واجهتها مع حلولها، وقائمة Google Play، وثلاث skills لـ Claude Code. ‏55 ⁦US$⁩.

[iOS & Android Kit](https://devoria.fr/ar/kits/ios): أنشئ تطبيقك لـ iPhone وAndroid باستخدام Claude Code: الكود الأساسي لتطبيقاتي، والمسار الكامل حتى النشر في المتاجر، وكل الحزم. ‏109 ⁦US$⁩.

[تشخيص: ما الذي يفصلك عن تطبيقك على iPhone](https://devoria.fr/ar/diagnostic): 7 أسئلة في 60 ثانية: تعرف ما الذي يعيقك فعلًا عن نشر تطبيقك على iPhone، ومسارك في 4 مراحل، والكيت المناسب لك.
