iOS13适配总结,iOS13 API变动

iOS 13 正式发布,来看看有哪些 API 变动


iOS 13 已正式发布,网上对其用户体验上的新特性的描述也很多。对于开发来说,需要关注的另一方面是新系统在 API 层面做了哪些改动,从而会对我们现有的代码产生什么影响。

在这里,我们基于 iOS 13 Release Notes 做了一些整理,主要是列表出 Apple 提供的一些新的 API 和弃用了哪些 API,一起来看看。

General

• iOS 13 不再支持UIApplicationExitsOnSuspend。需要更新应用以处理现代多任务处理。

UIKit

• 当单元格突出显示或选中时,UITableViewCell 类不再更改 contentView 及其任何子视图的backgroundColoropaque 属性。如果要在 contentView 内部(包括)内容的任何子视图上设置不透明的backgroundColor,则单元格突出显示或选中时的外观可能会受到影响。解决子视图任何问题的最简单方法是确保将 backgroundColor 设置为nilclearColor,并且设置它们的opaque 属性为 false。但是,如果需要,您可以重写 setHighlighted:animated:setSelected:animated:方法,以便在移动到突出显示的状态和选定状态时手动更改子视图上的这些属性。

• 从iOS 8开始,将UISearchControllerUINavigationController 一起使用需要将顶视图控制器的definesPresentationContext属性设置为true。如果不这样做会导致难以检测和调试的细微错误。从 iOS & iPadOS 13 beta 开始,如果视图控制器的 navigationItem具有 non-nil 搜索控件,当视图控制器显示在导航控制器中时,UINavigationController 会自动将该视图控制器的 definesPresentationContext属性设置为true。如果您要定位早期版本的 iOS,请在搜索控制器变为活动状态之前设置此属性。

UIRefreshControl 类不再直接修改其滚动视图的contentInset。相反,它对内容插入的调整将合并到滚动视图的adjustContentInset 中。唯一的例外是当滚动视图的 contentInsetAdjustmentBehavior设置为 UIScrollViewContentInsetAdjustmentNever 时,在这种情况下,UIRefreshControl 实例将像以前的版本一样直接修改 contentInset

• 如果通过覆盖 sizeThatFitsUITableView 中实现自调整单元格而不使用自动布局,则返回的高度将被解释为单元格的 contentView 所需的高度,UITableViewCell会自动添加为单元格留出空间所需的任何其他高度 分隔器。如果以这种方式实现手动自调整大小,则在 UITableViewCell上调用sizeThatFits: 时,单元格的 contentView宽度可以保证准确,以便在手动布局计算中使用。

Trait环境(例如视图和视图控制器)现在在初始化期间使用 traits 填充 traitCollection 属性。这些初始特征表示特征环境在添加到层次结构时将接收的最终特征的预测。因为在初始化期间填充的特征只是一个预测,它们可能与实际在层次结构中接收的特征不同。因此,在可能的情况下,您应该等待执行使用 traitCollection 的工作,直到视图或视图控制器的视图移动到层次结构中 - 意味着窗口返回非零值 - 这样您就不必丢弃任何工作,如果实际特征不同,则使用预测的特征完成。使用 traitCollection 的最佳时间是在布局期间,例如layoutSubviewsviewWillLayoutSubviewsviewDidLayoutSubviews 内部。

• 只有当特征值发生变化时,才会调用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:) 方法并传递它通过创建块接收的编码器参数。

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选中颜色, 变为默认色蓝色, 解决办法

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如果不想设配深色模式

if (@available(iOS 13.0, *)) {
        self.overrideUserInterfaceStyle = UIUserInterfaceStyleLight;
} else {
        // Fallback on earlier versions
}

Info.plist 文件添加key: User Interface Style value:Light
必须是Light, 不然打包时会报错.

UIStatusBarStyle 状态栏颜色, 深色模式下默认都是白色, 适配办法UINavigationController写法

// 重写这个方法才能让 viewControllers 对 statusBar 的控制生效
- (UIStatusBarStyle)preferredStatusBarStyle {
    return self.topViewController.preferredStatusBarStyle;
}

其他控制器

// info.plist设置View controller-based status bar appearance = YES
// 如果为NO此方法不调用,需要这么设置,但iOS9.0已过期[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
// 动态修改 调用[self setNeedsStatusBarAppearanceUpdate]
// UIStatusBarStyleDefault          小于13.0:黑色 大于13.0:黑或白
// UIStatusBarStyleLightContent     都是白色
// UIStatusBarStyleDarkContent      13.0黑色

- (UIStatusBarStyle)preferredStatusBarStyle {
    if (@available(iOS 13.0, *)) {
        return UIStatusBarStyleDarkContent;
    } else {
        return UIStatusBarStyleDefault;
    }
}

网络

• 为了增强安全性,当服务器发送Content-Type:application/octet-stream时,NSURLSession不再嗅探 MIME 类型。

NSURLRequestReloadRevalidatingCacheDataNSURLRequestReloadIgnoringLocalAndRemoteCacheData API现已可用。

• 从 iOS 13 beta 4 开始,强制执行NSMutableURLRequestHTTPBodyStream 属性的copy 操作。如果在调用属性设置器后对body数据进行了修改,则 HTTP 请求中发送的数据将不包含该更变。调用该属性的 getter 不再返回NSMutableData 引用,即使使用该类型的数据调用 setter 也是如此。从 iOS 13 beta 5 开始,使用 iOS 12 SDK 或以前的 SDK 构建的应用程序使用旧版行为。

CNCopyCurrentNetworkInfo API 返回的信息已无法反映真实情况。有关更多详细信息,请参阅更新的API文档和标题。

• 包含 bodyGET HTTP 方法的所有NSURLSessionTask 实例现在都会抛出错误 NSURLErrorDataLengthExceedsMaximum

• 删除了对代理自动配置(PAC)的 FTP 和文件URL方案的支持。HTTP 和 HTTPS 是 PAC 唯一支持的 URL 方案。这会影响所有 PAC 配置,包括但不限于使用“设置”,“系统偏好设置”,“配置文件”和 NSURLSession API(如connectionProxyDictionaryCFNetworkExecuteProxyAutoConfigurationURL)设置的配置。

NSURLSessionNSURLConnection 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 支持此功能。

• 不推荐使用基于 CarbonAudio 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 共享。

小结

从开发层面来讲,iOS 13 最大的亮点无疑是引入了SwiftUI,这也是 WWDC 2019 的一大亮点。实际上 Release Note 也是大篇幅在讲 SwiftUI 的内容。由于 SwiftUI还处理优化阶段,变数还很多,所以我们在此暂不说明,详情可以查看 iOS 13 Release Note。

另外由于 Apple 在未发布 iOS 13 正式版时,就开始发布 iOS 13.1 beta 版,所以有些内容可能已不适用。在 iOS 13.1 正式版出来后,我们再细细来看。

本篇文章持续更新中, 欢迎一起讨论.

大部分内摘自此处
其他适配

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335