不知道是因為更新作業系統、還是因為更新 Xcode,專案竟然一直跑出以下兩個錯誤訊息:
- 'FirebaseCore/FirebaseCore.h' file not found
- Could not build module 'Firebase'
處理了幾天,終於搞定,原來是把專案設定裡的 Build Settings 裡的 VALID_ARCHS 設定成下列值即可:
$(ARCHS_STANDARD)
我的該欄位原本的值是 "arm64 armv7s armv7",改成上述後,會被自動帶入 "armv7 arm64"。但是!我手上的專案,若直接設定成 "armv7 arm64" 這組字串會編譯失敗,一定要設成 "$(ARCHS_STANDARD)" 才能成功編譯。
以下記錄過程中處理的方式。
【方法一:移除暫存檔並重新產生 Pods 相關檔案】
蘋果論壇上的 "Could not build Objective-C module 'Firebase'",建議可以這麼做:
- 關閉 Xcode 主程式。
- 刪除專案的暫存檔,路徑在:
~/Library/Developer/Xcode/DerivedData - 刪除專案檔 {ProjectName}.xcworkspace。
- 刪除 Podfile.lock 檔案,以及 Pods 資料夾。(位於專案目錄下)
- 在終端機 (terminal) 視窗執行以下指令:
pod install - 開啟新的專案檔 {ProjectName}.xcworkspace,再建置一次。
但是我做完以後一樣是 Build failed.
【方法二:更新 cocoapods】
找到另一篇文章 "Could not build module Firebase",提到升級 cocoapods 版本是唯一的解法。
在終端機 (terminal) 將目錄切到專案目錄下,執行以下指令,可以在最末行看到目前的 cocoapods 版本:
cat Podfile.lock
我在最末行看到目前版本是"COCOAPODS: 1.8.4"。目前已經有 1.10.0.rc.1。
或是可以用以下指令查詢 cocoapods 版本:
- gem which cocoapods
- pod --version
更新 cocoapods 需要管理者權限:
sudo gem install cocoapods
執行後我升級到 1.9.3。但升級後並沒有馬上好耶。所以我又照著前一個方法,把專案底下 Pods 相關檔案都移除掉,重新做 pod install,下載安裝了以下模組:
- Installing Firebase (6.33.0)
- Installing FirebaseAnalytics (6.8.3)
- Installing FirebaseCore (6.10.3)
- Installing FirebaseCoreDiagnostics (1.7.0)
- Installing FirebaseInstallations (1.7.0)
- Installing GoogleAppMeasurement (6.8.3)
- Installing GoogleDataTransport (7.4.0)
- Installing GoogleUtilities (6.7.2)
- Installing PromisesObjC (1.2.10)
- Installing nanopb (1.30906.0)
但還是出現一模一樣的錯誤訊息,沒有推進。Orz
【方法三:調整編譯設定 (Build Settings) 的 VALID_ARCHS】
因為看起來狀況是在 Xcode 11 可編譯、但在 Xcode 12 會出錯,所以查詢的方向改成查詢 Firebase 與 Xcode 12 的關係。
在 "SwiftUI Previews not working with Firebase" 這篇裡,提到可以在專案設定裡,設置以下內容:
- 在 Build Settings 把 "Architectures" 裡的 "Build Active Architecture Only" 設成 "No"
- 在 Build Settings 把 "User-Defined" 裡的 "VALID_ARCHS" 設定裡的 arm64 拿掉。
上述設定如果要用 UI 操作,可以先到專案檢視設定 (Show the Project navigator),打開專案的 *.xcodeproj,切換到 Build Settings 頁籤,找到對應的欄位執行設定。
我們原本設定了 VALID_ARCHS = "arm64 armv7s armv7",我把它全部拿掉。
這個設定之後我會出現新的錯誤訊息:
Uncategorized
PhaseScriptExecution failed with a nonzero exit code
我對著 PhaseScriptException 的錯誤訊息按了兩下後,看到長長的訊息裡有一段長成這樣:
ARCHS[@]: unbound variable
然後找到 "Xcode 12 beta 4 - error compiling for Simulator" 這篇,一開始有人提到要在 Build Settings 裡加入 "arm64"(為什麼有的人建議拿掉、有的人建議加回去啦!),後面有個叫 mvl-dxie 的人提到,要先把 VAILID_ARCHS 的值清掉,再把它整個幹掉。但我這麼做以後只消掉新的 PhaseScriptExecution 錯誤訊息,原本無法編譯 Firebase 模組的訊息又冒出來了。
最後我看到 "Xcode 12 beta 4 - error compiling for Simulator" 這篇的第二頁提到,可以在 VALID_ARCHS 設定 "$(ARCHS_STANDARD)" 這個值。我在在 Xcode 的專案檢視中,看到 Build Settings,捲到最後面找到 VALID_ARCHS,把 $(ARCHS_STANDARD) 填入。輸入後系統會自動轉換成 "armv7 arm64"。
我試過直接設定成 "armv7 arm64",一樣會編譯失敗。只有輸入 $(ARCHS_STANDARD) 才能過關。