iOS 13 已正式發佈,網上對其用戶體驗上的新特性的描述也很多。對於開發來說,需要關註的另一方面是新系統在 API 層面做了哪些改動,從而會對我們現有的代碼產生什麼影響。 在這裡,我們基於 iOS 13 Release Notes 做了一些整理,主要是列表出 Apple 提供的一些新的 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 共用。