在Xcode11上開發「面向低於iOS13版本的App」時的一些注意點,提示'UIScene' is only available in iOS 13.0...

好比公司如今新開一個項目,使用此App的最低版本要求是iOS12。swift

(也就是說這個App上架後,只有iPhone的iOS版本是12以上的用戶才能在App Store裏面看到並下載)bash

這個時候若是咱們使用的是最新版Xcode11而且只按默認配置開發的話,會出現如下錯誤:app

'ConnectionOptions' is only available in iOS 13.0 or newer
'UIScene' is only available in iOS 13.0 or newer
'UISceneConfiguration' is only available in iOS 13.0 or newer
'UISceneSession' is only available in iOS 13.0 or newer 
'UIWindowScene' is only available in iOS 13.0 or newer
 ...
複製代碼

須要作一些小小的改動:

1.新建項目時,在User Interface這裏選擇Storyboard

說明:spa

Xcode11默認使用SwiftUI來作App的界面,但SwiftUI這個功能的最低要求版本是iOS13。3d

目前SwiftUI還有不少地方不太完善,我的建議若是是商業項目的話,仍是選擇Storyboard。由於他目前仍舊是蘋果性價比比較高的一種快速開發界面的方法(較成熟+上手快)。code

2.項目target這裏的Deployment Target選擇App要求的最低版本,好比上文提到的iOS12

說明:

這個相信你們應該輕車熟路了:App要求的最低版本是多少,這裏就選多少,再也不贅述。cdn

本覺得這樣就差很少了吧。

Surprise!編譯以後錯誤依舊視頻

罪魁禍首其實就是這兩個文件:AppDelegate.swiftSceneDelegate.swift

關於iOS13有改動或新登場的這兩個文件,在個人每一個教程的SwiftUI部分都有講到,歡迎你們來捧捧場: m.cctalk.com/inst/s9vfhe…blog

好,繼續。教程

3.從左邊的錯誤點進去或者直接點目錄進入AppDelegate.swift文件,拉到最後的兩個方法那裏:

第一個方法--隨便點擊其中一個錯誤的紅圈白點

選擇Add @available attribute to enclosing instance method,點Fix

第二個方法同理。

說明:

--從錯誤的字面意義上就能夠得知,無非就是一些類型只能在iOS13上使用,咱們如今要在低版本的iOS上使用,他天然不幹。

--Add @available attribute to enclosing instance method的意思是:在class的某個方法前面加上@available(iOS 13.0, *),代表只有版本大於等於iOS13的時候才加載這個方法。

--由於AppDelegate.swift裏的didFinishLaunchingWithOptions方法是不管什麼版本的iOS都須要用的,因此咱們在Fix的時候不能選擇Add @available attribute to enclosing class(在整個class前面加上@available(iOS 13.0, *)

4.從左邊的錯誤點進去或者直接點目錄進入SceneDelegate.swift文件,選擇任意一個紅圈白點,點擊Add @available attribute to enclosing class的Fix

說明:

SceneDelegate.swift文件是iOS13新登場的,因此給整個class加上@available(iOS 13.0, *)是OK的:

選擇低於iOS13版本的模擬器或者真機運行以後,仍是不行:

黑屏

而且控制檯會出現:

The app delegate must implement the window property if it wants to use a main storyboard file

緣由:

在iOS13中,AppDelegate把iOS13以前的那些管理整個App生命週期等的任務都委託給了SceneDelegate,因此原來AppDelegatewindow屬性天然也就跑到SceneDelegate裏面去了:

而這個SceneDelegateclass又被咱們標註了只能iOS13能夠用,也就是說iOS13如下版本的iPhone是不會執行整個SceneDelegateclass的代碼的,因此在低版本中系統就找不到window屬性。

解決方案:

AppDelegate的class裏面聲明window屬性:

其實很容易理解,窗口沒了,咱們天然看不到外面的風景了,取而代之的就是黑屏

這樣以後:

iOS13如下版本的時候,window就走AppDelegate這裏,不會黑屏;

iOS13或以上版本的時候,window就走SceneDelegate(被委託人)這裏,不會黑屏;

 

廣告時間:

你們若是正好想學iOS開發的話,能夠來看看小弟的iOS視頻教程(永久更新+售後輔導): m.cctalk.com/inst/s9vfhe…

相關文章
相關標籤/搜索