iOS 13 适配(持续更新)

iOS 13 马上就要来了,各位 iOS 开发的小伙伴们,iOS 13 beta版的适配工作可以做起来了,O(∩_∩)O哈哈~,不多废话,直入主题!

Xcode 11 beta 版下载地址:https://developer.apple.com/download/ ;

iOS 13 手机系统下载方式,可以用描述文件下载,但是该方法无法降级,建议用爱思助手,可以方便系统升降级;

1.CNCopyCurrentNetworkInfo 方法,获取不到当前连接的WiFi信息

如果想要获取当前手机连接的WiFi,肯定需要调用该方法,iOS 13之前用该方法获取没问题,iOS 13再用该方法就获取不到了;那是什么原因呢?是有新方法嘛?还是说这事iOS 13beta版的bug;显然不是:查阅官网才发现:获取不到WiFi是因为,需要获取当前定位信息(之前以为只有Android需要这么做,现在iOS也加了这个条件);官网地址:https://forums.developer.apple.com/thread/117371;


iOS 13 适配(持续更新)_第1张图片

可以看出在这三个条件下,CNCopyCurrentNetworkInfo这个方法才可以获取到当前连接WiFi信息;

参考代码:

iOS 13 适配(持续更新)_第2张图片


2.KVC 限制

[textField setValue:[UIColor redColor] forKeyPath:@"_placeholderLabel.textColor"];

调用该方法会导致xcode崩溃,iOS 13上可以正常运行,但是用xcode跑会crash,报错信息:

'Access to UITextField's _placeholderLabel ivar is prohibited. This is an application bug'

修改方案:

textField.attributedPlaceholder = [[NSAttributedStringalloc] initWithString:@""attributes:@{NSForegroundColorAttributeName:[UIColor red]}];


3.UISegmentedControl 颜色设置方式改变

iOS 13之前设置 tintColor 的方式,已经没法改变UISegmentedControl的背景色,可通过以下方法改变:

_segmentedControl = [[UISegmentedControl alloc] initWithItems:@[@"one", @"two"]];

[_segmentedControl setBackgroundImage:[vUtilityAPP imageWithColor:[UIColor blueColor]] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

[_segmentedControl setBackgroundImage:[vUtilityAPP imageWithColor:[UIColor redColor]] forState:UIControlStateSelected barMetrics:UIBarMetricsDefault];


4.iOS 13中 presentViewController 模态动画,跳转问题修复

iOS 13之前 presentViewController 跳转的 modalPresentationStyle 默认为 UIModalPresentationFullScreen ;

在iOS 13中默认 style 被改为 UIModalPresentationAutomatic,可参考苹果代码注释:

iOS 13 适配(持续更新)_第3张图片
iOS 13 适配(持续更新)_第4张图片

修改方案:

CLBaseWebViewController *webViewController = [[CLBaseWebViewController alloc] initWithURL:url type:type data:data];

UINavigationController *nav = [[UINavigationControlleralloc] initWithRootViewController:webViewController];

nav.modalPresentationStyle = UIModalPresentationFullScreen;

[self.navigationController presentViewController:nav animated:YES completion:nil];

即:将 vc.modalPresentationStyle 的值改为 UIModalPresentationFullScreen ;


5.UITableView的accessoryType为UITableViewCellAccessoryDisclosureIndicator时,显示会有问题;

iOS 13设置该值时会显示:

iOS 13 适配(持续更新)_第5张图片

需要更换为自定义的箭头图片;


6.[deviceToken description] 获取到的格式发生变化

iOS 13正确获取Devicetoken代码:

#include

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken

{

    if (![deviceToken isKindOfClass:[NSData class]]) return;

    const unsigned *tokenBytes = (const unsigned *)[deviceToken bytes];

    NSString *hexToken = [NSString stringWithFormat:@"%08x%08x%08x%08x%08x%08x%08x%08x",

                          ntohl(tokenBytes[0]), ntohl(tokenBytes[1]), ntohl(tokenBytes[2]),

                          ntohl(tokenBytes[3]), ntohl(tokenBytes[4]), ntohl(tokenBytes[5]),

                          ntohl(tokenBytes[6]), ntohl(tokenBytes[7])];

    NSLog(@"deviceToken:%@",hexToken);

}

7.App启动过程中,部分View可能无法实时获取到frame

// 只有等执行完 UIViewController 的 viewDidAppear 方法以后,才能获取到正确的值,在viewDidLoad等地方 frame Size 为 0,例如:

[[UIApplication sharedApplication] statusBarFrame];

8.适配暗黑模式(Dark Mode)

Apps on iOS 13 are expected to support dark mode Use system colors and materials Create your own dynamic colors and images Leverage flexible infrastructure

在iOS 13设备上,苹果要求适配深夜模式,适配该模式的时候,本来想自己写一个较详细的,但是已经看到一个小伙伴写的很不错了,就直接拿过来啦,哈哈

参考地址:https://juejin.im/post/5cf6276be51d455a68490b26;

如果还没适配,需要先关闭暗黑模式:

全局关闭暗黑模式:

1.在Info.plist 文件中,添加UIUserInterfaceStyle key 名字为 User Interface Style值为String;

2.将UIUserInterfaceStyle key 的值设置为 Light;

9.UISearchBar

UISearchBar主要还是KVC获取系统私有属性,导致的坑,自己这边项目中没用到,但是有很多小伙伴遇到了,就一起记录下:

参考地址 :http://yoferzhang.com/post/20190604Searchbarios13/

你可能感兴趣的:(iOS 13 适配(持续更新))