ITMS-90717: תיקון Invalid large app icon ב-Expo
מאת Mehdi Azizi
פורסם ב-, 8 דק׳
ITMS-90717: באייקון 1024 x 1024 של ה-build נשארו שקיפות או ערוץ אלפא. מייצאים אותו אטום, בודקים עם sips ובונים build חדש.
ITMS-90717 היא בדיקה אוטומטית ש-Apple מריצה על ה-build שלך. היא אומרת שהאייקון הגדול של האפליקציה, זה בגודל 1024 x 1024 פיקסלים שמוצג ב-App Store, מכיל שקיפות או ערוץ אלפא. התיקון: אייקון מרובע ואטום, שמיוצא בלי ערוץ אלפא, ואז 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": אסור שיהיה שקוף, ואסור שיכיל ערוץ אלפא. הודעות ישנות יותר דיברו על "Invalid App Store Icon". זה אותו כלל.
האייקון הגדול הזה הוא האייקון של ה-App Store. התיעוד של Xcode על אייקונים מסביר: אפליקציה שמופצת ב-App Store חייבת לספק את האייקון של 1024 נקודות בקטלוג התמונות שלה.
ערוץ האלפא הוא השכבה הרביעית של PNG, לצד האדום, הירוק והכחול. הוא שומר את השקיפות של כל פיקסל. אייקון יכול להיראות מלא ועדיין להחזיק את הערוץ הזה: זו המלכודת שחוזרת בכל שרשור בפורומים.
כמו שאר שגיאות ה-ITMS, זו לא דחייה של reviewer. Apple ניתחה את הקובץ הבינארי ברגע השליחה. תלוי בכלי השליחה, השגיאה מופיעה ככישלון ולידציה, למשל עם הקוד 409.
בודקים את האייקון עם sips
ב-Mac, sips מותקן מראש. שורה אחת מספיקה:
sips -g hasAlpha assets/icon.png
אתה רוצה לראות hasAlpha: no. ב-15 באוקטובר 2026 הרצתי את הפקודה הזו על האייקונים שמוגדרים ב-app.json של Solys, TradaZen ו-Nolera: כולם עונים no, ב-1024 x 1024.
הכנתי גם אייקון ניסיון: ריבוע כחול אטום לגמרי, אבל שמור עם ערוץ אלפא. sips עונה yes. אף פיקסל לא שקוף, ובכל זאת הערוץ קיים. בגלל זה כל כך הרבה מפתחים כותבים "לאייקון שלי אין שום שקיפות" מתחת להודעה הזו.
ב-Preview, חלון ה-Inspector (Tools, Show Inspector) מציג גם את המאפיינים של התמונה, כולל ערוץ האלפא.
התיקון: לייצא את האייקון בלי ערוץ אלפא
שלוש שיטות, מהפשוטה למדויקת.
1. Preview. File, Export, פורמט PNG, ואז מבטלים את הסימון בתיבה Alpha. לקובץ המיוצא כבר אין ערוץ אלפא.
2. sips, בלי להתקין כלום. sips לא מסיר את ערוץ האלפא מ-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 מבקש את זה במדריך שלו לאייקון האפליקציה: האייקון צריך למלא את כל הריבוע, בלי פינות מעוגלות ובלי פיקסלים שקופים. iOS מחיל את המסכה בעצמו.
מאיפה Expo לוקח את האייקון, ומה הוא עושה איתו
Expo קורא קודם את ios.icon, ואז את השדה icon ברמה העליונה של הקונפיגורציה. לפי ה-reference של הקונפיגורציה של Expo, ios.icon מקבל שלוש צורות: PNG, אובייקט עם וריאנטים 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, שנמצאת באוויר, כוללת אותם. לא בדקתי את זה ב-IPA שלה.
המקרה של תיקיית ios ב-git
זו הסיבה הכי סבירה ב-Expo. העמוד של Expo על Continuous Native Generation אומר את זה: אם הפרויקט שלך מכיל את התיקיות android ו-ios, EAS Build לא מריץ את ה-prebuild. ה-app.json שלך כבר לא נוגע באייקון: מה שנשלח ל-Apple זה ה-PNG שבתיקיית ios.
תבדוק את זה מהתיקייה הראשית של הפרויקט:
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 יחיד עם כמה שכבות. לפי המדריך של Apple ל-Icon Composer, Xcode מפיק ממנו גם את התמונות לגרסאות iOS ישנות יותר.
Expo תומך בזה מאז SDK 54. מגדירים את התיקייה כמחרוזת, אף פעם לא בתוך אובייקט הווריאנטים:
{
"expo": {
"ios": {
"icon": "./assets/app.icon"
}
}
}
במקרה הזה, ה-prebuild מעתיק את התיקייה בלי לגעת בה, ו-Xcode הוא זה שמייצר את האייקון הסופי. לכן צריך Xcode 26 ומעלה, זה שמגיע עם ה-images העדכניים של EAS, כמו שאני מסביר במדריך על ITMS-90725.
מאז אוגוסט 2025, בפורום המפתחים של Apple, יש שרשורים שמדווחים על ITMS-90717 עם קבצי .icon. הכיוונים שעלו: שכבת PNG שקופה, שכבה גדולה מהקנבס, קבוצה עם אפקט Blur קרוב לקצה. העקיפות שהוזכרו: לכבות את ה-Blur, לשמור על רקע מלא, או לחזור ל-PNG. השרשורים האלה לא נותנים שום תיקון רשמי מ-Apple, והשגיאה עדיין דווחה באוגוסט 2026.
ההנחיות של Apple לאייקונים הולכות באותו כיוון: אם אתה מייבא שכבת רקע, היא צריכה לכסות את כל השטח ולהיות אטומה. האפליקציות שלי עדיין משתמשות ב-PNG, אז לא בדקתי את Icon Composer ב-production. אם קובץ .icon חוסם את השליחה שלך, תחזיר את ios.icon ל-PNG: Expo ישטח אותו, והאייקון שלך יעבור את הבדיקה הזו.
בודקים את האייקון ב-build הסופי
ב-IPA, אייקון ה-1024 הוא לא קובץ PNG: Xcode מקמפל אותו לתוך 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 קימפלתי עם actool, הכלי של Xcode, את האייקון של Solys ואת אייקון הניסיון שלי עם הפינות השקופות. הראשון יוצא "Opaque" : true, השני "Opaque" : false. Apple לא מתעדת את השדה הזה: תתייחס אליו כרמז, לא כבדיקה של Apple.
מלכודת שכדאי להכיר: אל תבדוק עם sips את קובצי ה-PNG הקטנים שיושבים בשורש האפליקציה. Xcode כותב אותם עם ערוץ אלפא, גם כשהמקור אטום. בבדיקה שלי עם האייקון של Solys, sips עונה עליהם yes.
שגיאות האייקון האחרות
| קוד | מה Apple מדווחת | כיוון ב-Expo |
|---|---|---|
| ITMS-90717 | אייקון 1024 שקוף | לייצא בלי אלפא |
| ITMS-90704 | אייקון 1024 חסר | חסרה רשומת 1024 |
| ITMS-90022 | אייקון iPhone חסר | קטלוג לא שלם |
| ITMS-90023 | אייקון iPad חסר | קטלוג לא שלם |
שלוש ההודעות האחרונות מגיעות בעיקר מ-2017 ו-2018, כש-Xcode 9 שינה את הכללים של האייקונים.
ב-Expo הן הפכו לנדירות. ה-prebuild כותב אייקון אוניברסלי יחיד של 1024, ו-Xcode מייצר את שאר הגדלים. בלי אייקון מוגדר, Expo אפילו יוצר ריבוע לבן, כדי למנוע כישלון בשליחה. אם אחת השגיאות האלה מופיעה, תסתכל על תיקיית ios שב-git: הקובץ Contents.json של AppIcon.appiconset צריך להכיל רשומה בגודל 1024x1024, וה-PNG שהיא מפנה אליו צריך להתקיים.
לפני השליחה הבאה שלך
אייקון מתקנים בעשר דקות, אבל כל שגיאה עולה לך build. שאר הבדיקות האוטומטיות דורשות אותה הקפדה, כמו ITMS-90683 למשפטי ההרשאה או ITMS-91053 ל-privacy manifest. ברגע שה-build מתקבל, תתקין אותו עם TestFlight כדי לראות את האייקון על מסך הבית שלך.
דחיות של reviewer דורשות יותר פרספקטיבה: התהליך נמצא בעמוד אפליקציה שנדחתה על ידי Apple, והסיבות הנפוצות ביותר נמצאות בלמה Apple דוחה אפליקציה.
כדי לבדוק את התיק שלך לפני השליחה, ה-Review Kit מאגד את הצ'קליסט שלי ו-skills של Claude Code שעוברים על הפרויקט שלך. אם השליחה שלך תקועה ואתה רוצה עין אנושית, תקבע איתי שעה: נעבור על הפרויקט שלך בשיחת וידאו, על המסך שלך. ואם אתה מכין את ההשקה הראשונה שלך, תעשה את האבחון החינמי: הוא מסדר את השלבים לפי הסדר ושולח לך את הצ'קליסט שלי נגד דחיות של Apple.
שאלות נפוצות
למה Apple רואה ערוץ אלפא כשלאייקון שלי אין שום שקיפות?
כי PNG יכול להחזיק ערוץ אלפא גם כשכל הפיקסלים שלו אטומים. הרבה כלים מוסיפים אותו כברירת מחדל בייצוא. תבדוק עם sips -g hasAlpha, ואז תייצא את האייקון מחדש בלי הערוץ הזה.
אפשר לתקן את ITMS-90717 עם עדכון מרחוק?
לא. האייקון מקומפל לתוך הקובץ הבינארי, ב-Assets.car. עדכון מרחוק משנה רק את ה-JavaScript ואת המשאבים של האפליקציה. תתקן את האייקון, תבנה build חדש, ותשלח אותו שוב.
האייקון הכהה יכול להיות שקוף?
כן. Apple מבקשת רקע שקוף לווריאנט הכהה, ו-Expo שומר על השקיפות שלו. מזה אני מסיק שהבדיקה מכוונת לאייקון הראשי, זה של ה-App Store: הוא זה שצריך להיות אטום.
צריך לעגל את הפינות של אייקון ה-iOS?
לא. תספק ריבוע מלא: iOS מחיל את המסכה בעצמו. פינות מעוגלות משאירות פיקסלים שקופים בפינות, בדיוק מה שהבדיקה הזו דוחה.
Expo תומך באייקוני Icon Composer של iOS 26?
כן, מאז SDK 54: מגדירים את הנתיב לתיקיית ה-.icon ב-ios.icon, כמחרוזת. ה-prebuild מעתיק אותה כמו שהיא ו-Xcode 26 מקמפל אותה. אם יש ITMS-90717 עם הפורמט הזה, תבדוק שכבות שקופות ואת אפקט ה-Blur, או תחזור זמנית ל-PNG.

