iOS 13 已正式發佈,網上對其用戶體驗上的新特性的描述也不少。對於開發來講,須要關注的另外一方面是新系統在 API 層面作了哪些改動,從而會對咱們現有的代碼產生什麼影響。算法
在這裏,咱們基於 iOS 13 Release Notes 作了一些整理,主要是列表出 Apple 提供的一些新的 API 和棄用了哪些 API,一塊兒來看看安全
• iOS 13 再也不支持 UIApplicationExitsOnSuspend
。須要更新應用以處理現代多任務處理。服務器
• 當單元格突出顯示或選中時,UITableViewCell 類再也不更改 contentView 及其任何子視圖的 backgroundColor
或 opaque
屬性。若是要在 contentView 內部(包括)內容的任何子視圖上設置不透明的 backgroundColor
,則單元格突出顯示或選中時的外觀可能會受到影響。解決子視圖任何問題的最簡單方法是確保將 backgroundColor
設置爲 nil 或 clearColor,而且設置它們的 opaque 屬性爲 false。可是,若是須要,您能夠重寫 setHighlighted:animated:
和 setSelected:animated:
方法,以便在移動到突出顯示的狀態和選定狀態時手動更改子視圖上的這些屬性。網絡
• 從iOS 8開始,將 UISearchController 與 UINavigationController 一塊兒使用須要將頂視圖控制器的 definesPresentationContext
屬性設置爲 true。若是不這樣作會致使難以檢測和調試的細微錯誤。從 iOS & iPadOS 13 beta 開始,若是視圖控制器的 navigationItem
具備 non-nil 搜索控件,當視圖控制器顯示在導航控制器中時,UINavigationController 會自動將該視圖控制器的 definesPresentationContext
屬性設置爲 true
。若是您要定位早期版本的 iOS,請在搜索控制器變爲活動狀態以前設置此屬性。app
• UIRefreshControl
類再也不直接修改其滾動視圖的 contentInset
。 相反,它對內容插入的調整將合併到滾動視圖的 adjustContentInset
中。 惟一的例外是當滾動視圖的 contentInsetAdjustmentBehavior
設置爲 UIScrollViewContentInsetAdjustmentNever
時,在這種狀況下,UIRefreshControl 實例將像之前的版本同樣直接修改 contentInset
。框架
• 若是經過覆蓋 sizeThatFits
在 UITableView 中實現自調整單元格而不使用自動佈局,則返回的高度將被解釋爲單元格的 contentView 所需的高度,UITableViewCell 會自動添加爲單元格留出空間所需的任何其餘高度 分隔器。若是以這種方式實現手動自調整大小,則在 UITableViewCell 上調用 sizeThatFits: 時,單元格的 contentView 寬度能夠保證準確,以便在手動佈局計算中使用。ide
• Trait環境(例如視圖和視圖控制器)如今在初始化期間使用 traits 填充 traitCollection
屬性。這些初始特徵表示特徵環境在添加到層次結構時將接收的最終特徵的預測。由於在初始化期間填充的特徵只是一個預測,它們可能與實際在層次結構中接收的特徵不一樣。所以,在可能的狀況下,您應該等待執行使用 traitCollection 的工做,直到視圖或視圖控制器的視圖移動到層次結構中 - 意味着窗口返回非零值 - 這樣您就沒必要丟棄任何工做,若是實際特徵不一樣,則使用預測的特徵完成。使用 traitCollection
的最佳時間是在佈局期間,例如 layoutSubviews,viewWillLayoutSubviews 或 viewDidLayoutSubviews 內部。佈局
• 只有當特徵值發生變化時,纔會調用 traitCollectionDidChange:
方法。重要的是,因爲特徵集合如今初始化爲目標層次結構中最終特徵的預測,當初始預測特徵與層次結構中的最終特徵匹配時,特徵環境添加到層次結構時將不會調用 traitCollectionDidChange:
。由於 traitCollectionDidChange: 旨在做爲無效回調來通知您一個或多個特徵已更改,請審覈此方法的現有實現,以及 UIContentContainer 方法willTransitionToTraitCollection:withTransitionCoordinator:
,用於您可能依賴它的地方觸發初始設置。懶惰地執行使用 traitCollection 的工做的最佳位置是在上面討論的 layoutSubviews 方法之一,但請記住,這些佈局方法在任什麼時候候佈局都會被調用,因此必定要避免在不須要時重複工做。優化
• 您如今能夠啓用調試日誌記錄,以便在您本身的類上調用 traitCollectionDidChange:
或willTransitionToTraitCollection:withTransitionCoordinator:
時。使用如下啓動參數打開日誌記錄:-UITraitCollectionChangeLoggingEnabled YES
。您可能但願在使用此啓動參數並從 Xcode 運行應用程序時暫時禁用主線程檢查程序,以免爲不相關的類添加額外的日誌消息。ui
• UITableViewCell 類的 contentView 屬性始終與前面和後面的相鄰附件進行邊對邊佈局。這簡化了佈局代碼,所以想要正確的默認偏移的開發人員再也不須要將其內容與內容視圖邊框或佈局邊距對齊,具體取決於尾部是否有附件。您如今應該始終在單元格內容視圖的佈局邊距上佈置代碼以獲取默認的系統插入。這些插入將根據單元格中可見的附件自動調整,以匹配系統的默認間距。
• 您如今能夠從建立 block 調用自定義初始化程序,該建立塊經過 instantiateInitialViewController(creator:)
或 instantiateViewController(identifier:creator:)
傳遞。這使您可使用其餘上下文和參數初始化視圖控制器,同時利用經過 Interface Builder 在故事板中定義它們。自定義控制器初始化程序必須調用其 super.init(coder:)
方法並傳遞它經過建立塊接收的編碼器參數。
• 爲了加強安全性,當服務器發送 Content-Type:application/octet-stream
時,NSURLSession 再也不嗅探 MIME
類型。
• NSURLRequestReloadRevalidatingCacheData
和 NSURLRequestReloadIgnoringLocalAndRemoteCacheData
API現已可用。
• 從 iOS 13 beta 4 開始,強制執行 NSMutableURLRequest
的 HTTPBodyStream
屬性的 copy 操做。若是在調用屬性設置器後對 body 數據進行了修改,則 HTTP 請求中發送的數據將不包含該更變。調用該屬性的 getter 再也不返回 NSMutableData 引用,即便使用該類型的數據調用 setter 也是如此。從 iOS 13 beta 5
開始,使用 iOS 12 SDK 或之前的 SDK 構建的應用程序使用舊版行爲。
• **CNCopyCurrentNetworkInfo
API 返回的信息已沒法反映真實狀況。**有關更多詳細信息,請參閱更新的API文檔和標題。
• 包含 body 的 GET HTTP
方法的全部 NSURLSessionTask 實例如今都會拋出錯誤 NSURLErrorDataLengthExceedsMaximum
。
• 刪除了對代理自動配置(PAC)的 FTP 和文件URL方案的支持。HTTP 和 HTTPS 是 PAC 惟一支持的 URL 方案。這會影響全部 PAC 配置,包括但不限於使用「設置」,「系統偏好設置」,「配置文件」和 NSURLSession API(如connectionProxyDictionary
和CFNetworkExecuteProxyAutoConfigurationURL
)設置的配置。
• NSURLSession 和 NSURLConnection API 再也不支持 SPDY
。服務器應使用 HTTP 2
或 HTTP 1.1
。
• 如今能夠在 AVAudioEngine
上啓用語音處理模式。
• 新的 AVAudioNode
類型可用於包裝用戶定義的 block,以實時發送或接收數據。
• 基於 AVAudioEngine
的應用程序可使用一種新方法來檢索附加到 AVAudioEngine
實例的全部節點的列表。
• AVAudioEnvironmentNode
中的新渲染模式基於輸出設備自動選擇最佳空間音頻渲染算法。
• 一個新的 AVAudioSession 屬性容許在會話主動使用音頻輸入時播放系統聲音和觸覺。
• 新的枚舉 AVAudioSessionPromptStyle
根據系統中的其餘音頻活動通知應用程序應該播放哪一種語音提示。
• AVAudioSessionRouteSharingPolicy
如今容許應用指定路由共享策略,以便其音頻和視頻路由到與 AirPlay 相同的位置。
• Audio Unit Extensions 如今支持全部宿主應用程序中可用的用戶預設。
• OpenAL框架已棄用,出於兼容性目的暫時保留。過渡到 AVAudioEngine
以得到 3D 音頻功能。
• AUGraph
已被棄用,轉而支持 AVAudioEngine
。
• 不推薦使用應用間音頻。使用 Audio Units 支持此功能。
• 不推薦使用基於 Carbon
的 Audio Units,在未來的版本中再也不支持。
• 再也不支持舊版 Core Audio HAL
音頻硬件插件。將音頻服務器插件用於支持音頻驅動程序。
• 音頻共享與 AirPods
(第1代或更高版本)和 PowerBeats Pro
兼容。須要 iPhone 8 或更高版本。
• AVFoundation 如今支持使用 HEVC
和 Alpha 通道編碼視頻。以這種方式編碼的視頻在 AVFoundation API 和網頁中的 Safari 中獲得普遍支持。格式的技術細節能夠在互操做性配置文件規範中找到。
• filterWithImageURL:options:
和 filterWithImageData:options:
再也不支持 RAW 5 及更早版本。 版本 6 及更高版本仍然受支持。
• 添加了用於實例化和修改內置 Core Image 過濾器的新 API。
• 加強了 CICoreMLModel 過濾器以支持具備 MLFeatureTypeMultiArray
類型的輸入或輸出的模型。
• Metal CIKernel
實例支持具備任意結構化數據的參數。
• Metal CIKernel
實例支持返回一組2×2像素。
• CIFormat 符號的整數值(例如 kCIFormatARGB8)已更改成跨平臺一致性的新值集合。之前的值仍然支持向後兼容; 可是,您應該避免對特定數值的依賴性。
• 如今能夠在「設置」>「郵件」中啓用「忽略已阻止的發件人」。被阻止的聯繫人列表與 Messages,FaceTime 和 Phone 共享。
從開發層面來說,iOS 13 最大的亮點無疑是引入了 SwiftUI,這也是 WWDC 2019 的一大亮點。實際上 Release Note 也是大篇幅在講 SwiftUI 的內容。因爲 SwiftUI 還處理優化階段,變數還不少,因此咱們在此暫不說明,詳情能夠查看 iOS 13 Release Note。
另外因爲 Apple 在未發佈 iOS 13 正式版時,就開始發佈 iOS 13.1 beta 版,因此有些內容可能已不適用。在 iOS 13.1 正式版出來後,咱們再細細來看。
更多好文,請關注公衆號
知識小集
(ID:zsxjtip
)