iOS13适配(踩坑)不完全汇总

1

通过KVC获取/访问私有属性无效

iOS13不允许通过valueForKey:valueForKeyPath:setValue: forKey: setValue: forKeyPath:获取或设置私有属性;以上KVC方法,使用Xcode11及之后版本编译会崩溃;Xcode10及之前版本虽不会崩溃,但无效;
之前有使用私有属性的地方,均需另辟蹊径:

  • 设置UISearchBar的textField
    在13中把UISearchBar中的textField直接暴露给开发者使用,无需在通过KVC获取
UITextField *searchTextField =  self.searchBar.searchTextField;
  • 修改UITextFiled的占位符字体大小以及颜色
    通过属性字符串来进行修改替代KVC方式:
UITextField *textField = [[UITextField alloc] init];
NSMutableAttributedString *attributedStr = [[NSMutableAttributedString alloc] initWithString: textField.placeholder attributes:@{NSForegroundColorAttributeName : [UIColor blackColor],NSFontAttributeName:[UIFont systemFontOfSize:16]}];
textField.attributedPlaceholder = attributedStr;
  • 设置UISearchBar的cancelButton
    iOS13可以通过searcBar的层级遍历subviews获取到,但要注意的是iOS13 UISearchBar的层级有所不同,需要多遍历一层:
for (UIView *v1 in [self.searchBar subviews]) {
    for (UIView *v2 in [v1 subviews]) {
        for (UIView *v3 in [v2 subviews]) {
            if([v3 isKindOfClass:[UIButton class]]){
                UIButton *cancelButton = (UIButton *)v3;
                ...
            }
        }
    }
}
  • 设置状态栏背景颜色
    之前可以通过KVC获得状态栏,再设置其背景颜色;
[[[UIApplication sharedApplication] valueForKey:@"statusBarWindow"] valueForKey:@"statusBar"];

iOS13中的解决方法是使用新APIUIStatusBarManager处理:

UIStatusBarManager *statusBarManager = [UIApplication sharedApplication].keyWindow.windowScene.statusBarManager;
if ([statusBarManager respondsToSelector:@selector(createLocalStatusBar)]) {
    UIView *localStatusBar = [statusBarManager performSelector:@selector(createLocalStatusBar)];
    if ([localStatusBar respondsToSelector:@selector(statusBar)]) {
        _statusBar = [localStatusBar performSelector:@selector(statusBar)];
    }
}

通过这种方式获得的状态栏,本质是新建了一个,修改此状态栏背景颜色不影响系统状态栏;所以要想状态栏显示我们想要的颜色,需要将这个创建的状态栏添加至UIWindow上,在界面销毁时再将其移出;

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [[UIApplication sharedApplication].keyWindow addSubview:_statusBar];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [_statusBar removeFromSuperview];
    _statusBar = nil;
}

或者简单点可以直接新建一个和状态栏frame一样的view,添加到window上;

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    _customStatusBar = [[UIView alloc] initWithFrame:[UIApplication sharedApplication].statusBarFrame];
    [[UIApplication sharedApplication].keyWindow addSubview:_customStatusBar];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [_customStatusBar removeFromSuperview];
    _customStatusBar = nil;
}

UIStatusBarManager这种方式同样可以获取到状态栏网络状态;
具体可以参考iOS13 获取StatusBar并且获取网络状态

UISearchBar删除UISearchBarBackground崩溃

去除UISearchBar背景色的代码

    for (UIView *view in self.searchBar.subviews.lastObject.subviews) {
        if ([view isKindOfClass:NSClassFromString(@"UISearchBarBackground")]) {
            [view removeFromSuperview];
            break;
        }
    }

以上代码在iOS13中,因为渲染问题而crash;解决方法是将[view removeFromSuperview];更改为view.layer.contents = nil;即可;

模态弹出默认交互方式更改

