iOS 13 正式發(fā)布,來看看有哪些 API 變動
iOS 13 已正式發(fā)布迅矛,網(wǎng)上對其用戶體驗上的新特性的描述也很多炎滞。對于開發(fā)來說,需要關(guān)注的另一方面是新系統(tǒng)在 API 層面做了哪些改動诬乞,從而會對我們現(xiàn)有的代碼產(chǎn)生什么影響册赛。
在這里,我們基于 iOS 13 Release Notes 做了一些整理震嫉,主要是列表出 Apple 提供的一些新的 API 和棄用了哪些 API森瘪,一起來看看。
General
? iOS 13 不再支持UIApplicationExitsOnSuspend
票堵。需要更新應(yīng)用以處理現(xiàn)代多任務(wù)處理扼睬。
UIKit
? 當(dāng)單元格突出顯示或選中時,UITableViewCell
類不再更改 contentView
及其任何子視圖的backgroundColor
或 opaque
屬性悴势。如果要在 contentView
內(nèi)部(包括)內(nèi)容的任何子視圖上設(shè)置不透明的backgroundColor
军俊,則單元格突出顯示或選中時的外觀可能會受到影響。解決子視圖任何問題的最簡單方法是確保將 backgroundColor
設(shè)置為nil
或 clearColor
,并且設(shè)置它們的opaque
屬性為 false
。但是,如果需要,您可以重寫 setHighlighted:animated:
和 setSelected:animated:
方法,以便在移動到突出顯示的狀態(tài)和選定狀態(tài)時手動更改子視圖上的這些屬性。
? 從iOS 8開始,將UISearchController
與 UINavigationController
一起使用需要將頂視圖控制器的definesPresentationContext
屬性設(shè)置為true
边锁。如果不這樣做會導(dǎo)致難以檢測和調(diào)試的細微錯誤。從 iOS & iPadOS 13 beta 開始斥铺,如果視圖控制器的 navigationItem
具有 non-nil 搜索控件笙纤,當(dāng)視圖控制器顯示在導(dǎo)航控制器中時抖拴,UINavigationController
會自動將該視圖控制器的 definesPresentationContext
屬性設(shè)置為true
。如果您要定位早期版本的 iOS腥椒,請在搜索控制器變?yōu)榛顒訝顟B(tài)之前設(shè)置此屬性阿宅。
? UIRefreshControl
類不再直接修改其滾動視圖的contentInset
。相反笼蛛,它對內(nèi)容插入的調(diào)整將合并到滾動視圖的adjustContentInset
中洒放。唯一的例外是當(dāng)滾動視圖的 contentInsetAdjustmentBehavior
設(shè)置為 UIScrollViewContentInsetAdjustmentNever
時,在這種情況下滨砍,UIRefreshControl
實例將像以前的版本一樣直接修改 contentInset
往湿。
? 如果通過覆蓋 sizeThatFits
在 UITableView
中實現(xiàn)自調(diào)整單元格而不使用自動布局,則返回的高度將被解釋為單元格的 contentView
所需的高度惋戏,UITableViewCell
會自動添加為單元格留出空間所需的任何其他高度 分隔器领追。如果以這種方式實現(xiàn)手動自調(diào)整大小,則在 UITableViewCell
上調(diào)用sizeThatFits:
時响逢,單元格的 contentView
寬度可以保證準(zhǔn)確绒窑,以便在手動布局計算中使用。
? Trait
環(huán)境(例如視圖和視圖控制器)現(xiàn)在在初始化期間使用 traits
填充 traitCollection 屬性舔亭。這些初始特征表示特征環(huán)境在添加到層次結(jié)構(gòu)時將接收的最終特征的預(yù)測些膨。因為在初始化期間填充的特征只是一個預(yù)測,它們可能與實際在層次結(jié)構(gòu)中接收的特征不同钦铺。因此傀蓉,在可能的情況下,您應(yīng)該等待執(zhí)行使用 traitCollection
的工作职抡,直到視圖或視圖控制器的視圖移動到層次結(jié)構(gòu)中 - 意味著窗口返回非零值 - 這樣您就不必丟棄任何工作葬燎,如果實際特征不同,則使用預(yù)測的特征完成缚甩。使用 traitCollection 的最佳時間是在布局期間谱净,例如layoutSubviews
,viewWillLayoutSubviews
或 viewDidLayoutSubviews
內(nèi)部擅威。
? 只有當(dāng)特征值發(fā)生變化時壕探,才會調(diào)用traitCollectionDidChange:
方法。重要的是郊丛,由于特征集合現(xiàn)在初始化為目標(biāo)層次結(jié)構(gòu)中最終特征的預(yù)測李请,當(dāng)初始預(yù)測特征與層次結(jié)構(gòu)中的最終特征匹配時瞧筛,特征環(huán)境添加到層次結(jié)構(gòu)時將不會調(diào)用 traitCollectionDidChange:
。因為traitCollectionDidChange:
旨在作為無效回調(diào)來通知您一個或多個特征已更改导盅,請審核此方法的現(xiàn)有實現(xiàn)较幌,以及 UIContentContainer
方法willTransitionToTraitCollection:withTransitionCoordinator:
,用于您可能依賴它的地方觸發(fā)初始設(shè)置白翻。懶惰地執(zhí)行使用 traitCollection 的工作的最佳位置是在上面討論的 layoutSubviews
方法之一乍炉,但請記住,這些布局方法在任何時候布局都會被調(diào)用滤馍,所以一定要避免在不需要時重復(fù)工作岛琼。
? 您現(xiàn)在可以啟用調(diào)試日志記錄,以便在您自己的類上調(diào)用traitCollectionDidChange:
或willTransitionToTraitCollection:withTransitionCoordinator:
時巢株。使用以下啟動參數(shù)打開日志記錄:-UITraitCollectionChangeLoggingEnabled YES
槐瑞。您可能希望在使用此啟動參數(shù)并從 Xcode 運行應(yīng)用程序時暫時禁用主線程檢查程序,以避免為不相關(guān)的類添加額外的日志消息阁苞。
? UITableViewCell
類的contentView
屬性始終與前面和后面的相鄰附件進行邊對邊布局困檩。這簡化了布局代碼,因此想要正確的默認偏移的開發(fā)人員不再需要將其內(nèi)容與內(nèi)容視圖邊框或布局邊距對齊猬错,具體取決于尾部是否有附件窗看。您現(xiàn)在應(yīng)該始終在單元格內(nèi)容視圖的布局邊距上布置代碼以獲取默認的系統(tǒng)插入。這些插入將根據(jù)單元格中可見的附件自動調(diào)整倦炒,以匹配系統(tǒng)的默認間距显沈。
? 您現(xiàn)在可以從創(chuàng)建block
調(diào)用自定義初始化程序,該創(chuàng)建塊通過 instantiateInitialViewController(creator:)
或 instantiateViewController(identifier:creator:)
傳遞逢唤。這使您可以使用其他上下文和參數(shù)初始化視圖控制器拉讯,同時利用通過Interface Builder
在故事板中定義它們。自定義控制器初始化程序必須調(diào)用其super.init(coder:)
方法并傳遞它通過創(chuàng)建塊接收的編碼器參數(shù)鳖藕。
?presentViewController
控制器無法全屏顯示, 且可以下滑收回, 原因modalPresentationStyle
屬性iOS 13之前默認為UIModalPresentationFullScreen
, 之后為UIModalPresentationAutomatic
, 修改方法:
LoginNewViewController * controller = [[LoginNewViewController alloc]init];
controller.modalPresentationStyle = UIModalPresentationFullScreen;
[self presentViewController:controller animated:YES completion:nil];
也可以在RootViewController
里全局修改.
? KVC
訪問私有Api statusBarWindow
崩潰問題解決
if (@available(iOS 13.0, *)) {
_statusBar = [[UIView alloc] initWithFrame:[UIApplication sharedApplication].statusBarFrame];
} else {
statusBar = [[[UIApplication sharedApplication] valueForKey:@"statusBarWindow"] valueForKey:@"statusBar"];
}
?tabBar
顏色問題, push
或者present
控制器后, 再返回跟視圖, 點擊tabBar
選中顏色, 變?yōu)槟J色藍色, 解決辦法
if (@available(iOS 13.0, *)) {
[[UITabBar appearance] setUnselectedItemTintColor:Style.greenColor_1fdc84];
}if (@available(iOS 10.0, *)) {
[self.tabBar setUnselectedItemTintColor:Style.greenColor_1fdc84];
} else {
// Fallback on earlier versions
}
? overrideUserInterfaceStyle
如果不想設(shè)配深色模式
if (@available(iOS 13.0, *)) {
self.overrideUserInterfaceStyle = UIUserInterfaceStyleLight;
} else {
// Fallback on earlier versions
}
Info.plist 文件添加key: User Interface Style
value:Light
必須是Light
, 不然打包時會報錯.
? UIStatusBarStyle
狀態(tài)欄顏色, 深色模式下默認都是白色, 適配辦法UINavigationController寫法
// 重寫這個方法才能讓 viewControllers 對 statusBar 的控制生效
- (UIStatusBarStyle)preferredStatusBarStyle {
return self.topViewController.preferredStatusBarStyle;
}
其他控制器
// info.plist設(shè)置View controller-based status bar appearance = YES
// 如果為NO此方法不調(diào)用,需要這么設(shè)置,但iOS9.0已過期[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
// 動態(tài)修改 調(diào)用[self setNeedsStatusBarAppearanceUpdate]
// UIStatusBarStyleDefault 小于13.0:黑色 大于13.0:黑或白
// UIStatusBarStyleLightContent 都是白色
// UIStatusBarStyleDarkContent 13.0黑色
- (UIStatusBarStyle)preferredStatusBarStyle {
if (@available(iOS 13.0, *)) {
return UIStatusBarStyleDarkContent;
} else {
return UIStatusBarStyleDefault;
}
}
網(wǎng)絡(luò)
? 為了增強安全性魔慷,當(dāng)服務(wù)器發(fā)送Content-Type:application/octet-stream
時,NSURLSession
不再嗅探 MIME 類型著恩。
? NSURLRequestReloadRevalidatingCacheData
和 NSURLRequestReloadIgnoringLocalAndRemoteCacheData
API現(xiàn)已可用院尔。
? 從 iOS 13 beta 4 開始,強制執(zhí)行NSMutableURLRequest
的HTTPBodyStream
屬性的copy
操作喉誊。如果在調(diào)用屬性設(shè)置器后對body
數(shù)據(jù)進行了修改邀摆,則 HTTP 請求中發(fā)送的數(shù)據(jù)將不包含該更變。調(diào)用該屬性的 getter
不再返回NSMutableData
引用伍茄,即使使用該類型的數(shù)據(jù)調(diào)用 setter 也是如此栋盹。從 iOS 13 beta 5 開始,使用 iOS 12 SDK 或以前的 SDK 構(gòu)建的應(yīng)用程序使用舊版行為敷矫。
? CNCopyCurrentNetworkInfo
API 返回的信息已無法反映真實情況例获。有關(guān)更多詳細信息汉额,請參閱更新的API文檔和標(biāo)題。
? 包含 body
的 GET HTTP
方法的所有NSURLSessionTask
實例現(xiàn)在都會拋出錯誤 NSURLErrorDataLengthExceedsMaximum
榨汤。
? 刪除了對代理自動配置(PAC)的 FTP 和文件URL方案的支持蠕搜。HTTP 和 HTTPS 是 PAC 唯一支持的 URL 方案。這會影響所有 PAC 配置件余,包括但不限于使用“設(shè)置”讥脐,“系統(tǒng)偏好設(shè)置”遭居,“配置文件”和 NSURLSession AP
I(如connectionProxyDictionary
和CFNetworkExecuteProxyAutoConfigurationURL
)設(shè)置的配置啼器。
? NSURLSession
和 NSURLConnection
API 不再支持 SPDY。服務(wù)器應(yīng)使用 HTTP 2 或 HTTP 1.1俱萍。
音頻
? 現(xiàn)在可以在AVAudioEngine
上啟用語音處理模式端壳。
? 新的 AVAudioNode
類型可用于包裝用戶定義的 block,以實時發(fā)送或接收數(shù)據(jù)枪蘑。
? 基于 AVAudioEngine
的應(yīng)用程序可以使用一種新方法來檢索附加到 AVAudioEngine
實例的所有節(jié)點的列表损谦。
? AVAudioEnvironmentNode
中的新渲染模式基于輸出設(shè)備自動選擇最佳空間音頻渲染算法。
? 一個新的AVAudioSession
屬性允許在會話主動使用音頻輸入時播放系統(tǒng)聲音和觸覺岳颇。
? 新的枚舉 AVAudioSessionPromptStyle
根據(jù)系統(tǒng)中的其他音頻活動通知應(yīng)用程序應(yīng)該播放哪種語音提示照捡。
? AVAudioSessionRouteSharingPolicy
現(xiàn)在允許應(yīng)用指定路由共享策略,以便其音頻和視頻路由到與 AirPlay 相同的位置话侧。
? Audio Unit Extensions
現(xiàn)在支持所有宿主應(yīng)用程序中可用的用戶預(yù)設(shè)栗精。
? OpenAL
框架已棄用,出于兼容性目的暫時保留瞻鹏。過渡到 AVAudioEngine
以獲得 3D 音頻功能悲立。
? AUGraph
已被棄用,轉(zhuǎn)而支持AVAudioEngine
新博。
? 不推薦使用應(yīng)用間音頻薪夕。使用 Audio Units
支持此功能。
? 不推薦使用基于 Carbon
的 Audio Units
赫悄,在將來的版本中不再支持原献。
? 不再支持舊版 Core Audio HAL
音頻硬件插件。將音頻服務(wù)器插件用于支持音頻驅(qū)動程序埂淮。
音頻共享
? 音頻共享與 AirPods
(第1代或更高版本)和PowerBeats Pro
兼容姑隅。需要 iPhone 8 或更高版本。
AVFoundation
? AVFoundation
現(xiàn)在支持使用 HEVC 和 Alpha 通道編碼視頻同诫。以這種方式編碼的視頻在 AVFoundation
API 和網(wǎng)頁中的 Safari 中得到廣泛支持粤策。格式的技術(shù)細節(jié)可以在互操作性配置文件規(guī)范中找到。
Core Image
?filterWithImageURL:options:
和 filterWithImageData:options:
不再支持 RAW 5 及更早版本误窖。版本 6 及更高版本仍然受支持叮盘。
? 添加了用于實例化和修改內(nèi)置 Core Image
過濾器的新 API秩贰。
? 增強了 CICoreMLModel
過濾器以支持具有MLFeatureTypeMultiArray
類型的輸入或輸出的模型。
? Metal CIKernel
實例支持具有任意結(jié)構(gòu)化數(shù)據(jù)的參數(shù)柔吼。
? Metal CIKernel
實例支持返回一組2×2像素毒费。
?CIFormat
符號的整數(shù)值(例如 kCIFormatARGB8
)已更改為跨平臺一致性的新值集合。以前的值仍然支持向后兼容; 但是愈魏,您應(yīng)該避免對特定數(shù)值的依賴性觅玻。
? 現(xiàn)在可以在“設(shè)置”>“郵件”中啟用“忽略已阻止的發(fā)件人”。被阻止的聯(lián)系人列表與 Messages培漏,F(xiàn)aceTime 和 Phone 共享溪厘。
小結(jié)
從開發(fā)層面來講,iOS 13 最大的亮點無疑是引入了SwiftUI
牌柄,這也是 WWDC 2019 的一大亮點畸悬。實際上 Release Note 也是大篇幅在講 SwiftUI
的內(nèi)容。由于 SwiftUI
還處理優(yōu)化階段珊佣,變數(shù)還很多蹋宦,所以我們在此暫不說明,詳情可以查看 iOS 13 Release Note咒锻。
另外由于 Apple 在未發(fā)布 iOS 13 正式版時冷冗,就開始發(fā)布 iOS 13.1 beta 版,所以有些內(nèi)容可能已不適用惑艇。在 iOS 13.1 正式版出來后蒿辙,我們再細細來看。
本篇文章持續(xù)更新中, 歡迎一起討論.