如何快速定位、分析、解决非Crash的BUG(iOS 11篇)

前言

众所周知,Bug是线上应用极力规避但又无法避免的。对于致命的Bug,我们可以通过Crash日志进行分析;对于无法复现的Bug、特定操作步骤引起的Bug、某些版本/系统才出现的Bug,每个开发者都有自己的一套分析、定位、解决的方法。
本文以工作中遇到的几个iOS 11 Bug为例,介绍快速定位、分析、解决Bug的经验。

正文

iOS 11裁剪图片偏移问题

功能背景:
用户从本地相册选择图片,然后裁剪一个正方形区域,最后生成用户头像。

Bug描述:
iOS 11的iPhone X,选择本地图片,然后进行裁剪,生成的图片有明显的偏移,如下:

功能实现:
裁剪控件是系统提供的UIImagePickerController。

Bug定位:
用模拟器进行复现,并断点在UIImagePickerController的回调方法,再用Xcode查看实际的返回参数和图片。
如下:
①是特意选择的区域,刚好覆盖到瀑布的顶部;
②是UIImagePickerController的返回参数,通过po命令查看;
③是按照返回参数的CropRect在原图截取出来的区域;
④是返回参数中的图片;


经过可以对比发现,③和④的图片是一致的,并且明显与①所选中的区域有所偏移。以同样的方式尝试iPhone X和6s的模拟器,发现都有偏移现象,且iPhone X的偏移更为严重。
检查本地代码,确认是正常的方式调用UIImagePickerController,那具体是哪一步影响裁剪结果呢?

仔细体验UIImagePickerController的裁剪功能,发现一个可疑的现象:

底部始终无法选择!

6s模拟器,蓝色箭头指向的区域是无法选择的!
以这个区域为突破口,对比此处区域的高度值和裁剪的偏移值,得到大致是1:2的比例,符合2x屏幕。
用iPhone X模拟器同样复现了这个问题,并且不能选择的区域更大。
而且非常有意思的是:iPhone X模拟器的裁剪偏移量为44pixel。
对于做过iPhone X适配的开发,对于44这个数值域是非常敏感的(顶部安全区域的高度),猜测是和statusBar有关。
再找到6s的模拟器对比裁剪偏移量,果不其然,大致是22pixel。
至此,Bug摸清来龙去脉:
UIImagePickerController的裁剪选择视图向下偏移了status bar的高度,但是裁剪的时候还是按照y=0计算,导致结果产生偏移。(猜测是iOS 11 UIScrollView的contentInsetAdjustmentBehavior属性导致)

Bug解决
裁剪时,隐藏statusBar。
PS:此Bug在iOS8也会出现,iOS 9/10是正常的。
iOS 8隐藏statusBar需要在UIImagePickerController的delegate实现中,添加以下代码

- (void)navigationController:(UINavigationController *)navigationController
      willShowViewController:(UIViewController *)viewController
                    animated:(BOOL)animated {
    if ([navigationController isKindOfClass:[UIImagePickerController class]] ) {
        [[UIApplication sharedApplication] setStatusBarHidden:YES];
    }
}
修复后,可以正常选择底部

小结:
善用工具,快速定位。
对于能够复现的Bug,Xcode连接真机断点调试是最方便的方法。
但是切记,不要沉浸在单步调试和盲目枚举尝试的过程

iOS 11图像放大闪烁问题

功能背景:
用户点击圆形头像后,头像会放大到等同屏幕宽度,并且从圆形展示变成正方形展示。

Bug描述:
iOS 11的iPhone 7p,在点击头像之后,在头像放大的过程中会有闪烁的现象。(iPhone X效果最为严重,除了闪烁还有抖动现象)

功能实现:
圆角按钮通过layer.cornerRadius实现,头像放大是UIView的animation block动画;

Bug定位:
先用模拟器进行尝试,发现无法复现;再用真机进行测试,发现偶然会闪烁的现象。
用录屏工具辅助,定位到闪烁是因为图片放大的动画过程中,出现了某一帧异常:

异常帧1

异常帧2

上面的展示效果类似OpenGL纹理展示的GL_CLAMP_TO_EDGE模式,怀疑是图像放大过程中的边界处理有异常。
带着疑问回看代码。查看头像详情时,点击头像(为圆形)会全屏显示头像大图。整个过程的动画内容包括两个:
1、imageView的frame变成覆盖整个屏幕;
2、imageView的layer.cornerRadius变成0;

以上的代码,在iOS 10下没有闪烁问题,但是iOS 11就会出现这个异常。
遇到代码不同iOS版本的表现不同时,先查一下API的变动。
查看苹果的文档后发现,layer的cornerRadius属性在iOS 11之前是不支持Block动画的。iOS 11之后新增了cornerRadius属性的Block动画支持,但是明显支持效果不是很好。

Bug解决:
解决方案1:移除动画过程中cornerRadius的属性变化;
解决方案2:统一用CoreAnimation来实现;

