最近剛好有人在問,他的 Flutter 項目在升級之后出現 Error starting debug session in Xcode: Timed out waiting for CONFIGURATION_BUILD_DIR to update
問題,也就是真機 Debug 時始終運行不了的問題:
其實這已經是一個老問題了,這個問題不只是 Flutter 會出現,在 React Native 平臺也會有,因為本質上 Xcode 15+ 的升級帶來的變動,最明顯標志就是,如果你直接在 Xcode 直接運行這個 Flutter 項目是可以正常運行的話,那么 99% 就是因為 Xcode 15+ 上 ios-deploy
的“廢棄”引起的問題。
ios-deploy
是一個通過對蘋果私有框架進行逆向,提供了無需打開 Xcode.app 就可以在物理 iOS 設備上安裝和調試應用的第三方框架,而對于 Flutter 而言,flutter run
命令的一鍵式啟動,在很大程度上依賴ios-deploy
,以及至關重要的一步:在設備上啟動debugserver
進程。
當然,雖然 ios-deploy
不能用了,但是蘋果提供了官方的替代方案:devicectl
命令行工具,不過雖然它能夠安裝應用(例如 devicectl device install app
),但它缺少了在設備上啟動 debugserver
并將附加到目標進程的支持,這對于 Flutter Debug 時的 JIT 和 hotload 非常重要。
詳細原因可見:《Flutter 又雙叒叕可以在 iOS 26 的真機上 hotload》 ,而針對
devicectl
可以從下方的 React Native CLI 變動中看到,針對真機按照,現在 React Native 也采用了devicectl
的方式:
所以,雖然有 devicectl
,但是 Flutter 的 JIT 離不開 debugserver
的權限支持,所以 Flutter 官方針對 Xcode 15 的場景進行了一些臨時處理,當開發者運行 flutter run
時,流程會是:
- 使用
xcodebuild
構建應用 - 啟動 Xcode.app
- 利用腳本讓 Xcode 在連接的設備上運行 App
- 等待 Xcode 建立調試會話,將 Flutter 工具的守護進程連接到 Dart VM 的 Observatory 端口
簡單說,就是需要安裝 Xcode 并且運行時會彈出 Xcode 窗口,還需要用戶在 macOS 的“系統設置 > 隱私與安全性 > 自動化”
中給予相應的權限 :
而問題主要也是出現在這里,很多開發者發現,Flutter run 并沒有拉起 Xcode ,或者拉起后依然出現超時等情況,這也是這個方案最大的問題:
目前看來,這還和用戶當前項目的環境有關系,正常來說這個流程是不會有問題的,但是結果來看并不是大家都“正常”,所以根據已有信息看,遇到這類問題一般的做法有:
- flutter clean 清除掉已有的可能存在問題的 build
- 手動啟動 Xcode 減少等到時間
- 通過 Xcode 直接運行判斷項目本身兼容存在問題,如果可以運行,說明是 Flutter 命令行問題
- 關閉 Wi-Fi,有時候即使 iPhone 通過 USB 數據線連接到 Mac,Xcode 也可能優先選擇通過 Wi-Fi 進行調試連接
- 執行
flutter run
命令運行 - 如果還不行,可以嘗試 Xcode 直接運行,然后執行
flutter attatch
嘗試連接 Dart VM Observatory 服務 - 再不行,只能模擬器開發,然后 release 運行真機測試
而針對這個問題,其實蘋果也發現了,所以 Xcode 16 增加了 devicectl 和 Xcode 的命令行調試器 lldb
協同工作的支持,雖然 devicectl
單獨無法啟動 debugserver
,但它可以和 Xcode 的命令行調試器 lldb
協同工作:
所以針對這個問題,Flutter 計劃也是有在 Xcode 16 做新的調整的計劃,通過新的 devicectl
+ lldb
集成到 flutter run
命令來回歸已有的流程,但是因為涉及變動很多,暫時看起來還沒什么進展:
主要是 Xcode automation in CI 也不是完全不能用····
最后總結下,這個問題的核心就是,你用 Xcode 能不能運行,如果可以,就可以嘗試使用 flutter attatch
,或者 flutter run
之前先打開 Xcode ,并且確保 Xcode 開啟了自動簽名之類的必備條件,最好關閉手機 Wi-Fi 來排除問題。
最極端的情況下,可能會需要你
flutter clean
和rm -r ~/Library/Developer/Xcode/iOS\ DeviceSupport
清除設備當前授權。
參考鏈接
https://github.com/flutter/flutter/issues/172095
https://github.com/flutter/flutter/issues/133465
https://github.com/flutter/flutter/issues/144218
https://github.com/flutter/flutter/issues/42969#issuecomment-3057078316