iOS 開發者必學:如何調教 Xcode 除錯點擊「推播通知」導致的 App 閃退?
做 iOS 開發的人一定遇過這種頭痛的情況:App 在開啟狀態下測試推播都沒事,但只要把 App 徹底關掉(Kill process),點擊通知列進去就直接 Crash。最煩的是,Xcode 預設只要你關掉 App,Debug Session 就斷了,根本抓不到那瞬間發生了什麼。
iOS 開發者必學:如何調教 Xcode 除錯點擊「推播通知」導致的 App 閃退?
這是我當年被推播閃退搞得焦頭爛額後學到的秘訣。核心原因通常是因為 App 從「未啟動」狀態被推播喚醒時,生命週期與一般啟動不同,某些 ViewController 可能還沒初始化完成就被呼叫了。
如何在 App 啟動前就讓 Debugger 就位?
如果你直接按下 Xcode 的 Run,App 會立刻啟動,這就沒辦法模擬「被推播點開」的瞬間。我們需要讓 Xcode 進入「待命狀態」:
- 在 Xcode 頂部選單選擇 Product > Scheme > Edit Scheme...
- 選擇左側的 Run 項目,切換到 Info 頁籤。
- 在 Launch 選項中,從預設的 "Automatically" 改選為 "Wait for executable to be launched"。
- 關閉視窗,再次按下 Run (Cmd + R)。
這時候你會發現 Xcode 的 Status Bar 顯示 "Waiting for [Your App Name] to launch...",App 也不會真的跑起來。這就是我們等待的時機!
實戰操作流程
- 確保你的手機或模擬器已經處於待命狀態(App 已關閉)。
- 發送一則測試推播給這台裝置。
- 當手機彈出通知列時,點擊它。
- 神奇的事發生了:App 會啟動,而 Xcode 會立即接管這個 Session。如果這時候發生 Crash,Debugger 會精準地停在那行報錯的程式碼上!
雖然這個模式下有時候看不到 console 的即時 Log(視 Xcode 版本而定),但能讓中斷點(Breakpoint)生效就已經足夠解決 90% 的推播問題了。
常見問答 (FAQ)
為什麼這個方法抓不到 Log?
答:在某些舊版 Xcode 中,手動啟動的 Process 可能不會正確掛載 stdout。如果一定要看 Log,建議使用 OSLog 配合系統的 Console.app 進行監控。
模擬器也能測試推播嗎?
答:從 Xcode 11.4 開始,你可以直接把一個 .apns 檔案拖進模擬器來模擬推播,配合這個「待命模式」除錯非常方便。
加入對話