截至 2026 年 9 月 14 日,只要你準備使用 iOS 27 SDK 建置 UIKit App,就應立即完成 iOS 27 UIScene 遷移;繼續用舊 SDK 只能作為短期回退,不能代替遷移。正式切換前,保留已驗證的舊工具鏈,並在獨立 Mac 環境驗收冷啟動、深度連結、前後台切換與 Archive。這個 SDK 觸發邊界可參考 Apple Developer Forums 的官方人員說明 與 TN3187 遷移文件。
這篇適合仍由 AppDelegate 建立 UIWindow、尚未設定 Scene Manifest 的存量 UIKit App 維護者。無論你使用 Storyboard、純程式碼介面或混合架構,都可以按下列分支定位修改範圍;只有一台生產打包機的小型團隊,也能先用隔離的遠端 Mac 驗證 Xcode 27。
01 先判斷是否已進入遷移範圍
不要先新增 SceneDelegate 檔案。先檢查最終 Archive使用的 SDK,以及 Archive 內 App 的 Info.plist。裝置是否已升級至 iOS 27,不是唯一判斷條件;真正影響啟動行為的是建置時採用的 SDK。Apple 已說明,使用 27.0 SDK 建置的 UIKit App 會受 UIScene 生命周期要求影響,而舊 SDK 建置暫時不執行同一要求,詳見Apple 的 UIKit 生命周期遷移文件。
先在脫敏副本執行以下檢查:
- 解開
.xcarchive,確認Info.plist是否包含UIApplicationSceneManifest。 - 檢查 Manifest 是否有有效的 scene configuration。
- 查看 AppDelegate 是否仍只實作
application(_:didFinishLaunchingWithOptions:),並在其中建立唯一 UIWindow。 - 搜尋
AppDelegate.window、全域keyWindow、UIApplication.shared.windows等舊式視窗取用方式。 - 保存一次舊工具鏈的啟動日誌與 Archive 結果,作為回退基準。
你的決策邊界如下:
- 若最終 Archive 已使用 iOS 27 SDK,且 App 尚無有效 Scene Manifest:立即遷移,再進行 Xcode 27 的完整驗收。
- 若目前仍需維持生產交付,而遷移尚未完成:暫時使用已驗證的舊 SDK/舊 Xcode,但把它標示為回退路徑,不要切換成新的預設工具鏈。
- 若已配置 UIScene,但啟動仍失敗:先檢查 configuration、SceneDelegate 的 window 綁定和啟動回呼,不要只重新安裝 App。
Apple 的 場景設定文件 說明了 Manifest 與 configuration 的關係。它不是單純的編譯設定;錯誤配置可能在安裝後才表現為黑屏、空白畫面或啟動流程未完成。
02 Storyboard 架構:把入口交給場景
Storyboard 專案最常見的錯誤,是 Manifest 已加入,但主 Storyboard 仍沒有正確掛到 scene configuration。另一種錯誤是 AppDelegate 與 SceneDelegate 同時建立根視窗,導致系統建立一個視窗,而程式又手動建立另一個視窗。
你需要先釐清兩層責任:
- AppDelegate:處理程序層級初始化,例如共用服務、資料庫、分析工具與非畫面相關設定。
- SceneDelegate:處理特定場景的連線、視窗、根控制器、場景進入背景與重新啟用。
- Storyboard:由場景設定指定初始介面,不應再由 AppDelegate 以舊流程重複建立同一個入口。
完成修改後,不要只看 Build 成功。至少執行一次冷啟動、切到背景再返回,以及系統終止 App 後重新啟動。若畫面空白,檢查 storyboard 名稱、configuration 名稱和 scene role 是否一致,再看 SceneDelegate 是否意外覆寫了 Storyboard 建立的 root view controller。
03 純程式碼 UIKit:重建 UIWindow 連線鏈
純程式碼專案的核心是 scene(_:willConnectTo:options:)。在這個入口中,你要從傳入的 UIScene 取得 UIWindowScene,建立 UIWindow,將它綁定到該場景,設定 root view controller,最後讓視窗顯示。Apple 的 UIScene API 文件 可用來核對場景生命周期與連線狀態。
典型遷移檢查順序:
- 確認 SceneDelegate 已接收
UISceneDelegate。 - 將
scene轉型為UIWindowScene,轉型失敗時不要強行建立全域視窗。 - 建立
UIWindow(windowScene: windowScene),不要使用沒有場景上下文的舊初始化方式。 - 建立或取得 root view controller,完成依賴注入。
- 將 window 指派給 SceneDelegate 的屬性並呼叫顯示。
- 移除 AppDelegate 內會再次建立主視窗的舊程式碼。
- 搜尋全專案仍依賴
AppDelegate.window或全域 keyWindow 的畫面跳轉邏輯。
這裡的風險不是「少一個檔案」而是錯誤地把單一程序視為單一畫面。重新啟用、場景重建或 iPad 多視窗時,舊的全域引用可能指向已失效的 window。你應以首次啟動、重新啟用和視窗重建結果作為通過證據,而不是以編譯成功代替執行驗收。
04 啟動回呼與深度連結
深度連結和推送事件的入口
程序啟動與場景連線不是同一件事。URL Scheme、Universal Link、通知回應和使用者活動,應按事件是否伴隨新的場景連線來處理。可從 connectionOptions 讀取初始 URL、通知回應或 user activity;已經存在的場景,則要處理 SceneDelegate 後續收到的開啟事件。可參考 Apple 的 ConnectionOptions 文件。
你應逐項盤點:
- 第三方登入 SDK 是否假設所有回呼都在 AppDelegate。
- 推送通知點擊後,是冷啟動、背景喚醒,還是已啟用場景。
- Universal Link 是否在場景已存在時仍能交給正確的導覽控制器。
- 登入完成後的回跳 URL 是否會被重複消費。
- 分析工具是否因 AppDelegate 與 SceneDelegate 各初始化一次而產生重複事件。
測試時使用已脫敏的 URL、通知內容與帳號資料。至少覆蓋三條路徑:App 完全關閉後開啟、App 在背景時開啟,以及 App 已在前景時開啟。只點桌面圖示,無法證明深度連結遷移正確。
提醒:不要在未確認事件生命週期前直接刪除 AppDelegate 舊回呼。先保留差異、記錄觸發入口,再逐一移交;否則你可能把登入、推送或 Universal Link 的問題誤判成 UIScene 啟動失敗。
05 iPad、Mac Catalyst 與多視窗
採用 UIScene 不代表你必須立即開放多視窗,但代表介面狀態不能再預設只有一個全域畫面。文件型 App、Stage Manager、Mac Catalyst 與外接顯示情境,都可能讓同一程序同時管理不同場景。
按維護責任拆分:
- 將不可變的服務設定放在程序層級。
- 將選取中的文件、導覽堆疊和畫面狀態放在場景或場景模型。
- 場景進入背景時釋放可重建資源,不要假設下一次仍會回到同一 window。
- 若專案有外接顯示角色,先對照最新 UIScene 文件 核對角色與連線流程,不要因一次啟動錯誤就全面重寫架構。
- Mac Catalyst 專案要另外驗證視窗重建與恢復,不要只以 iPhone 模擬器結果代替。
06 Xcode 27 雙軌驗收清單
Xcode 27 RC 已於 2026 年 9 月 9 日開放,相關發佈資訊可從 Apple Xcode 發佈記錄 與 Xcode 27 Release Notes 核對。正式版及 App Store 提交要求若有更新,應重新檢查,不要自行推測尚未公布的截止日期。
按以下順序執行:
- 複製脫敏專案,固定 Bundle ID、Team ID、URL Scheme、推送載荷與測試帳號。
- 在舊工具鏈建立基準:保存 Build、Test、Archive、安裝與真實啟動結果。
- 在隔離的 Xcode 27 Mac 環境重建專案,確認最終 Info.plist 已產生有效 Scene Manifest。
- 執行冷啟動、背景返回、場景重建、深度連結與推送啟動測試。
- 執行 Test、Archive、安裝及實機啟動;保存
.xcarchive、安裝結果與失敗日誌。 - 模擬遠端連線中斷、Mac 重啟和無人值守建置,確認常駐打包流程可恢復。
- 設定回退條件:例如啟動失敗、深度連結遺失、Archive 不可安裝或無法重現的簽名錯誤時,立即回到舊工具鏈。
- 只有新環境連續通過上述驗收後,才切換生產打包機的預設 Xcode。
如果你只有一台生產 Mac,不要直接在上面刪除舊 Xcode 或修改預設選擇。你可以先閱讀 CALMVPS 的遠端 Mac 方案,將遷移副本放到隔離環境;若需要估算不同使用週期,也可查看方案與價格頁。這樣做的重點不是把問題「搬到雲端」,而是讓舊版交付路徑仍可回退。
舊式 AppDelegate 架構的真正成本,是它把 window、登入回跳、推送和全域狀態綁在同一個程序假設上。直接切換 Xcode 27 會增加生產打包機中斷、回退困難與問題難以重現的風險;只用舊 Xcode 則無法完成新 SDK 下的長期驗證。若你不想讓唯一的生產 Mac 成為第一個試驗場,先租用 CALMVPS 的遠端 Mac,複製脫敏專案完成 UIScene 遷移、真實啟動與 Archive 驗收,再安排正式環境切換會更穩妥。最後更新於 2026 年 9 月 14 日;資料核實自 Apple UIKit 遷移文件、TN3187、Xcode 27 Release Notes、Apple Developer Forums 與 App Store Connect 相關發佈資料。