在 iLab 門市,「App 已損毀,無法打開」這個錯誤訊息我們一週至少遇到三、四次。客人拿著 MacBook 進來,臉上都是一副「難道我的電腦中毒了?」的表情。先說清楚:幾乎所有情況都不是 App 真的損毀,也不是病毒。是 macOS 的安全機制在保護你,只是保護得有點過頭。
macOS 有個機制叫做 Gatekeeper,每次你從網路下載應用程式,系統會在這個檔案身上貼一個「隔離標籤」(com.apple.quarantine)。打開的時候,Gatekeeper 會驗證這個 App 的開發者簽章和公証(notarization)。
如果 App:
Gatekeeper 就會直接擋掉,跳出「App 已損毀,無法打開」。注意,它說的是「損毀」,但實際上 App 完全沒問題,只是 Apple 的說法比較強烈。
這個行為在 macOS Ventura(13)之後收得更緊,到了 Sonoma(14)和 Sequoia(15)更是幾乎對所有非 App Store 的下載都做了更嚴格的審查。如果你最近才升級 macOS,然後突然一堆舊 App 打不開,就是這個原因。
在動手之前,你要自己先判斷一下:這個 App 是你知道來源的嗎?
如果是你特地去官方網站下載的正版軟體(例如 Adobe、Microsoft、Parallels、各種開發工具),那就可以放心往下做。但如果你根本不確定這個 App 是哪裡來的,或是朋友用 USB 傳給你的,那就要先停下來想一下,不要因為看到教學就無腦跟著做。
確定來源沒問題之後,我們繼續。
很多情況用這個方法就解決了,不用動到終端機。
在 Finder 裡找到這個 App(通常在「應用程式」資料夾),對著它按右鍵(或 Control + 點一下),選「開啟」。這時候系統會跳出另一個對話框,多了一個「開啟」的按鈕,按下去就能強制執行。
這個方法只對第一次有效——系統會記住你的選擇,之後就可以直接雙擊開啟了。適用 macOS Ventura(13)以前的版本效果最好;Sonoma 和 Sequoia 的某些情況下,這個右鍵選單的「開啟」按鈕可能不會出現,那就要用下面的終端機方法。
這是最穩定的方法,macOS Monterey(12)到 Sequoia(15)全部適用。
打開「終端機」——用 Spotlight(Command + 空白鍵)搜尋「終端機」就能找到,或是去「應用程式」→「工具程式」→「終端機」。
輸入這行:
sudo xattr -rd com.apple.quarantine /Applications/App名稱.app
把「App名稱.app」換成你實際的應用程式名稱。最快的方式是:把這行打到 quarantine 後面(有一個空格),然後直接把 App 從 Finder 拖進終端機視窗,路徑會自動填入,不用自己打。
按下 Return,系統會要求你輸入 Mac 的登入密碼。注意輸入密碼時螢幕上不會顯示任何字元,這是正常的,打完按 Return 就好。
沒有出現錯誤訊息就是成功了。回去雙擊 App,正常開啟。
xattr 是什麼?是 macOS 管理「延伸屬性」(extended attributes)的指令。-rd 是遞迴刪除的意思,com.apple.quarantine 就是那個隔離標籤。這個指令只是把貼在 App 身上的標籤撕掉,App 本身的檔案完全不會被修改。
有些工具軟體(特別是開發用的工具、字型檔、外掛程式)不一定裝在 /Applications,可能在你的下載資料夾,或是某個自定義位置。
這種情況,終端機指令改成:
sudo xattr -rd com.apple.quarantine ~/Downloads/App名稱.app
或是直接把檔案拖進來,讓終端機幫你補路徑,最省事。
如果是解壓縮出來的整個資料夾(不是單一 .app 檔),一樣用拖進來的方式,xattr -rd 的 -r 就是遞迴處理資料夾內所有檔案的意思。
macOS Ventura 之後,系統設定的介面有個地方可以手動允許特定 App。
打開「系統設定」→「隱私權與安全性」,往下捲,找到「安全性」的區塊。如果你剛剛試著打開 App 被擋下,這裡通常會出現一行「已封鎖使用『XXX』,因為它不是來自已識別的開發者」,旁邊有個「仍要開啟」按鈕。按下去,再輸入密碼,這個 App 就被放行了。
這個方法只會在你嘗試開啟之後的一小段時間內出現(大約一小時內),超過就消失。所以如果你打不開 App,馬上去系統設定看,動作要快一點。
不要為了解決這個問題,把「允許從以下位置下載 App」改成「任何來源」(Apple Silicon 機器甚至預設沒有這個選項),這樣做等於把 Gatekeeper 整個關掉,安全性就全沒了。用上面兩個方法針對單一 App 處理就好。
用 M1、M2、M3、M4 的 Mac,對 App 的安全驗證比 Intel 時代更嚴格。特別是 macOS Sequoia(15)之後,即使你用終端機移除了 quarantine 屬性,有些 App 還是會被擋,理由可能是「App 無法驗證,因為 Apple 無法檢查其是否包含惡意軟體」。
這種情況不要急著去找以前網路上流傳的 sudo spctl --master-disable(讓系統允許「任何來源」)那一招。從 macOS Sequoia(15)起,Apple 已經把這個全域關閉 Gatekeeper 的做法拿掉了,這行指令在新系統上多半不會再出現「任何來源」選項,跑了也沒用。
正確又安全的做法是針對「這一個 App」放行:
這個流程只針對單一 App 開一個小缺口,Gatekeeper 對其他 App 的保護完全不變,比關掉整個機制安全得多。如果連這個按鈕都等不到,就回頭用前面那行 sudo xattr -rd com.apple.quarantine,那才是最可靠的方法。
這個比較少見,但有時候會發生在 App 裝在外接硬碟或是 NTFS 格式的磁碟上。外接磁碟每次掛載,系統對它上面的檔案屬性的處理方式可能不一樣,導致 quarantine 標籤似乎「消失又回來」。
解法是把 App 移到 Mac 本機的「應用程式」資料夾,再執行一次 xattr -rd,問題就解了。
另一種情況是 App 本身每次啟動都會做自我更新,更新完的執行檔又被系統重新打上隔離標籤。碰到這種情況,通常只要把 App 的自動更新機制暫時關掉,或是直接從 App Store 裝(如果有上架的話)就能根治。
說了這麼多「不是真的損毀」,那什麼時候才是真的壞掉?
真正損毀的 App 通常有這些特徵:移除 quarantine 屬性之後還是打不開、App 打開到一半直接閃退、下載的壓縮檔解壓縮失敗或解壓後大小明顯跟官網說的不一樣。
這種情況就是下載不完整,或是來源的檔案本身有問題。解法很簡單:重新下載一次,從官方網站直接抓。如果問題一樣,可能是你的網路在下載過程中掉包,換個網路環境再試一次。
如果你下載的是破解版或 cracked app,出現損毀錯誤有更高的機率是真的被動了手腳。這種情況建議直接刪掉,不要嘗試強制開啟。
Q:執行 sudo xattr 指令沒有任何回應,是失敗了嗎? 沒有任何輸出訊息、直接回到命令提示字元($),代表成功了。如果有問題,終端機會顯示紅色的錯誤訊息。
Q:我的 Mac 是 M 系列,但「隱私權與安全性」裡面找不到「仍要開啟」的選項?
部分 macOS Sequoia(15)的版本,這個按鈕出現的時機比較短,或是某些 App 根本不會觸發它。這種情況直接用終端機的 sudo xattr -rd com.apple.quarantine 方法,比較可靠。
Q:我試了右鍵開啟,選單裡根本沒有「開啟」這個選項? 如果這個 App 是從網路下載但不在應用程式資料夾,右鍵選單有時候不會出現開啟選項。把 App 先移到「應用程式」資料夾,再試一次右鍵開啟,通常就有了。
Q:用 sudo 指令需要是管理員帳號嗎? 是的,sudo 需要管理員權限。如果你的 Mac 是多人共用,而你的帳號不是管理員,就沒辦法執行 sudo 開頭的指令。這種情況請管理員帳號登入後操作,或是聯絡 iLab 門市請我們協助。
Q:做完這些之後,這個 App 以後還會被擋嗎? 不會。系統把 quarantine 標籤移除之後就記住了,同一個 App 之後都可以正常開啟。除非這個 App 做了大版本更新,重新下載安裝了一個新的 .app 檔,那新的檔案又會有新的隔離標籤,要再做一次。
如果你試了以上所有方法還是打不開,歡迎帶 MacBook 來 iLab 門市,我們現場幫你看,通常十分鐘內解決。