🐺iOS 開發補完計畫:Swift Macros 信任警告與警報疲勞

Swift Macros 方便但有安全風險,所以開發者需要進行確認。然而,這個確認步驟的設計容易讓人直接跳過,所以最後似乎沒有比較安全,只是增加了麻煩而已。本文教你怎麼信任或跳過,但更重要的是學會掌控風險。

每每去教初學者 iOS 開發,我就會發現自己的專家盲點。

最近一次是這樣:我用了 SwiftUI-TCA-Template 作為示範專案的模版。這個專案有依賴 TCA 等套件,會使用到 Swift Macros 這個功能。而因為 Macros 有機會在電腦執行一些開發者可能沒有意識到的程式操作,有一定程度的安全風險,預設會被當成錯誤擋下來,需要手動確認

由於習慣了,每次遇到這種情況,我都會快速把確認步驟操作完,或是早就設定好一律跳過 Macros 確認。但對於初學者來說,可能會一頭霧水。

以下說明如何在 Xcode 進行同意 Swift Macros 的步驟。

Swift Macros 確認警告

第一次編譯或更新套件時,在 Xcode 的 Issue Navigator 會看到需要確認的警告,例如:

使用 Swift Macros 的套件有更新,所以 Xcode 以錯誤提示阻止專案編譯,需要開發者手動確認
使用 Swift Macros 的套件有更新,所以 Xcode 以錯誤提示阻止專案編譯,需要開發者手動確認

按下去錯誤項目以後,會看到提示:

確認要信任與啟用 Macros 的對話框
確認要信任與啟用 Macros 的對話框

請確認該 Macros 是你信任的(比如來自你信任的開發者),然後按下「Trust & Enable」。

這樣子就把「錯誤」給解決了,之後應該可以正常編譯。

如何自動跳過

這種認證雖然有其必要,但是多次重複遇到以後,會覺得十分煩人。因為如果每次套件有升版就需要再確認一次、不同電腦也要個別再確認一次。

有經驗的開發者,會知道在 Mac 上用一行指令一勞永逸關掉它的方式:

defaults write com.apple.dt.Xcode IDESkipMacroFingerprintValidation -bool YES

CI 設定

比較嚴謹的團隊,在協作開發時會用到 CI 來跑測試。而上述指令,在自行架設的 Mac CI Server 上也很常用。不然有用到 Swift Macros 的專案就會無法編譯。

另一種方式則是在使用 xcodebuild 指令時,加上 -skipMacroValidation 參數。該參數的官方說明:

Skip validation of macros (this can be a security risk if they are not from trusted sources)

最後,如果你使用 Xcode Cloud,那麼跳過 Swift Macros 驗證的方式比較特別。要在專案目錄新增一個 ci_scripts 資料夾,裡面放入一個 script 檔 ci_post_clone.sh,檔案內容就是那一行:

defaults write com.apple.dt.Xcode IDESkipMacroFingerprintValidation -bool YES

結語

我覺得 Swift Macros 這種安全確認的機制還有改進空間。因為開發者到後來會傾向無腦地按下信任,甚至直接用指令的方式總是跳過,就等於沒有確認的保護效果。也就是警報疲勞(類似於「狼來了效應」)導致了安全性的下降。

以我自己來說,每台新 Mac 在安裝設定時,就會把這行指令給輸入、一律跳過。以至於在準備課程教材時,就忘了學生第一次會遇到需要確認的障礙。

開發者還是有責任去了解自己所使用的套件、Swift Macros 的來源,學會掌控風險。

不過我希望 Apple 能把「這個新版本 Macros 已經被確認過」的事實記錄下來,甚至加入版本控制。換言之,以專案為單位來信任,而不是以個別電腦為單位來信任。應該能減少開發團隊的麻煩,而且能提升確認的實質保護效果。