收錄文章::::::::::::::: iOS 13 適配要點總結
在Xcode 11 創建的工程,運行設備選擇 iOS 13.0 以下的設備,運行應用時會出現黑屏現象。
原因:
Xcode 11 默認是會創建通過 UIScene 管理多個 UIWindow 的應用,工程中除了 AppDelegate 外會多一個 SceneDelegate
AppDelegate和SceneDelegate這是iPadOS帶來的新的多窗口支持的結果,並且有效地將應用程序委托的工作分成兩部分。
也就是說在我們用多窗口開發iPadOS中,從iOS 13開始,您的應用代表應該:
設置應用程序期間所需的任何數據。
響應任何專注於應用的事件,例如與您共享的文件。
注冊外部服務,例如推送通知。
配置您的初始場景。
相比之下,在iOS 13中的新頂級對象是一個UIWindowScene,場景代表可以處理應用程序用戶界面的一個實例。因此,如果用戶創建了兩個顯示您的應用程序的窗口,則您有兩個場景,均由同一個應用程序委托支持。
這些場景旨在彼此獨立工作。因此,您的應用程序不再移動到后台,而是單個場景執行 - 用戶可以將一個移動到后台,同時保持另一個打開。
我們可以看下info.plist文件和工程項目文件的變化如圖:
- Appdelegate新增windows屬性
適配方案一
如果我們不開發iPadOS多窗口APP,SceneDelegate窗口管理我們可以不需要直接刪掉就好了。
- 刪除掉info.plist中Application Scene Manifest選項,同時,文件SceneDelegate可刪除可不刪
- 相關代碼注釋掉
- Appdelegate新增windows屬性
適配方案二
即要用iOS 13中新的SceneDelegate,又可以在iOS 13一下的設備中完美運行。那就添加版本判斷.
- SceneDelegate中添加@available(iOS 13, *)
- AppDelegate中同樣聲明window屬性
- AppDelegate中兩個關於Scene的類也添加版本控制,oc/Swift中可以用擴展單獨拎出來
- 切記:這種方式,AppDelegate中的有關程序的一下狀態的方法,iOS 13設備是不會走的,iOS13一下的是會收到事件回調的。13以上的設備會走SceneDelegate對應的方法
- AppDelegate中同樣聲明window屬性