ITMS-90717: διόρθωση «Invalid large app icon» με Expo
Από Mehdi Azizi
Δημοσιεύτηκε στις , 8 λ.
ITMS-90717: το εικονίδιο 1024 x 1024 του build σου έχει διαφάνεια ή κανάλι alpha. Κάν' το export αδιαφανές, έλεγξέ το με sips και ξαναφτιάξε build.
ITMS-90717 είναι ένας αυτόματος έλεγχος της Apple στο build σου. Σου λέει ότι το μεγάλο εικονίδιο της εφαρμογής, αυτό των 1024 x 1024 pixels που εμφανίζει το App Store, περιέχει διαφάνεια ή κανάλι alpha. Η διόρθωση: ένα τετράγωνο, αδιαφανές εικονίδιο, εξαγμένο χωρίς κανάλι alpha, και μετά ένα νέο build.
Με το Expo, το PNG σου σπάνια φταίει: το prebuild το τοποθετεί ήδη πάνω σε λευκό φόντο. Διάβασα αυτόν τον κώδικα στο SDK 57 και έλεγξα τα εικονίδια των Solys, TradaZen και Nolera. Το σφάλμα τότε έρχεται συνήθως από έναν φάκελο ios που βρίσκεται στο git ή από ένα αρχείο Icon Composer. Δες πώς θα βρεις ποιο από τα δύο φταίει, και πώς θα το διορθώσεις.
Τι σημαίνει το σφάλμα ITMS-90717;
Το μήνυμα έχει τίτλο «ITMS-90717: Invalid large app icon». Διευκρινίζει ότι το μεγάλο εικονίδιο στον κατάλογο εικόνων της εφαρμογής σου «can't be transparent or contain an alpha channel»: δεν μπορεί να είναι διάφανο ούτε να περιέχει κανάλι alpha. Τα παλιότερα μηνύματα έλεγαν «Invalid App Store Icon». Ο κανόνας είναι ο ίδιος.
Αυτό το μεγάλο εικονίδιο είναι αυτό του App Store. Η τεκμηρίωση του Xcode για τα εικονίδια το εξηγεί: μια εφαρμογή που διανέμεται στο App Store πρέπει να έχει το εικονίδιο των 1024 points στον κατάλογο εικόνων της.
Το κανάλι alpha είναι το τέταρτο επίπεδο ενός PNG, δίπλα στο κόκκινο, το πράσινο και το μπλε. Αποθηκεύει τη διαφάνεια κάθε pixel. Ένα εικονίδιο μπορεί να φαίνεται γεμάτο και να κρατάει αυτό το κανάλι: αυτή είναι η παγίδα που εμφανίζεται σε κάθε νήμα στα forum.
Όπως και τα άλλα σφάλματα ITMS, δεν πρόκειται για απόρριψη από reviewer. Η Apple ανέλυσε το binary κατά την παράδοση. Ανάλογα με το εργαλείο αποστολής, το σφάλμα εμφανίζεται ως αποτυχία επικύρωσης, για παράδειγμα με τον κωδικό 409.
Έλεγξε το εικονίδιό σου με sips
Σε Mac, το sips είναι ήδη εγκατεστημένο. Μία γραμμή αρκεί:
sips -g hasAlpha assets/icon.png
Θέλεις να δεις hasAlpha: no. Στις 15 Οκτωβρίου 2026, έτρεξα αυτή την εντολή στα εικονίδια που δηλώνονται στα app.json των Solys, TradaZen και Nolera: όλα απαντούν no, σε 1024 x 1024.
Έφτιαξα επίσης ένα δοκιμαστικό εικονίδιο: ένα μπλε τετράγωνο εντελώς αδιαφανές, αλλά αποθηκευμένο με κανάλι alpha. Το sips απαντά yes. Κανένα pixel δεν είναι διάφανο, κι όμως το κανάλι υπάρχει. Γι' αυτό τόσοι developers γράφουν «το εικονίδιό μου δεν έχει καμία διαφάνεια» κάτω από αυτό το μήνυμα.
Στο Preview, ο inspector (Tools, Show Inspector) δείχνει επίσης τις ιδιότητες της εικόνας, μαζί και το κανάλι alpha.
Διόρθωση: κάνε export το εικονίδιο χωρίς κανάλι alpha
Τρεις μέθοδοι, από την πιο απλή στην πιο ακριβή.
1. Preview. File, Export, μορφή PNG, και ξετσέκαρε το κουτάκι Alpha. Το αρχείο που εξάγεται δεν έχει πια κανάλι alpha.
2. sips, χωρίς να εγκαταστήσεις τίποτα. Το sips δεν αφαιρεί το κανάλι alpha από ένα PNG. Πρέπει να περάσεις από ένα JPEG, που δεν έχει:
sips -s format jpeg -s formatOptions 100 icon.png --out icon.jpg
sips -s format png icon.jpg --out icon-opaque.png
sips -g hasAlpha icon-opaque.png
Στο δοκιμαστικό μου εικονίδιο με διάφανες γωνίες, οι γωνίες έγιναν λευκές και η τελευταία γραμμή απαντά no. Το πέρασμα από JPEG συμπιέζει λίγο την εικόνα, ακόμα και στη μέγιστη ποιότητα: κοίτα το αποτέλεσμα από κοντά.
3. ImageMagick. Αν το έχεις εγκατεστημένο, διαλέγεις το χρώμα του φόντου:
magick icon.png -background white -alpha remove -alpha off icon-opaque.png
Σύμφωνα με την τεκμηρίωση του ImageMagick, το -alpha remove τοποθετεί την εικόνα πάνω στο χρώμα φόντου και το -alpha off απενεργοποιεί το κανάλι.
Και οι τρεις μέθοδοι γεμίζουν τη διαφάνεια με ένα ενιαίο χρώμα. Αν το λογότυπό σου «κρεμόταν» σε διάφανο φόντο, το πιο καθαρό είναι να ξαναπιάσεις το αρχικό αρχείο και να σχεδιάσεις ένα πραγματικό φόντο. Το Expo το ζητάει στον οδηγό του για το εικονίδιο εφαρμογής: το εικονίδιο πρέπει να γεμίζει όλο το τετράγωνο, χωρίς στρογγυλεμένες γωνίες ή διάφανα pixels. Το iOS εφαρμόζει μόνο του τη μάσκα.
Από πού παίρνει το Expo το εικονίδιό σου, και τι κάνει με αυτό
Το Expo διαβάζει πρώτα το ios.icon και μετά το πεδίο icon στη ρίζα του configuration σου. Σύμφωνα με την αναφορά του configuration του Expo, το ios.icon δέχεται τρεις μορφές: ένα PNG, ένα object με παραλλαγές light, dark και tinted, ή έναν φάκελο .icon φτιαγμένο με το Icon Composer.
Ο παρακάτω πίνακας βγαίνει από τον κώδικα που δημιουργεί το εικονίδιο iOS στο prebuild, @expo/prebuild-config 57.0.16 (SDK 57), που διάβασα στις 15 Οκτωβρίου 2026:
| Τι δηλώνεις | Τι κάνει το prebuild | Κίνδυνος ITMS-90717 |
|---|---|---|
icon σε PNG | Ισοπεδώνεται σε λευκό φόντο | Χαμηλός |
ios.icon.light | Ισοπεδώνεται σε λευκό φόντο | Χαμηλός |
ios.icon.tinted | Ισοπεδώνεται σε λευκό φόντο | Χαμηλός |
ios.icon.dark | Η διαφάνεια διατηρείται | Το θέλει η Apple |
ios.icon σε .icon | Αντιγράφεται όπως είναι | Πραγματικός |
Φάκελος ios στο git | Το prebuild δεν ξανατρέχει | Πραγματικός |
Με ένα PNG, το Expo αφαιρεί μόνο του τη διαφάνεια και την αντικαθιστά με λευκό. Ένα λογότυπο χωρίς φόντο καταλήγει λοιπόν σε λευκό τετράγωνο: κανένα σφάλμα, αλλά ένα αποτέλεσμα που ίσως δεν ήθελες. Η σκούρα παραλλαγή κρατάει τη διαφάνειά της, και αυτό είναι σκόπιμο: η Apple ζητάει διάφανο φόντο για το σκούρο εικονίδιο, ώστε να φαίνεται το φόντο που δίνει το σύστημα.
Στο Nolera, που δηλώνει και τις τρεις παραλλαγές, το sips απαντά no για το φωτεινό και το tinted εικονίδιο που δημιουργήθηκαν, και yes για το σκούρο. Με βάση την ημερομηνία του commit αυτών των παραλλαγών, η έκδοση 1.0.2, που είναι online, τις περιέχει. Δεν το έλεγξα μέσα στο IPA της.
Η περίπτωση του φακέλου ios στο git
Αυτή είναι η πιο πιθανή αιτία με το Expo. Η σελίδα του Expo για το continuous native generation το λέει: αν το project σου περιέχει τους φακέλους android και ios, το EAS Build δεν τρέχει το prebuild. Το app.json σου τότε δεν αγγίζει πια το εικονίδιο: πηγαίνει στην Apple το PNG του φακέλου ios.
Έλεγξέ το από τη ρίζα του project:
sips -g hasAlpha ios/*/Images.xcassets/AppIcon.appiconset/*.png
Αν η εντολή απαντά yes για το εικονίδιο 1024, αντικατάστησε αυτό το αρχείο με την αδιαφανή εκδοχή σου, με το ίδιο όνομα. Αν δεν έχεις κάνει καμία native αλλαγή με το χέρι, μπορείς επίσης να σβήσεις τον φάκελο ios και να τον προσθέσεις στο .gitignore: το EAS θα τον ξαναδημιουργεί σε κάθε build. Στα Solys, TradaZen και Nolera, αυτός ο φάκελος αγνοείται από το git.
Η μορφή του iOS 26: Icon Composer
Το Icon Composer είναι το εργαλείο της Apple για τα εικονίδια Liquid Glass του iOS 26. Παράγει ένα μόνο αρχείο .icon με πολλά layers. Σύμφωνα με τον οδηγό της Apple για το Icon Composer, το Xcode βγάζει από αυτό και τις εικόνες για τις παλιότερες εκδόσεις του iOS.
Το Expo το υποστηρίζει από το SDK 54. Δηλώνεις τον φάκελο ως string, ποτέ μέσα στο object των παραλλαγών:
{
"expo": {
"ios": {
"icon": "./assets/app.icon"
}
}
}
Σε αυτή την περίπτωση, το prebuild αντιγράφει τον φάκελο χωρίς να τον πειράξει, και το Xcode φτιάχνει το τελικό εικονίδιο. Χρειάζεσαι λοιπόν Xcode 26 ή νεότερο, αυτό των πρόσφατων images του EAS, όπως εξηγώ στον οδηγό για το ITMS-90725.
Από τον Αύγουστο του 2025, στο forum των developers της Apple, υπάρχουν νήματα που αναφέρουν ITMS-90717 με αρχεία .icon. Οι πιθανές αιτίες που αναφέρονται: ένα διάφανο PNG layer, ένα layer μεγαλύτερο από τον καμβά, ένα group με εφέ Blur κοντά στην άκρη. Οι παρακάμψεις που αναφέρονται: να κλείσεις το Blur, να κρατήσεις γεμάτο φόντο ή να γυρίσεις σε PNG. Αυτά τα νήματα δεν δίνουν καμία επίσημη διόρθωση από την Apple, και το σφάλμα αναφερόταν ακόμα τον Αύγουστο του 2026.
Οι κανόνες της Apple για τα εικονίδια πάνε προς την ίδια κατεύθυνση: αν εισάγεις layer φόντου, πρέπει να καλύπτει όλη την επιφάνεια και να είναι αδιαφανές. Οι εφαρμογές μου χρησιμοποιούν ακόμα PNG, οπότε δεν έχω δοκιμάσει το Icon Composer σε production. Αν ένα αρχείο .icon μπλοκάρει την αποστολή σου, γύρνα το ios.icon σε PNG: το Expo θα το ισοπεδώσει και το εικονίδιό σου θα περάσει αυτόν τον έλεγχο.
Έλεγξε το εικονίδιο στο τελικό build
Μέσα στο IPA, το εικονίδιο 1024 δεν είναι αρχείο PNG: το Xcode το κάνει compile μέσα στο Assets.car. Κατέβασε το IPA από τη σελίδα του build στο expo.dev και τρέξε:
unzip -q MyApp.ipa -d ipa
xcrun assetutil --info ipa/Payload/*.app/Assets.car | grep -B3 '"RenditionName" : "App-Icon'
Κάθε εικονίδιο δείχνει ένα πεδίο Opaque. Στις 15 Οκτωβρίου 2026, έκανα compile με το actool, το εργαλείο του Xcode, το εικονίδιο του Solys και το δοκιμαστικό μου εικονίδιο με διάφανες γωνίες. Το πρώτο βγαίνει "Opaque" : true, το δεύτερο "Opaque" : false. Η Apple δεν τεκμηριώνει αυτό το πεδίο: δες το ως ένδειξη, όχι ως τον έλεγχο της Apple.
Μια παγίδα που πρέπει να ξέρεις: μην ελέγχεις με sips τα μικρά PNG που βρίσκονται στη ρίζα της εφαρμογής. Το Xcode τα γράφει με κανάλι alpha, ακόμα κι όταν η πηγή είναι αδιαφανής. Στη δοκιμή μου με το εικονίδιο του Solys, το sips απαντά yes γι' αυτά.
Τα άλλα σφάλματα εικονιδίου
| Κωδικός | Τι αναφέρει η Apple | Πού να κοιτάξεις με Expo |
|---|---|---|
| ITMS-90717 | Διάφανο εικονίδιο 1024 | Export χωρίς alpha |
| ITMS-90704 | Λείπει το εικονίδιο 1024 | Λείπει η εγγραφή 1024 |
| ITMS-90022 | Λείπει εικονίδιο iPhone | Ελλιπής κατάλογος |
| ITMS-90023 | Λείπει εικονίδιο iPad | Ελλιπής κατάλογος |
Τα τρία τελευταία μηνύματα εμφανίζονταν κυρίως το 2017 και το 2018, όταν το Xcode 9 άλλαξε τους κανόνες για τα εικονίδια.
Με το Expo έχουν γίνει σπάνια. Το prebuild γράφει ένα μόνο universal εικονίδιο 1024 και το Xcode δημιουργεί τα άλλα μεγέθη. Αν δεν δηλώσεις εικονίδιο, το Expo φτιάχνει ακόμα και ένα λευκό τετράγωνο, για να αποφύγει αποτυχία στην αποστολή. Αν πέσει ένα από αυτά τα σφάλματα, κοίτα τον φάκελο ios στο git: το αρχείο Contents.json του AppIcon.appiconset πρέπει να περιέχει μια εγγραφή μεγέθους 1024x1024, και το PNG που αναφέρει πρέπει να υπάρχει.
Πριν από την επόμενη αποστολή σου
Ένα εικονίδιο διορθώνεται σε δέκα λεπτά, αλλά κάθε σφάλμα σού κοστίζει ένα build. Οι άλλοι αυτόματοι έλεγχοι θέλουν την ίδια προσοχή, όπως το ITMS-90683 για τα κείμενα αδειών ή το ITMS-91053 για το privacy manifest. Μόλις γίνει δεκτό το build, εγκατάστησέ το με το TestFlight για να δεις το εικονίδιό σου στην αρχική οθόνη σου.
Οι απορρίψεις από reviewer θέλουν περισσότερη ψυχραιμία: η διαδικασία είναι στη σελίδα εφαρμογή που απέρριψε η Apple, και οι πιο συχνοί λόγοι είναι στο γιατί η Apple απορρίπτει μια εφαρμογή.
Για να ελέγξεις το project σου πριν από την αποστολή, το Review Kit συγκεντρώνει τη checklist μου και skills του Claude Code που ξαναδιαβάζουν το project σου. Αν η αποστολή σου έχει κολλήσει και θέλεις ένα ανθρώπινο μάτι, κλείσε μια ώρα μαζί μου: δουλεύουμε το project σου σε βιντεοκλήση, στην οθόνη σου. Κι αν ετοιμάζεις την πρώτη σου κυκλοφορία, κάνε το δωρεάν διαγνωστικό σου: βάζει τα βήματα στη σειρά και σου στέλνει τη checklist μου κατά των απορρίψεων της Apple.
Συχνές ερωτήσεις
Γιατί η Apple βλέπει κανάλι alpha ενώ το εικονίδιό μου δεν έχει καμία διαφάνεια;
Γιατί ένα PNG μπορεί να κρατάει κανάλι alpha ακόμα κι όταν όλα τα pixels του είναι αδιαφανή. Πολλά εργαλεία το προσθέτουν από προεπιλογή στο export. Έλεγξε με sips -g hasAlpha και μετά κάνε ξανά export το εικονίδιο χωρίς αυτό το κανάλι.
Μπορώ να διορθώσω το ITMS-90717 με απομακρυσμένη ενημέρωση;
Όχι. Το εικονίδιο γίνεται compile μέσα στο binary, στο Assets.car. Μια απομακρυσμένη ενημέρωση αλλάζει μόνο το JavaScript και τα resources της εφαρμογής. Διόρθωσε το εικονίδιο, ξαναφτιάξε build και στείλ' το ξανά.
Μπορεί το σκούρο εικονίδιο να είναι διάφανο;
Ναι. Η Apple ζητάει διάφανο φόντο για τη σκούρα παραλλαγή, και το Expo κρατάει τη διαφάνειά της. Συμπεραίνω ότι ο έλεγχος αφορά το κύριο εικονίδιο, αυτό του App Store: αυτό πρέπει να είναι αδιαφανές.
Πρέπει να στρογγυλέψω τις γωνίες του εικονιδίου iOS;
Όχι. Δώσε ένα γεμάτο τετράγωνο: το iOS εφαρμόζει μόνο του τη μάσκα. Οι στρογγυλεμένες γωνίες αφήνουν διάφανα pixels στις άκρες, ακριβώς αυτό που απορρίπτει αυτός ο έλεγχος.
Υποστηρίζει το Expo τα εικονίδια Icon Composer του iOS 26;
Ναι, από το SDK 54: δήλωσε τη διαδρομή του φακέλου .icon στο ios.icon, ως string. Το prebuild τον αντιγράφει όπως είναι και το Xcode 26 τον κάνει compile. Αν πάρεις ITMS-90717 με αυτή τη μορφή, έλεγξε τα διάφανα layers και το εφέ Blur, ή γύρνα προσωρινά σε PNG.

