1. 程式人生 > >iOS 13 正式釋出,來看看有哪些 API 變動

iOS 13 正式釋出,來看看有哪些 API 變動

iOS 13 已正式釋出,網上對其使用者體驗上的新特性的描述也很多。對於開發來說,需要關注的另一方面是新系統在 API 層面做了哪些改動,從而會對我們現有的程式碼產生什麼影響。

在這裡,我們基於 iOS 13 Release Notes 做了一些整理,主要是列表出 Apple 提供的一些新的 API 和棄用了哪些 API,一起來看看

General
• iOS 13 不再支援 UIApplicationExitsOnSuspend。需要更新應用以處理現代多工處理。

UIKit
• 當單元格突出顯示或選中時,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,請在搜尋控制器變為活動狀態之前設定此屬性。

• UIRefreshControl 類不再直接修改其滾動檢視的 contentInset。 相反,它對內容插入的調整將合併到滾動檢視的 adjustContentInset 中。 唯一的例外是當滾動檢視的 contentInsetAdjustmentBehavior 設定為 UIScrollViewContentInsetAdjustmentNever 時,在這種情況下,UIRefreshControl 例項將像以前的版本一樣直接修改 contentInset。

• 如果通過覆蓋 sizeThatFits 在 UITableView 中實現自調整單元格而不使用自動佈局,則返回的高度將被解釋為單元格的 contentView 所需的高度,UITableViewCell 會自動新增為單元格留出空間所需的任何其他高度 分隔器。如果以這種方式實現手動自調整大小,則在 UITableViewCell 上呼叫 sizeThatFits: 時,單元格的 contentView 寬度可以保證準確,以便在手動佈局計算中使用。

• Trait環境(例如檢視和檢視控制器)現在在初始化期間使用 traits 填充 traitCollection 屬性。這些初始特徵表示特徵環境在新增到層次結構時將接收的最終特徵的預測。因為在初始化期間填充的特徵只是一個預測,它們可能與實際在層次結構中接收的特徵不同。因此,在可能的情況下,您應該等待執行使用 traitCollection 的工作,直到檢視或檢視控制器的檢視移動到層次結構中 - 意味著視窗返回非零值 - 這樣您就不必丟棄任何工作,如果實際特徵不同,則使用預測的特徵完成。使用 traitCollection 的最佳時間是在佈局期間,例如 layoutSubviews,viewWillLayoutSubviews 或 viewDidLayoutSubviews 內部。

• 只有當特徵值發生變化時,才會呼叫 traitCollectionDidChange: 方法。重要的是,由於特徵集合現在初始化為目標層次結構中最終特徵的預測,當初始預測特徵與層次結構中的最終特徵匹配時,特徵環境新增到層次結構時將不會呼叫 traitCollectionDidChange:。因為 traitCollectionDidChange: 旨在作為無效回撥來通知您一個或多個特徵已更改,請稽核此方法的現有實現,以及 UIContentContainer 方法willTransitionToTraitCollection:withTransitionCoordinator:,用於您可能依賴它的地方觸發初始設定。懶惰地執行使用 traitCollection 的工作的最佳位置是在上面討論的 layoutSubviews 方法之一,但請記住,這些佈局方法在任何時候佈局都會被呼叫,所以一定要避免在不需要時重複工作。

• 您現在可以啟用除錯日誌記錄,以便在您自己的類上呼叫 traitCollectionDidChange: 或willTransitionToTraitCollection:withTransitionCoordinator: 時。使用以下啟動引數開啟日誌記錄:-UITraitCollectionChangeLoggingEnabled YES。您可能希望在使用此啟動引數並從 Xcode 執行應用程式時暫時禁用主執行緒檢查程式,以避免為不相關的類新增額外的日誌訊息。

• 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
• AVFoundation 現在支援使用 HEVC 和 Alpha 通道編碼視訊。以這種方式編碼的視訊在 AVFoundation API 和網頁中的 Safari 中得到廣泛支援。格式的技術細節可以在互操作性配置檔案規範中找到。

Core Image
• filterWithImageURL:options: 和 filterWithImageData:options: 不再支援 RAW 5 及更早版本。 版本 6 及更高版本仍然受支援。

• 添加了用於例項化和修改內建 Core Image 過濾器的新 API。

• 增強了 CICoreMLModel 過濾器以支援具有 MLFeatureTypeMultiArray 型別的輸入或輸出的模型。

• Metal CIKernel 例項支援具有任意結構化資料的引數。

• Metal CIKernel 例項支援返回一組2×2畫素。

• CIFormat 符號的整數值(例如 kCIFormatARGB8)已更改為跨平臺一致性的新值集合。以前的值仍然支援向後相容; 但是,您應該避免對特定數值的依賴性。

Mail
• 現在可以在“設定”>“郵件”中啟用“忽略已阻止的發件人”。被阻止的聯絡人列表與 Messages,FaceTime 和 Phone 共享