通过模态presentViewController跳转到另一个界面,iOS13之前modalPresentationStyle默认为UIModalPresentationFullScreen,而在iOS13默认为UIModalPresentationAutomatic;该方式present到UIAlertController等弹框界面效果和UIModalPresentationFullScreen一样;但present到一般vc时不会是全屏的,和之前相比差异明显;
同样的,使用Xcode11及之后版本编译才会有这种差异;反之则不受影响;

UITextView设置editable = NO的问题

设置textView. editable = NO;代码后,iOS13中textView中的文字会显示不全;
解决方法有:

  • 替换为:textView.userInteractionEnabled = NO;
  • 设置textView.textContainerInset = UIEdgeInsetsZero;

MPMoviePlayerController不可使用

使用Xcode11编译,使用MPMoviePlayerController的代码崩溃;报错:

MPMoviePlayerController is no longer available. Use AVPlayerViewController in AVKit.

UITableViewCell上的UILabel点击高亮显示问题

UILabel设置背景颜色为和cell一样的颜色,点击cell高亮显示的时候,iOS13 cell背景颜色变灰色,但仍会看到label背景颜色,体验非常不好(之前版本系统是看不到label背景颜色的);解决方法是将label设置为透明;

CNCopyCurrentNetworkInfo获取不到WiFi SSID

iOS13增加了wifi信息的隐私保护,据说是为了防止开发人员通过WiFi SSID信息推断出用户的位置信息;所以在iOS13中如果用户没有开启定位权限,那么通过CNCopyCurrentNetworkInfo获取的SSID为空;也就是说SSID信息和定位绑定在一起了;
解决方案:把获取SSID当成获取用户位置信息处理就行了;即在获取信息前申请用户定位权限授权,如果用户没有开启该权限根据自己的产品需求是否提示/引导用户开启;

MJExtension字典转模型NSNull处理的不同

将服务端数据字典转换为模型时,如果遇到服务端给的数据为NSNull时,iOS13,mj_JSONObject其中 class_copyPropertyList方法得到的属性里会多了一种EFSQLBinding类型,而且属性数量也不准确;这样会导致崩溃问题;不过MJExtension这个库也随即适配了iOS13,将该库升级到最新的即可;

data类型的description方法返回的字符串不同

iOS13调用description方法返回的字符串会多出length,bytes等字符串;类似:
{length = 32, bytes = 0x778a7995 29f32fb6 74ba8167 b6bddb4e ... b4d6b95f 65ac4587 }
如果之前获取推送的deviceToken字符串是通过description方法获取的,就会有问题了;解决方法:

    - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
    {
        if (![deviceToken isKindOfClass:[NSData class]]) return;
        const unsigned *tokenBytes = [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])];
      ...
    }
2019-10-21补充

UIImageView设置圆角问题

UIImageView设置圆角,且为设置背景颜色(或背景颜色设置为透明),个别图片圆角会有偏差;

aa

设置背景颜色即可解决问题;

Dark Mode(深色模式)

iOS13支持深色模式:UIKit提供新的系统颜色和 api 来适配不同颜色模式,xcassets 对素材适配也做了调整,具体适配可见: Implementing Dark Mode on iOS
大部分APP暂时都没有计划适配Dark Mode,不适配Dark Mode的需要注意:

  • UIView未显示的设置背景颜色的(使用系统默认颜色),如果是Dark Mode,那么背景颜色会是黑色,会造成界面显示bug;
  • UITextField的文字Dark Mode模式下默认为白色,同样会有问题;
  • 其他类似的颜色问题;

解决方法是:

  • 需要设置颜色的地方,都需显式的用代码设置(而不是采用系统默认的);但如果这种改动比较多的,工作量太大;
  • info.plist配置APP的显示模式为Light Mode,这样就算手机设置了Dark Mode对APP是不影响的;具体设置如下:
dd

获取不到用户通讯录备注信息

iOS13中禁止开发者访问用户通讯录备注信息,所以在获取通讯录的keys中不能有下面的这个属性
Contacts 的

CNContactNoteKey 

或者
AddressBook的

kABPersonNoteProperty

以上汇总的是目前为止遇到的各种问题,欢迎各位补充

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

推荐阅读更多精彩内容