一个iOS 11BUG的发现、定位和解决

来源:互联网 发布:双11数据大屏 编辑:程序博客网 时间:2024/06/05 09:08

前言

在iOS 11发布之后,出现了一系列适配相关的问题,UIScrollView在pagingEnabled=YES时滑动手势不灵敏,UITableView的滑动删除功能变动,UIImagePickerViewController的取消按钮点击区域变小等,本文介绍其中一个UIAlertView问题,分享其发现、定位和解决

正文

1、问题产生

问题的最初,是iOS 11正式版发布后不久,测试的同学提了一个iOS 11相关的BUG,表现是:在直播间内发送聊天信息,如果被禁言,会弹出“被禁言”提示,键盘收回去,然后就弹不出来

开发在接到这个BUG的时候,先把问题抽象出来几个要素:直播间内、键盘弹出、弹出提示、键盘收回、键盘无法弹出。

  • 弹出提示是用的UIAlertView的方式。在键盘出现时弹出UIAlertView的提示,键盘会收起,UIAlertView消失后,键盘会再次弹出,是一次正常的表现。

2、问题复现

按照复现路径做一次尝试,发现BUG可以复现,确定问题存在

根据经验,猜测问题可能出现在键盘和UIAlertView上,与“禁言”的业务无关。

在直播间内尝试其他非“禁言”的场景,同样是在键盘出现的时候,弹出UIAlertView的提示,也会造成后续键盘无法弹出的情况。

在尝试完其他非直播间的主场景之后,发现问题可以描述为:

iOS 11的机器只要弹出来一次UIAlertView,之后再通过becomeFirstResponder无法呼起键盘;必须手动点击输入区域,触发系统的键盘弹出行为,或者切入后台再切回来,才能正常弹出来键盘

部分页面在点击评论后,会添加一层透明maskView,并弹出键盘。点击透明的maskView会调用resignFirstResponder,在键盘消失的notification中消除maskView。因为键盘无法弹出(也无法收到键盘消失的notification,但maskView还是正常添加),导致这部分页面无法进行后续的交互。

3、问题评估

在复现问题后,需要对问题的严重性进行评估,确定BUG修复的优先级。

从已知的表现来看,iOS 11下的使用影响较大(UIAlertView的提示较多)。

用iOS 11的机器下载外网版本进行测试,发现BUG竟然无法复现!

虽然很诡异,但是问题的优先级可以降到更低,排入正常的BUG解决列表中。

4、问题解析

外网版本是Xcode8编译的本,本地版本使用的Xcode9 GM编译的,难道是Xcode 9编译导致?

1、新建一个demo,只有输入框和按钮,模拟UIAlertView弹出,发现demo是正常的;

2、把app的工程设置复制到demo,把对输入框的属性设置同样复制到demo,demo依旧正常;

3、把demo代码复制到app,并把app的rootViewController赋值为demo中的VC,依旧正常;

可以确定是app中某部分代码导致的键盘无法弹出的。

经过二分注释的方式,迅速(4、5次左右)定位到问题是app中的某个Service类导致。

仔细排插Service类的属性,发现里面有一个属性的是继承UIWindow并且level比UIWindowLevelStatusBar高。

自此,根据所学和苹果UIKit的文档,我们可以对问题进行一次回溯。

5、问题回溯


苹果官网上响应链和UIWindow的说明,里面关于becomeFirstResponder()的解释是:

Asks UIKit to make this object the first responder in its window.

对于UIAlertView的iOS 11系统行为,猜测:

1、在UIAlertView弹出的时候,会抢占系统的keyWindow,所以会出现键盘在UIAlertView的时候收回(因为keyWindow改变)

2、在UIAlertView消失的时候,会遍历所有Window,找到其中z轴最高作为keyWindow,所以会出现键盘在UIAlertView消失后弹出(keyWindow变成原来的)

通过写代码调试app,确定了上面的猜测。

在iOS 11,如果UIAlertView弹出时,存在windowLevel 大于 UIWindowLevelNormal 的UIWindow,就会触发这个键盘无法弹出的BUG。

6、问题修复

1、保证app中,没有常驻的UIWindow;

2、修复键盘无法弹出时,maskView无法消除的BUG;

3、UIAlertView在后续的版本替换掉;

总结

这次问题从产生、复现、定位、评估再到修复的时间,和写这篇文章的时间差不多。

BUG的解决流程各不相同,借此提醒自己对于BUG的解决要有目的性和优先级。


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 吃辣的嗓子疼怎么办 美团客户更改地址怎么办 忘记steam的账户名称怎么办 重置手机忘了密码怎么办 sp下行短信费扣怎么办 hr公司业务员招不到人怎么办 卖房中介被房倒压房子怎么办 电脑放不了dvd光盘怎么办 股东迟迟不交齐股本金怎么办 wps转pdf就乱了怎么办 被有用分期骗了怎么办 找不到以前有用分期的账号怎么办 打工去韩国不懂韩语怎么办? 想去韩国整容没钱怎么办 专接本没接上怎么办 抄写经文写错了怎么办 在外地修车被宰怎么办 国外汇款公司名称写错了怎么办 增值税专票没有机器编码怎么办 发票右上角的编码打不全怎么办 税票名称开错了怎么办 开票名称开错了怎么办 退休党员不交党费怎么办 cad打不出来字怎么办 用cad打不出来字怎么办 打字总打错字母怎么办 mac做ppt卡住了怎么办 mac的ppt卡住了怎么办 淘宝店铺被屏蔽了怎么办 淘宝申请售后卖家拒绝怎么办 淘宝投诉卖家入口关闭怎么办 遇见最喜欢孩子的父母怎么办 房屋备案表丢了怎么办 淘宝发布商品没有品牌怎么办 电子发票名称写错了怎么办 合同写错了划掉怎么办 进京证日期错了怎么办 买车时谈的协议与合同不一致怎么办 新车上牌找不到流水号怎么办 开票数量比入库数量少怎么办 我贷款的app忘了怎么办