ITMS-90717 錯誤修正:Expo App 圖示透明問題
作者:Mehdi Azizi
發布於 ,8 分鐘
ITMS-90717 代表你 build 裡的 1024 x 1024 圖示還有透明度或 Alpha 色版。把它輸出成不透明圖片,用 sips 檢查,再重新 build。
ITMS-90717 是 Apple 對你的 build 做的自動檢查。它的意思是:App 的大圖示,也就是 App Store 上顯示的那張 1024 x 1024 像素圖示,含有透明度或 Alpha 色版。解法:準備一張正方形、不透明、輸出時不帶 Alpha 色版的圖示,然後重新 build。
用 Expo 的話,問題很少出在你的 PNG 檔:prebuild 本來就會把它鋪在白底上。我讀過 SDK 57 的這段程式碼,也檢查過 Solys、TradaZen 和 Nolera 的圖示。所以錯誤最常來自納入版本控制的 ios 資料夾,或是 Icon Composer 檔案。下面教你找出是哪一個,並把它修好。
ITMS-90717 錯誤是什麼意思?
訊息標題是「ITMS-90717: Invalid large app icon」。它說明你 App 圖片目錄裡的大圖示「can't be transparent or contain an alpha channel」:不能透明,也不能含有 Alpha 色版。舊版訊息寫的是「Invalid App Store Icon」,規則是一樣的。
這張大圖示就是 App Store 上的圖示。Xcode 關於圖示的文件有說明:在 App Store 發行的 App,必須在圖片目錄中提供 1024 point 的圖示。
Alpha 色版是 PNG 的第四層,跟紅、綠、藍並列,用來儲存每個像素的透明度。一張圖示看起來完全不透明,仍可能保留這個色版:這就是每篇論壇討論串都會出現的陷阱。
跟其他 ITMS 錯誤一樣,這不是審核人員的拒絕。是 Apple 在你上傳時分析了二進位檔。依上傳工具不同,這個錯誤會顯示成驗證失敗,例如代碼 409。
用 sips 檢查你的圖示
Mac 內建 sips,一行指令就夠:
sips -g hasAlpha assets/icon.png
你要看到的是 hasAlpha: no。2026 年 10 月 15 日,我對 Solys、TradaZen 和 Nolera 的 app.json 裡宣告的圖示跑了這個指令:全部回應 no,尺寸都是 1024 x 1024。
我也做了一張測試圖示:一個完全不透明的藍色正方形,但存檔時帶了 Alpha 色版。sips 回應 yes。沒有任何像素是透明的,色版卻還在。 這就是為什麼這麼多開發者在這則訊息下面留言「我的圖示根本沒有透明」。
在「預覽程式」裡,檢閱器(Tools、Show Inspector)也會列出圖片屬性,包括 Alpha 色版。
修正:輸出不帶 Alpha 色版的圖示
三種方法,從最簡單到最精確。
1. 預覽程式。 File、Export,格式選 PNG,然後取消勾選 Alpha。輸出的檔案就沒有 Alpha 色版了。
2. sips,不用另外安裝任何東西。 sips 沒辦法直接移除 PNG 的 Alpha 色版,要先轉成沒有 Alpha 的 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 則會關閉色版。
這三種方法都是用單一顏色填滿透明區域。如果你的 logo 原本浮在透明背景上,最乾淨的做法是回到原始檔,畫上真正的背景。Expo 在它的 App 圖示指南裡也這樣要求:圖示要填滿整個正方形,不要圓角,也不要透明像素。iOS 會自己套用遮罩。
Expo 從哪裡拿你的圖示,又怎麼處理
Expo 會先讀 ios.icon,再讀設定檔根層的 icon 欄位。根據 Expo 設定參考文件,ios.icon 接受三種形式:一個 PNG、一個包含 light、dark 和 tinted 變體的物件,或是用 Icon Composer 建立的 .icon 資料夾。
下表來自 prebuild 時產生 iOS 圖示的程式碼 @expo/prebuild-config 57.0.16(SDK 57),閱讀日期為 2026 年 10 月 15 日:
| 你宣告的內容 | prebuild 的處理 | ITMS-90717 風險 |
|---|---|---|
icon 為 PNG | 平面化鋪在白底 | 低 |
ios.icon.light | 平面化鋪在白底 | 低 |
ios.icon.tinted | 平面化鋪在白底 | 低 |
ios.icon.dark | 保留透明度 | Apple 的要求 |
ios.icon 為 .icon | 原封不動複製 | 確實存在 |
納入版本控制的 ios 資料夾 | 不會重跑 prebuild | 確實存在 |
用 PNG 的話,Expo 會自己移除透明度,換成白色。 所以去背的 logo 最後會放在白色正方形上:不會報錯,但效果可能不是你想要的。深色變體會保留透明度,這是刻意的:Apple 要求深色圖示使用透明背景,讓系統提供的背景能顯示出來。
Nolera 宣告了三種變體,sips 對產生出來的淺色和著色圖示回應 no,對深色圖示回應 yes。根據這些變體的 commit 日期,已上架的 1.0.2 版有包含它們。我沒有在它的 IPA 裡驗證過。
納入版本控制的 ios 資料夾
這是 Expo 最可能的原因。Expo 關於持續原生產生的頁面寫得很清楚:如果你的專案裡有 android 和 ios 資料夾,EAS Build 就不會執行 prebuild。這時你的 app.json 不會再動到圖示:送到 Apple 的是 ios 資料夾裡的 PNG。
在專案根目錄檢查:
sips -g hasAlpha ios/*/Images.xcassets/AppIcon.appiconset/*.png
如果 1024 圖示回應 yes,就用你的不透明版本取代這個檔案,檔名不變。如果你沒有手動改過任何原生程式碼,也可以直接刪掉 ios 資料夾,並把它加進 .gitignore:EAS 每次 build 都會重新產生。在 Solys、TradaZen 和 Nolera 上,這個資料夾都被 git 忽略。
iOS 26 的格式:Icon Composer
Icon Composer 是 Apple 為 iOS 26 Liquid Glass 圖示推出的工具。它會產生單一個多圖層的 .icon 檔。根據 Apple 的 Icon Composer 指南,Xcode 也會從中產生舊版 iOS 用的圖片。
Expo 從 SDK 54 開始支援。你要用字串宣告資料夾路徑,絕對不要放在變體物件裡:
{
"expo": {
"ios": {
"icon": "./assets/app.icon"
}
}
}
這種情況下,prebuild 會原封不動複製資料夾,由 Xcode 產生最終圖示。所以需要 Xcode 26 以上,也就是近期 EAS 映像檔所用的版本,我在 ITMS-90725 的指南裡有說明。
從 2025 年 8 月起,Apple 開發者論壇上就有討論串回報 .icon 檔觸發 ITMS-90717。回報的可能原因有:透明的 PNG 圖層、比畫布還大的圖層、靠近邊緣且套用 Blur 效果的群組。提到的變通方法有:關掉 Blur、保留實心背景,或改回 PNG。這些討論串裡沒有 Apple 的官方修正,而且到 2026 年 8 月仍有人回報這個錯誤。
Apple 的圖示規範也是這個方向:如果你匯入背景圖層,它必須覆蓋整個區域且不透明。我的 App 還在用 PNG,所以我沒有在正式環境測試過 Icon Composer。如果 .icon 檔卡住你的上傳,就把 ios.icon 改回 PNG:Expo 會把它平面化,你的圖示就能通過這項檢查。
在最終 build 裡檢查圖示
在 IPA 裡,1024 圖示不是 PNG 檔:Xcode 會把它編譯進 Assets.car。從 expo.dev 的 build 頁面下載 IPA,然後執行:
unzip -q YourApp.ipa -d ipa
xcrun assetutil --info ipa/Payload/*.app/Assets.car | grep -B3 '"RenditionName" : "App-Icon'
每個圖示都會顯示一個 Opaque 欄位。2026 年 10 月 15 日,我用 Xcode 的工具 actool 編譯了 Solys 的圖示和我那張四角透明的測試圖示。前者輸出 "Opaque" : true,後者輸出 "Opaque" : false。Apple 沒有說明這個欄位:把它當作線索,而不是 Apple 的檢查本身。
有個陷阱要知道:不要用 sips 檢查放在 App 根目錄的小 PNG。 Xcode 寫出這些檔案時會帶 Alpha 色版,即使原始圖是不透明的。我用 Solys 圖示測試時,sips 對它們回應 yes。
其他圖示錯誤
| 代碼 | Apple 回報的問題 | Expo 的排查方向 |
|---|---|---|
| ITMS-90717 | 1024 圖示透明 | 輸出不帶 Alpha |
| ITMS-90704 | 缺少 1024 圖示 | 缺少 1024 項目 |
| ITMS-90022 | 缺少 iPhone 圖示 | 圖片目錄不完整 |
| ITMS-90023 | 缺少 iPad 圖示 | 圖片目錄不完整 |
後三則訊息主要出現在 2017 和 2018 年,當時 Xcode 9 改了圖示規則。
用 Expo 的話,這些錯誤已經很少見。prebuild 只寫入一張 1024 的通用圖示,其他尺寸由 Xcode 產生。如果沒有宣告圖示,Expo 甚至會建立一個白色正方形,避免上傳失敗。如果遇到其中一個錯誤,就去看納入版本控制的 ios 資料夾:AppIcon.appiconset 裡的 Contents.json 必須有一個尺寸為 1024x1024 的項目,而且它引用的 PNG 必須存在。
下次上傳之前
圖示十分鐘就能修好,但每次出錯都要多花一次 build。其他自動檢查也需要同樣嚴謹,例如權限說明文字的 ITMS-90683,或隱私權清單的 ITMS-91053。build 被接受之後,用 TestFlight 安裝它,看看你的圖示在主畫面上的樣子。
審核人員的拒絕就需要多想一下:處理流程在 App 被 Apple 拒絕這一頁,最常見的原因則在 Apple 為什麼拒絕 App。
要在上傳前檢查你的專案,Review Kit 整合了我的檢查清單,以及會幫你審視專案的 Claude Code skills。如果你的上傳卡住了,想找真人看一下,跟我預約一小時:我們透過視訊,在你的螢幕上一起看你的專案。如果你正在準備第一次上架,來做免費診斷:它會幫你把步驟排好順序,並寄給你我的 Apple 防拒絕檢查清單。
常見問題
為什麼我的圖示完全沒有透明,Apple 卻說有 Alpha 色版?
因為即使所有像素都不透明,PNG 仍可能保留 Alpha 色版。很多工具輸出時預設就會加上。用 sips -g hasAlpha 檢查,再把圖示重新輸出成不帶這個色版的版本。
可以用遠端更新修正 ITMS-90717 嗎?
不行。圖示是編譯進二進位檔裡的 Assets.car。遠端更新只會改 JavaScript 和 App 的資源。修好圖示,重新 build,再重新上傳。
深色圖示可以是透明的嗎?
可以。Apple 要求深色變體使用透明背景,Expo 也會保留它的透明度。我由此推斷這項檢查針對的是主圖示,也就是 App Store 上的那張:必須不透明的是它。
iOS 圖示需要做圓角嗎?
不需要。提供實心正方形就好:iOS 會自己套用遮罩。圓角會在四個角落留下透明像素,正是這項檢查拒絕的東西。
Expo 支援 iOS 26 的 Icon Composer 圖示嗎?
支援,從 SDK 54 開始:在 ios.icon 裡用字串宣告 .icon 資料夾的路徑。prebuild 會原封不動複製,再由 Xcode 26 編譯。如果這個格式觸發 ITMS-90717,檢查透明圖層和 Blur 效果,或暫時改回 PNG。