小结:
模拟器先行,真机验证。
模拟器具备多开的优势,可以同时打开多个系统的多个设备;但是因为模拟器的cpu架构与真机不同,最终必须用真机验证。
文档为主,Google为辅。
iOS版本升级经常引入Bug,对于这种不同iOS系统导致的问题,需要查看文档(文档包括Xcode的头文件以及自带的文档),如果文档找不到则用Google查找对应的关键词。

iOS 11动画异常问题

功能背景:
正常的动画效果,比如微信的聊天图片放大动画和手Q的头像放大动画,如下图:

iOS 11 微信.gif

iOS 11 QQ.gif

Bug描述:
动画与正常有异,最明显是出现这个情况:


上图的三角形区域应该是如下的区域:

功能实现:
猜测是用UIView的Block动画,或者CoreAnimation实现。

Bug定位:
Bug不限于普通app,在系统app也会出现这种异常,表现形式为:页面切换卡顿、动画执行异常
Debug调试开发中发现,动画的animationBlock和completionBlock的调用时序是正常的。以头像缩小的动画为例,以下是正常的动画时序:

正常的动画时序

从动画的异常表现上猜测,原因是动画延迟执行
尝试在completionBlock中改变背景颜色,可以看出动画还在执行时,背景颜色发生了变化;
尝试在动画开始改变视图颜色,可以发现动画执行存在明显的延迟;
可以确定:当发生这个错误之后,动画的执行实现会推迟,导致completionBlock调用的时候动画仍在执行,产生异常的现象

用下面的时序图来描述:在第10s提交一个0.2s的动画,动画执行完毕的时间是10.5s左右(正常应该是10.2s),动画延迟时间在0.2~0.4s区间。


异常的动画时序

通过KVO观察layer的frame和presentationLayer的frame,整个动画过程的调用也是正常。
在模型树=>呈现树=>渲染树这条链路上,开发者通过代码层面上只能获取到前两个环境的数据,至此问题停止深入。
只能把Bug总结为:iOS 11系统的手机在某些情况下会发生系统错误,导致整个手机的动画机制出现异常。
Bug出现之后,无法通过代码修复(iOS系统错误),只能重启手机。

Bug解决:
提示用户重启手机(可暂时修复);
向苹果提交Bug。

小结:
对于某些所有APP都存在的异常现象,归类为系统级Bug,可以在developer.apple.com的Bug Reporter提交Bug。
猜测、定位到问题所在之后,可以尝试修复,但是此Bug不在此列,不建议花费过多精力。

iOS 11 下拉刷新异常问题

功能背景:
在某些页面中,存在下拉刷新/上拉加载更多的功能。

下拉刷新前

Bug描述:
iOS 11的手机,在下拉刷新之后,会一直处于“加载中”的状态。

下拉刷新后

功能实现:
通过KVO监听tableView的属性,并判断具体的操作,最终通过自定义的dragDelegate回调。

Bug定位:
通过模拟器复现,发现iOS 10的模拟器正常,iOS 11的模拟器存在此问题。
在后台数据返回的接口处断点,确定数据返回是否正常,发现iOS 11的模拟器根本没有返回数据。
据此回溯定位:后台数据没有返回=>客户端没发协议=>下拉刷新没有回调。
再从UIScrollView的delegate回调入手,单步调试定位到问题:

iOS 11新增属性

UITableView iOS 11新增了一个属性:dragDelegate,与开发者自定义的dragDelegate冲突!

Bug解决:
修改属性名,同时注意以后在给系统的类添加属性时,需要加上自己的方法名前缀,防止与系统冲突。

小结:
正向和逆向的链式分析方式是最常见的Bug定位方法;
对于实在无法定位时,再使用二分注释的方法。

总结

iOS 11更新之后出现的问题比以往的版本更多,要求开发者需要投入更多的精力去适配,甚至会存在一些开发者无法修复的Bug。为了iPhone X全新的交互体验,iOS 11做了非常大的改动,之前的beta版本问题更多。
善用Xcode的调试工作,勤看具体API的头文件,遇到问题仔细分析。
无需对Bug产生厌恶和恐惧,但也不要沉浸在单步调试和盲目尝试的快感中。充分利用宝贵的时间,减少无用的步骤,觉察自己解决Bug过程中的不足,尽量从解决问题中习得新的知识和方法。

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

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,612评论 4 59
  • 只是想, 金书银书万卷书。 一支烟, 一杯茶, 一张报纸看半天。 那存想, 下岗潮, 下海潮, 精神 离开心房。 ...
    武杏树洋阅读 216评论 0 0
  • 风就这样吹着 月下的道路空无一人 路旁不知名的树仍呆呆站立 依靠树干甜甜露笑的女孩此刻也没了踪迹 伤疤就像旧了的梧...
    Skr啊阅读 241评论 1 1
  • 大学的美好爱情大多开始于纯净无知。 第一次遇见你心就是扑通扑通的跳,一起吃过很多次饭,也一起走过很...
    漂亮呀阅读 196评论 0 0
  • 0.27 正式版发布 不兼容的修改 移除 NavigationLegacyNavigator (ef44781) ...
    被代码耽误的机车手阅读 1,636评论 1 4