EAS Submit iOS: δημοσίευση εφαρμογής Expo στο App Store
Από Mehdi Azizi
Δημοσιεύτηκε στις , 8 λ.
Το EAS Submit στέλνει το iOS build σου στο App Store Connect και εμφανίζεται στο TestFlight. Την υποβολή για έλεγχο την κάνεις εσύ στο App Store Connect.
eas submit --platform ios στέλνει το iOS build σου στο App Store Connect, όπου εμφανίζεται στο TestFlight αφού το επεξεργαστεί η Apple. Η εντολή δεν υποβάλλει την εφαρμογή σου για έλεγχο στην Apple: την επιλογή του build και την υποβολή για έλεγχο τις κάνεις εσύ στο App Store Connect. Για να το αυτοματοποιήσεις, χρειάζεται τον αριθμό της καρτέλας σου (ascAppId) και ένα API key του App Store Connect.
Δημοσιεύω τις iOS εφαρμογές μου, ανάμεσά τους τα Solys, TradaZen και Nolera, με Expo, EAS Build και EAS Submit. Ο οδηγός αυτός ακολουθεί την τεκμηρίωση του Expo για την αποστολή σε iOS, όπως την ξαναδιάβασα στις 25 Οκτωβρίου 2026. Αν δεν έχεις Mac, όλη η διαδικασία είναι στο δημοσίευση εφαρμογής iOS χωρίς Mac. Εδώ εστιάζουμε στην αποστολή.
Τι χρειάζεσαι πριν από την πρώτη εντολή
Το Expo αναφέρει τρεις προϋποθέσεις:
- Έναν πληρωμένο λογαριασμό Apple Developer. Την τιμή και την εγγραφή θα τις βρεις στο λογαριασμός Apple developer.
- Ένα bundle identifier στο
ios.bundleIdentifier. Σύμφωνα με την αναφορά της διαμόρφωσης του Expo, το επινοείς εσύ, αλλά πρέπει να είναι μοναδικό στο App Store. - Εγκατεστημένο EAS CLI, και μετά
eas loginμε τον λογαριασμό σου στο Expo.
Χρειάζεσαι επίσης ένα υπογεγραμμένο production build. Το EAS Build το φτιάχνει με το πιστοποιητικό και το profile που διαχειρίζεται για σένα, όπως εξηγεί το πιστοποιητικό και provisioning profile iOS.
Η καρτέλα στο App Store Connect: εσύ ή το EAS;
Το EAS Submit στέλνει ένα binary σε μια εφαρμογή που πρέπει να υπάρχει στο App Store Connect.
Μπορείς να τη δημιουργήσεις μόνος σου. Η βοήθεια της Apple περιγράφει το παράθυρο New App: πλατφόρμα, όνομα, κύρια γλώσσα, bundle identifier, SKU και πρόσβαση χρηστών. Χρειάζεσαι τον ρόλο Account Holder, Admin ή App Manager.
Μπορεί όμως να τη δημιουργήσει και το EAS στην πρώτη αποστολή. Σύμφωνα με τη σελίδα του Expo για το TestFlight, το eas submit δημιουργεί την καρτέλα όταν στέλνεις το πρώτο σου build. Σύμφωνα με την αναφορά του eas.json, αν συμπληρώσεις το ascAppId, το βήμα αυτό παραλείπεται. Το όνομα προέρχεται από το appName ή, αν λείπει, από το name της διαμόρφωσής σου. Η κύρια γλώσσα προέρχεται από το language, που είναι en-US από προεπιλογή. Αν η εφαρμογή σου βγει πρώτα στα γαλλικά, συμπλήρωσε το language πριν από αυτή την πρώτη αποστολή.
Μετά, αντέγραψε τον αριθμό της καρτέλας στο ascAppId. Το Expo λέει πού θα τον βρεις: άνοιξε την εφαρμογή σου στο App Store Connect και μετά App Information. Είναι το πεδίο Apple ID, κάτω από το General Information. Είναι αριθμός, όχι το bundle identifier σου.
Γιατί API key και όχι το Apple ID σου
Το EAS Submit συνδέεται στην Apple με το Apple ID σου ή με ένα API key του App Store Connect.
Το Apple ID σκοντάφτει στον έλεγχο ταυτότητας δύο παραγόντων, που η Apple απαιτεί από όλους τους χρήστες του App Store Connect: χρειάζεται ένας άνθρωπος να επιβεβαιώσει τη σύνδεση. Ο κωδικός εφαρμογής, που περνάει στο EXPO_APPLE_APP_SPECIFIC_PASSWORD, παρακάμπτει αυτό το βήμα, αλλά το Expo τον θεωρεί λιγότερο ασφαλή από το API key, την προεπιλεγμένη και προτεινόμενη μέθοδό του. Το key επιτρέπει πιστοποίηση χωρίς καμία αλληλεπίδραση, άρα και αυτοματοποίηση της αποστολής.
Δύο τρόποι για να το αποκτήσεις:
- Άφησε το EAS να το διαχειριστεί. Τρέξε
eas credentials --platform ios, διάλεξε το profileproduction, συνδέσου στον λογαριασμό σου στην Apple και μετά διάλεξε «App Store Connect: Manage your API Key». - Φέρε το δικό σου key. Στο App Store Connect: Users and Access, καρτέλα Integrations, App Store Connect API, Team Keys, και μετά Generate API Key. Χρειάζεσαι λογαριασμό Admin, και ο οδηγός του Expo δίνει στο key τον ρόλο Admin.
Στη δεύτερη περίπτωση, σημείωσε το Key ID, που εμφανίζεται στη λίστα των ενεργών keys, και το Issuer ID, στο πάνω μέρος της σελίδας Integrations. Κράτα οπωσδήποτε το αρχείο .p8: μπορείς να το κατεβάσεις μόνο μία φορά, και η Apple δεν κρατά κανένα αντίγραφο.
Ένα key Admin μπορεί, σύμφωνα με την Apple, να δημιουργεί και να διαγράφει χρήστες του λογαριασμού σου. Η Apple ζητά να μην αποθηκεύεις ποτέ το key σε αποθετήριο κώδικα.
Το ελάχιστο 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: οι servers του EAS κρατούν τον αριθμό build και τον αυξάνουν σε κάθε production build. Το Expo προτείνει αυτή την απομακρυσμένη λειτουργία από το EAS CLI 12.ascAppId: ο αριθμός της καρτέλας σου. Χωρίς αυτόν, η μη διαδραστική λειτουργία αποτυγχάνει.appleTeamId: το αναγνωριστικό της ομάδας σου στο Apple Developer.ascApiKeyPath,ascApiKeyIssuerId,ascApiKeyId: το API key σου. Και τα τρία πεδία δέχονται μεταβλητές περιβάλλοντος. Πρόσθεσε τον φάκελοkeysστο.gitignoreσου.
Το πεδίο appleId χρειάζεται μόνο αν συνδέεσαι με το Apple ID σου. Αν το EAS διαχειρίζεται ήδη το key σου, αφαίρεσε και τα τρία πεδία ascApiKey. Στις τρεις εφαρμογές μου, που τις ξαναέλεγξα στις 25 Οκτωβρίου, το production profile αποστολής περιέχει μόνο το ascAppId, συν το appleTeamId στο Solys: κανένα key μέσα στο αρχείο.
Τρέξε το build και μετά την αποστολή
eas build --platform ios --profile production
eas submit --platform ios
Χωρίς άλλη επιλογή, το eas submit σε βάζει να διαλέξεις ποιο build θα στείλεις και, την πρώτη φορά, σου ζητά το Apple ID σου. Το profile αποστολής production χρησιμοποιείται από προεπιλογή αν υπάρχει. Η αναφορά του EAS CLI παραθέτει τις επιλογές που παρακάμπτουν την επιλογή:
| Επιλογή | Τι κάνει |
|---|---|
--latest | Στέλνει το τελευταίο iOS build |
--id | Στέλνει ένα συγκεκριμένο EAS build |
--path | Στέλνει ένα τοπικό αρχείο .ipa |
--url | Στέλνει ένα online archive |
--groups | Προσθέτει σε εσωτερική ομάδα |
--what-to-test | Συμπληρώνει το «What to test» |
Για να γίνουν όλα μαζί, πρόσθεσε --auto-submit στην εντολή του build. Σύμφωνα με τη σελίδα του Expo για την αυτόματη αποστολή, το ολοκληρωμένο build πηγαίνει στο EAS Submit με το profile αποστολής που έχει το ίδιο όνομα με το build profile. Για να διαλέξεις άλλο: --auto-submit-with-profile=name. Το build πηγαίνει στο TestFlight, όχι για έλεγχο.
Σε continuous integration, πρόσθεσε --non-interactive και ένα token EXPO_TOKEN. Τότε η εντολή δεν μπορεί να σε ρωτήσει τίποτα: χρειάζεται το ascAppId στο profile και ένα API key, είτε αυτό που έχει συνδέσει το EAS με την εφαρμογή είτε το δικό σου στα τρία πεδία ascApiKey.
Τι γίνεται μετά την αποστολή
1. Η Apple επεξεργάζεται το build. Πρέπει να περάσει από αυτή την επεξεργασία πριν εμφανιστεί στο App Store Connect, και η Apple σού στέλνει email στο τέλος. Το 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, απαιτεί νέο build.
3. TestFlight. Στην κατάσταση Ready to Submit, σύμφωνα με την Apple, το build μπορεί να πάει στους εσωτερικούς testers, να περάσει beta review για τους εξωτερικούς ή να σταλεί για έλεγχο στο App Store. Το πεδίο groups του profile το προσθέτει στις εσωτερικές σου ομάδες. Όλα τα υπόλοιπα είναι στο TestFlight για να δοκιμάσεις την εφαρμογή σου.
Η αποστολή δεν είναι υποβολή για έλεγχο
Το Expo το γράφει: ένα build του TestFlight δεν δημοσιεύεται αυτόματα στο App Store. Το EAS Submit δεν συμπληρώνει ούτε την καρτέλα σου ούτε τα screenshots σου. Μένουν τέσσερις κινήσεις στο App Store Connect, που περιγράφονται στη βοήθεια της Apple για την υποβολή για έλεγχο:
- Συμπλήρωσε τα υποχρεωτικά metadata της έκδοσης.
- Διάλεξε το build στην ενότητα Build της έκδοσης.
- Πάτα «Add for Review». Η έκδοση περνά σε Ready for Review, αλλά τίποτα δεν έχει σταλεί ακόμα για έλεγχο.
- Πάτα «Submit for Review». Η κατάσταση γίνεται In Review όταν ξεκινήσει ο έλεγχος.
Τα συχνά σφάλματα και η διόρθωσή τους
| Σφάλμα που εμφανίζεται | Αιτία | Διόρθωση |
|---|---|---|
| ITMS-90189 | Ο αριθμός build υπάρχει ήδη | autoIncrement |
| ITMS-90062 ή 90186 | Η έκδοση έχει ήδη κλείσει | Αύξησε το version |
| «Set ascAppId» | Λείπει το ascAppId στο CI | Πρόσθεσε ascAppId |
| «API Keys cannot» | Κανένα συνδεδεμένο key | eas credentials |
| ITMS-90683 | Λείπει το purpose string | ios.infoPlist |
| ITMS-91053 | Ελλιπές manifest | ios.privacyManifests |
| ITMS-90725 | Πολύ παλιό iOS SDK | Αναβάθμισε το Expo SDK |
| Missing Compliance | Αδήλωτη κρυπτογράφηση | usesNonExemptEncryption |
Σύμφωνα με το Expo, ο αριθμός build που έχει ήδη χρησιμοποιηθεί είναι συχνή αιτία απόρριψης στην αποστολή: όλα είναι στο αριθμός build και έκδοση. Τρία σφάλματα έχουν δικό τους οδηγό: ITMS-90683 με Expo, ITMS-91053 με Expo και ITMS-90725.
Τα δύο μηνύματα σε εισαγωγικά προέρχονται από το EAS και διορθώνονται στη διαμόρφωσή του. Το Missing Compliance λύνεται και απαντώντας στις ερωτήσεις στο App Store Connect. Για όλες τις άλλες γραμμές, η διόρθωση αφορά το binary: κάνε νέο build και στείλ' το ξανά. Μια απομακρυσμένη ενημέρωση δεν αλλάζει ούτε το Info.plist, ούτε το manifest, ούτε τους αριθμούς.
Στείλε την πρώτη σου εφαρμογή χωρίς δοκιμή και λάθος
Η εντολή είναι μόνο ένα βήμα. Το iOS Kit ξεκινά από το Starter Code των εφαρμογών μου, μαζί με τις συνδρομές, και ακολουθεί τέσσερα βήματα μέχρι το App Store, με τον δικό σου ρυθμό.
Αν ετοιμάζεις την πρώτη σου κυκλοφορία, κάνε τη δωρεάν διάγνωση: σου λέει τι σε μπλοκάρει πραγματικά και σου στέλνει τη checklist μου κατά των απορρίψεων της Apple. Για την καρτέλα, τα screenshots και την έγκριση, η σελίδα δημοσίευση εφαρμογής στο App Store καλύπτει κάθε βήμα.
Συχνές ερωτήσεις
Πώς δημοσιεύω μια εφαρμογή Expo στο App Store;
Τρέξε ένα production build με το EAS Build και μετά στείλ' το με eas submit --platform ios. Αφού το επεξεργαστεί η Apple, εμφανίζεται στο TestFlight. Στο App Store Connect, συμπλήρωσε μετά την καρτέλα, διάλεξε αυτό το build στην έκδοση και πάτα «Add for Review» και «Submit for Review».
Στέλνει το EAS Submit την εφαρμογή μου για έλεγχο στην Apple;
Όχι. Το EAS Submit στέλνει το binary στο App Store Connect και το build φτάνει στο TestFlight. Η υποβολή για έλεγχο γίνεται χειροκίνητα στο App Store Connect, αφού συμπληρώσεις την καρτέλα και διαλέξεις το build.
Πού βρίσκω το ascAppId της εφαρμογής μου;
Στο App Store Connect, άνοιξε την εφαρμογή σου και μετά App Information. Είναι το πεδίο Apple ID, κάτω από το General Information. Είναι αριθμός και δεν πρέπει να το μπερδέψεις με το bundle identifier σου.
Χρειάζομαι Apple ID για να χρησιμοποιήσω το eas submit;
Την πρώτη φορά, η εντολή σού το ζητά. Μετά, με το ascAppId στο profile και ένα API key του App Store Connect, μπορεί να τρέχει χωρίς αλληλεπίδραση, ακόμα και σε continuous integration. Το API key είναι η προεπιλεγμένη και προτεινόμενη μέθοδος του Expo.
Πόσο χρόνο παίρνει μέχρι να δω το build στο TestFlight;
Το Expo μιλά συνήθως για 10 έως 15 λεπτά επεξεργασίας από την Apple, που σου στέλνει email στο τέλος. Αν το build μείνει στην κατάσταση Missing Compliance, απάντησε στις ερωτήσεις για την κρυπτογράφηση και μετά δήλωσέ την στη διαμόρφωσή σου για τα επόμενα builds.