Build number App Store Connect: version και αριθμός build
Από Mehdi Azizi
Δημοσιεύτηκε στις , 8 λ.
Η version είναι ο αριθμός που βλέπουν οι πελάτες σου, το build number ταυτοποιεί κάθε αποστολή. Με το Expo, το EAS το αυξάνει για σένα.
Το build number του App Store Connect είναι ο αριθμός build: το κλειδί CFBundleVersion, που ταυτοποιεί κάθε αποστολή. Η version, CFBundleShortVersionString, είναι ο αριθμός που βλέπουν οι πελάτες σου στο App Store. Η Apple απαιτεί το ζεύγος version και αριθμού build να είναι μοναδικό: ένας αριθμός build χρησιμοποιείται μόνο μία φορά για την ίδια version.
Με το Expo, ορίζεις τη version μόνος σου και το EAS μπορεί να αυξάνει τον αριθμό build σε κάθε production build. Αυτός ο οδηγός εξηγεί τους δύο αριθμούς, τους κανόνες της Apple, τα σφάλματα ITMS-90062 και ITMS-90189, και τι να ελέγξεις όταν το build σου δεν εμφανίζεται.
Δημοσιεύω τις iOS εφαρμογές μου με Expo και EAS, ανάμεσά τους τα Solys, TradaZen και Nolera. Οι ρυθμίσεις που βλέπεις παρακάτω είναι αυτές από τα αρχεία τους eas.json.
Version και αριθμός build: ποια η διαφορά;
Δύο κλειδιά του Info.plist ταυτοποιούν την εφαρμογή σου. Η τεκμηρίωση της Apple για το CFBundleShortVersionString την περιγράφει ως την version που βλέπει ο χρήστης: τρεις ακέραιοι χωρισμένοι με τελείες, όπως 10.14.1. Αυτή για το CFBundleVersion μιλά για την version του build: ένας έως τρεις ακέραιοι, μόνο με ψηφία και τελείες.
| Στοιχείο | Κλειδί iOS | Ποιος το βλέπει | Πεδίο Expo |
|---|---|---|---|
| Version | CFBundleShortVersionString | Οι πελάτες σου | version |
| Αριθμός build | CFBundleVersion | Εσύ και η Apple | ios.buildNumber |
Φανταστικό παράδειγμα: για τη version 1.4.0, στέλνεις τα builds 12, 13 και 14 κατά τις δοκιμές σου και μετά διαλέγεις ένα για το review. Η βοήθεια του App Store Connect το συνοψίζει: η version συνδέει το build με τη σελίδα της, ο αριθμός build το ταυτοποιεί παντού στο σύστημα.
Οι κανόνες αύξησης της Apple
- Το ζεύγος πρέπει να είναι μοναδικό. Σύμφωνα με την τεκμηρίωση του Xcode Cloud, το App Store Connect απαιτεί μοναδικό συνδυασμό version και αριθμού build. Μια εφαρμογή iPhone μπορεί λοιπόν να ξεκινήσει ξανά από το 1 για νέα version. Μια εφαρμογή Mac όχι: ο αριθμός της πρέπει πάντα να ανεβαίνει.
- Μια εγκεκριμένη version είναι κλειστή. Μόλις η Apple εγκρίνει τη version 1.4.0, δεν μπορείς πια να της προσθέσεις build. Η επόμενη πρέπει να έχει μεγαλύτερο αριθμό.
- Κάθε αριθμός συγκρίνεται ως ακέραιος. Το 1.10 έρχεται μετά το 1.9, γιατί το 10 είναι μεγαλύτερο από το 9. Μια version 1.9 που στέλνεται μετά από εγκεκριμένη 1.20 θα απορριφθεί.
Η συμβουλή μου: κράτα έναν ακέραιο αριθμό build που ανεβαίνει πάντα, χωρίς να τον μηδενίζεις στο 1. Το να ξεκινάς ξανά από το 1 επιτρέπεται στο iPhone, αλλά ένας μοναδικός αριθμός σε όλη τη ζωή της εφαρμογής σε γλιτώνει από το να μπερδέψεις δύο builds στο TestFlight. Αυτό βλέπω στις εφαρμογές μου σε remote λειτουργία: ο μετρητής συνεχίζει από τη μία version στην άλλη.
Διαχείριση version και build με Expo και EAS
Η σελίδα του Expo για τις versions, ενημερωμένη στις 25 Σεπτεμβρίου 2026, χωρίζει τους ρόλους. Η version (version στο app.json) μένει σε σένα: την αλλάζεις όταν ετοιμάζεις νέα κυκλοφορία. Τον αριθμό build (ios.buildNumber) μπορείς να τον αναθέσεις στο EAS. Το Expo μάλιστα αναφέρει την παράλειψη αύξησής του ως συχνή αιτία απόρριψης κατά την αποστολή.
Όλα ρυθμίζονται στο eas.json:
{
"cli": {
"appVersionSource": "remote"
},
"build": {
"production": {
"autoIncrement": true
}
}
}
"remote": οι servers του EAS κρατούν τον αριθμό build. Είναι η προτεινόμενη συμπεριφορά από το EAS CLI 12. Ο μετρητής ξεκινά από την τιμή της ρύθμισής σου, ή από το 1, και μετά τοios.buildNumberαγνοείται."local": η ρύθμισή σου είναι αυτή που μετράει. Με τοautoIncrement, το EAS αλλάζει τοios.buildNumberστο αρχείο σου, και πρέπει να κάνεις commit αυτή την αλλαγή σε κάθε build.autoIncrement: η αναφορά του eas.json δέχεταιtrueή"buildNumber"για το build, και"version"για να ανεβάσει το τελευταίο ψηφίο της version. Σε remote λειτουργία, το Expo διευκρινίζει ότι το"version"δεν υποστηρίζεται.
Σε μένα, τα TradaZen και Nolera είναι σε remote. Το Solys έμεινε σε local: ο αριθμός build του ζει στο app.json και κάθε production build τον ανεβάζει μέσα στο αρχείο. Και τα δύο δουλεύουν, αλλά η remote λειτουργία εξαλείφει τον κίνδυνο ενός ξεχασμένου commit.
Δύο εντολές συμπληρώνουν το σύστημα. Το eas build:version:set αρχικοποιεί τον απομακρυσμένο μετρητή: βάλε τον τελευταίο αριθμό που έστειλες στην Apple. Το eas build:version:sync αντιγράφει τις απομακρυσμένες τιμές στο project σου, χρήσιμο αν κάποια μέρα κάνεις build με Xcode. Με το EAS Update, η remote λειτουργία δεν δουλεύει με την πολιτική nativeVersion: το Expo προτείνει appVersion.
ITMS-90062: η version είναι ήδη εγκεκριμένη
Το μήνυμα μοιάζει κάπως έτσι (φανταστικοί αριθμοί):
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 έχει ήδη εγκρίνει τη version 1.4.0: δεν μπορείς πια να προσθέσεις build σε αυτή. Ανέβασε τη version στο app.json, για παράδειγμα σε 1.4.1, και ξανατρέξε ένα build. Η αλλαγή μόνο του αριθμού build δεν αρκεί.
Αν το σφάλμα επανέρχεται ενώ το version είναι ενημερωμένο, ψάξε για πεδίο ios.version. Σύμφωνα με την αναφορά της ρύθμισης του Expo, υπερισχύει του version για το iOS. Ίδια λύση και για το συγγενικό σφάλμα ITMS-90186, «Invalid Pre-Release Train», που δείχνει version κλειστή σε νέα builds.
ITMS-90189: Redundant Binary Upload
Εδώ το πρόβλημα είναι ο αριθμός build:
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. Αν φτιάχνεις ξεχωριστό profile για το TestFlight, όπως αυτό του Nolera, βάλε ξανά την επιλογή εκεί. - Ο απομακρυσμένος μετρητής έχει μείνει πίσω. Πέρασες σε
remoteμετά από χειροκίνητες αποστολές: τρέξεeas build:version:setμε τον τελευταίο γνωστό αριθμό της Apple. - Ξεχάστηκε το commit σε local λειτουργία. Το επόμενο build ξεκινά από τον παλιό αριθμό.
- Ξαναστέλνεις το ίδιο binary. Με το
eas submit, διάλεξε το νέο build, όχι το παλιό.
Η διόρθωση είναι πάντα η ίδια: ένα νέο build με μεγαλύτερο αριθμό.
«No builds available»: το build σου δεν εμφανίζεται
Το build στάλθηκε, αλλά η σελίδα σου δεν το προτείνει. Έλεγξε με αυτή τη σειρά.
- Είναι ακόμα σε επεξεργασία. Η Apple επεξεργάζεται κάθε build πριν το εμφανίσει και σου στέλνει e-mail στο τέλος. Το Expo μιλά συνήθως για 10 έως 15 λεπτά. Σύμφωνα με την Apple, αν η επεξεργασία ξεπεράσει τις 24 ώρες, πρέπει να ανοίξεις αίτημα στο Feedback Assistant.
- Περιμένει τη δήλωση κρυπτογράφησης. Είναι το status Missing Compliance, που αναλύεται παρακάτω.
- Η version δεν ταιριάζει. Ένα build σε 1.4.1 δεν μπαίνει κάτω από σελίδα που ετοίμασες ως 1.5.0 στο App Store Connect. Ευθυγράμμισε τα δύο.
- Βγήκε μια version στο μεταξύ. Σύμφωνα με τη βοήθεια για την επιλογή build, η λίστα δείχνει τότε μόνο τα builds που στάλθηκαν μετά από εκείνη την κυκλοφορία.
- Ο tester είναι αυτός που δεν το βλέπει. Στην εφαρμογή TestFlight, το «no builds available» συχνά σημαίνει ότι το build δεν είναι σε καμία ομάδα, περιμένει το beta review ή έχει λήξει. Λεπτομέρειες στο TestFlight για να δοκιμάσεις την εφαρμογή iPhone σου.
Τα statuses που πρέπει να ξέρεις
Τα statuses που εξηγούν πιο συχνά ένα build που λείπει, σύμφωνα με τη λίστα της Apple. Τα Processing και Failed δεν υπάρχουν εκεί: είναι statuses αποστολής που περιγράφονται στην παρακολούθηση των builds.
| Status | Τι σημαίνει | Η διόρθωσή σου |
|---|---|---|
| Processing | Η Apple επεξεργάζεται το build | Περίμενε το e-mail |
| Failed | Σφάλμα στην επεξεργασία | Διάβασε το σφάλμα, ξαναστείλε |
| Missing Compliance | Δεν δηλώθηκε κρυπτογράφηση | Απάντησε ή Info.plist |
| Invalid Binary | Μη συμβατή αποστολή | Διόρθωσε, νέο build |
| Expired | Πέρασαν οι 90 ημέρες | Νέο build |
| Ready to Submit | Έτοιμο για δοκιμή ή review | Πρόσθεσέ το σε ομάδα |
Δήλωσε την κρυπτογράφηση μία φορά για πάντα
Χωρίς το κλειδί ITSAppUsesNonExemptEncryption, η Apple σου κάνει τις ερωτήσεις συμμόρφωσης σε κάθε νέα version. Με το Expo, το πεδίο λέγεται ios.config.usesNonExemptEncryption:
{
"expo": {
"ios": {
"config": {
"usesNonExemptEncryption": false
}
}
}
}
Το false σημαίνει: καμία κρυπτογράφηση, ή μόνο εξαιρούμενη κρυπτογράφηση. Η Apple διευκρινίζει ότι η κρυπτογράφηση ενσωματωμένη στο σύστημα, όπως οι συνδέσεις HTTPS, είναι γενικά εξαιρούμενη, και ότι η απάντηση καλύπτει και τις βιβλιοθήκες σου. Και οι τρεις εφαρμογές μου δηλώνουν false. Βάλε false μόνο αν ισχύει για την εφαρμογή σου: η δήλωση σε δεσμεύει.
Μπορείς να αλλάξεις τον αριθμό ενός build που έχει ήδη σταλεί;
Όχι. Ο αριθμός είναι γραμμένος μέσα στο υπογεγραμμένο binary: για να τον διορθώσεις, χρειάζεσαι νέο build.
Αυτό που μπορείς να αλλάξεις είναι το build που είναι συνδεδεμένο με τη version σου. Η Apple επιτρέπει ένα μόνο build ανά version, αλλά μπορείς να το αντικαταστήσεις όσες φορές θέλεις μέχρι την αποστολή για review:
- Άνοιξε τη version στο App Store Connect, ενότητα Build.
- Πέρνα τον κέρσορα πάνω από το τρέχον build και κάνε κλικ στο κουμπί αφαίρεσης, το σύμβολο μείον.
- Κάνε κλικ στο κουμπί προσθήκης, το σύμβολο συν, διάλεξε το σωστό build και αποθήκευσε.
Η αφαίρεση ενός build από μια version δεν το διαγράφει από τον λογαριασμό σου. Αν η version είναι ήδη σε review, απόσυρε πρώτα την υποβολή: το review θα ξεκινήσει από το μηδέν.
Πριν από την επόμενη αποστολή σου
Ο αριθμός build είναι μόνο ένας από τους ελέγχους κατά την αποστολή. Το build image μπορεί να προκαλέσει ITMS-90725, και η υπογραφή έχει τις δικές της παγίδες, που αναλύονται στο πιστοποιητικό developer iOS και provisioning profile. Όλη η αλυσίδα, από το build ως το TestFlight, είναι στο δημοσίευση iOS εφαρμογής χωρίς Mac, και οι χρόνοι review στο χρόνος έγκρισης στο App Store. Όλα τα βήματα είναι συγκεντρωμένα στη σελίδα δημοσίευση εφαρμογής στο App Store.
Αν ετοιμάζεις την πρώτη σου κυκλοφορία, κάνε τη δωρεάν διάγνωση: σου λέει τι μπλοκάρει στο project σου και σου στέλνει τη checklist μου κατά των απορρίψεων της Apple. Για να φτιάξεις την εφαρμογή, να συνδέσεις τις συνδρομές και να τη δημοσιεύσεις, το iOS & Android Kit ακολουθεί τη διαδρομή σε τέσσερα βήματα με τον αρχικό κώδικα των εφαρμογών μου, με τον δικό σου ρυθμό.
Συχνές ερωτήσεις
Ποια η διαφορά ανάμεσα σε version και build number στο App Store Connect;
Η version είναι ο δημόσιος αριθμός της κυκλοφορίας σου, όπως 1.4.0. Το build number ταυτοποιεί ένα συγκεκριμένο binary που στάλθηκε στην Apple για αυτή τη version. Μπορείς να στείλεις πολλά builds για την ίδια version, το καθένα με τον αριθμό του.
Πρέπει να αλλάζω τον αριθμό build σε κάθε αποστολή;
Ναι, για την ίδια version. Η Apple απορρίπτει δεύτερη αποστολή με το ίδιο ζεύγος version και αριθμού build, είναι το σφάλμα ITMS-90189. Με το EAS, το autoIncrement το αναλαμβάνει σε κάθε production build.
Πρέπει ο αριθμός build να ξεκινά ξανά από το 1 σε κάθε version;
Δεν είναι υποχρεωτικό. Στο iPhone, η Apple δέχεται μικρότερο αριθμό για νέα version, γιατί μόνο το ζεύγος πρέπει να είναι μοναδικό. Ένας μετρητής που ανεβαίνει πάντα είναι πιο εύκολος στην παρακολούθηση.
Πώς αλλάζω το build number στο App Store Connect;
Δεν μπορείς να αλλάξεις τον αριθμό ενός build που έχει ήδη σταλεί. Μπορείς όμως να αντικαταστήσεις το build που είναι συνδεδεμένο με τη version σου, από την ενότητα Build της σελίδας, όσο δεν είναι σε review. Για νέο αριθμό, κάνε νέο build.
Γιατί το build μου δεν εμφανίζεται στο App Store Connect;
Τις περισσότερες φορές είναι ακόμα σε επεξεργασία ή περιμένει τη δήλωση κρυπτογράφησης. Έλεγξε επίσης ότι η version του ταιριάζει με αυτή της σελίδας σου. Αν η επεξεργασία ξεπεράσει τις 24 ώρες, η Apple ζητά να ανοίξεις αίτημα.

