iOS——遇到的最奇葩的Bug

我司有两个App,一个115,一个是115组织,每个人分别负责不同的模块,最近除了适配iPhone X,还处理一些遗留的问题(Bug),并跟进一些开发的需求。但是最近,前几天测试很强硬的跟我反馈的了一个Bug,说这个问题一定要想办法处理掉…………。

先来看看看具体的问题

这是具体出现这个奇葩Bug的现象(已打开图层),

由于App实际效果现场暂时无法出现,所以抱歉,只能给出当时截图的图层调试效果

事情是这样的:

我司有两个App,一个115,一个是115组织,每个人分别负责不同的模块,最近除了适配iPhone X,还处理一些遗留的问题(Bug),并跟进一些开发的需求。但是最近,前几天测试很强硬的跟我反馈的了一个Bug,说这个问题一定要想办法处理掉……

测试反馈的具体问题:

  • 底部TabBar条中多出一个Item。
  • 115组织有(非常小概率)这样的现象,但是115没有出现过。
  • 无法复现,但是出现之后就无法消失 ,只能结束进程。

根据上面测试人员反馈的问题,之前有专门负责模块的人有尝试处理过此问题,后面老大和大家也一起查找和分析过此问题,但是并没有实际验证并解决此问题……

解决过程…

由于最近在开始适配iPhone X,公司仅有的一部测试机没有在我们总部现场,还在北京的分部,所以在我们进行适配后,测试人员无法验证问题,于是只能借用这边的Mac设置使用模拟器进行测试验证……

就在某一天中午,iPhone X现在测试人员在群里说了一句:

这个Bug又出现了,并符上了截图。

而且此Bug在过去的一段时间里,测试人员也有反馈过,只是概率非常低,当我们再次进行验证调试的时候,且始终无法再现了,最终都以失败告终……

这次终于有现场了,什么也不说,我停下了手上的所有工作,做到现场设备前开始调试,希望能解决这个一直以来存在的问题……

由于之前在上一家公司遇到过一次这样的问题,但是当时的解决方案是:

没有使用之前的TabBar,并且部分代码都重写整理了,才处理次问题,但实际上并没有从根本解决这个Bug,后面由于项目太赶,也就没有管那么多了。
但是这次可能不一样,就目前公司项目之庞大,肯定是没办法重写了,只能想办法找出具体问题,毕竟别人家的项目正常(或者我们另一个项目正常),这就是Bug,是Bug就要像办法解。

下面是我整个解决问题的过程

一:乱点一顿

开始调试模式以后,我回到实际效果界面,随便点了几下界面(当时测试说了一句:一来就破坏现场,我……),发现以下问题:

  1. 本来只有四个Item的(有文字和图片),但是现在貌似有五组文字,其中一组文字偏移了不少
  2. 重复的那组文字,在第一个Item对应标题的坐下角
  3. 重复的问题和对应的区域无法点击,或者点击相应的就是第一个Item的效果
  4. 重复的为文字是刚好是App上一个版本的第一个Item文字对应的标题文案,
  5. 出现之后,无论怎么操作都无法消失(即使退到了后台),只能杀掉进程

二:图层分析

然后我们开启了图层调试模式,并仔细分析了一下,下面是具体效果

由此我们得出了一下结论

  1. TabBar有五个Item,
  2. 异常的那个在图层的位置属于第三个
  3. 异常的那个在宽高貌似和其他四个相反(躺着的)
  4. 异常的那个原始X和Y值都是0
  5. 异常的那个只有问题没有图片

得到这些信息之后,我保留了一份效果并记录下来的这个信息

三:代码找到

我找到的TabBarController,发现没有自定义的Tabar,使用的系统的tabBar,经过查找也没有发现有对应TabBarController和TabBar的分类,最终到唯一设置TabBarController对应控制器和相关标题文案,图的代码

//事务
self.oneVC = [[OneViewController alloc] init];
self.oneVC.title = NSLocalizedString(@"事务", nil);
self.oneVC.tabBarItem = [[UITabBarItem alloc] initWithTitle:NSLocalizedString(@"事务+", nil) image:... selectedImage:...];

//提醒
self.twoVC = [[LifeMainViewController alloc] init];
self.twoVC.tabBarItem = [[UITabBarItem alloc] initWithTitle:NSLocalizedString(@"提醒",nil) image:... selectedImage:...];

//我聊
self.three = [[ChatMainViewController alloc] init];
self.three.title = NSLocalizedString(@"消息", nil);
self.three.tabBarItem = [[UITabBarItem alloc] initWithTitle:NSLocalizedString(@"我聊",nil) image:... selectedImage:...];

//组织
self.fourVC = [[UIStoryboard storyboardWithName:@"Groups" bundle:nil] instantiateViewControllerWithIdentifier:@"COMainOfficeViewController"];
self.fourVC.tabBarItem = [[UITabBarItem alloc] initWithTitle:NSLocalizedString(@"组织",nil) image:... selectedImage:...];

self.viewControllers = @[[[UINavigationController alloc] initWithRootViewController:self.oneVC], //115
[[UINavigationController alloc] initWithRootViewController:self.twoVC], //提醒
[[UINavigationController alloc] initWithRootViewController:self.threeVC], //我聊
[[UINavigationController alloc] initWithRootViewController:self.fourVC]];  //组织

以上是所有TabBarController设置TabBar,Item,对应控制,标题,图片的代码(由于关系代码隐私,部分代码做了特殊处理)。

这段我仔细看了不下三遍,看来看去还是看不出任何问题,但是又感觉和我们之前使用的方式有撒不同的地方,差了一下另一个项目的对应代码,好像没有什么区别,只是那边自定义了一个TabBar.

四:根据错位文案全局查找

由于上面错位Item的标题文案并不是我们设置的那四个Item的文案,只是同样是个Item,只有标题,没有图片而且是躺着的Item。

于是我全局搜索:“115组织”,发现马上有一百多个地方,当时我就懵逼了,也懒得吐槽。。。。。。。

直接查看这一百多个含有“115组织”文案的地方,并且根据类名从可能性高到底看,看完之后我们眼睛都在打转,也没有发现什么可用信息,只是熟悉了一遍代码……

五:网上寻找答案

于是我开始在进苹果官方论坛并查找相关的苹果文档资料,然后github,stackoverflow,百度,微博,贴吧,论坛,知乎等地方都搜了一遍相关资料,开始并没有找到什么根本问题,并且在几个比较值得发布的技术群里提出的请教…..

最后在stackoverflow中发现了一个问题:

how to change uiviewcontroller title independent of tabbar item title

仔细看了一下下面的回答,虽然不是问题和答案不是和我们的这个问题相关,但是我们从这里找到了灵感。

从上面的实际效果和结论我们知道
  • 多了一个Item
  • 只有标题没有问题
  • 位置在初始位置(0,0)

再回到上面的代码,我们发现只有第一个(事务)和第三个(我聊)使用的VC.title

//事务
self.oneVC = [[OneViewController alloc] init];
self.oneVC.title = NSLocalizedString(@"事务", nil);
self.oneVC.tabBarItem = [[UITabBarItem alloc] initWithTitle:NSLocalizedString(@"事务+", nil) image:... selectedImage:...];

//我聊
self.three = [[ChatMainViewController alloc] init];
self.three.title = NSLocalizedString(@"消息", nil);
self.three.tabBarItem = [[UITabBarItem alloc] initWithTitle:NSLocalizedString(@"我聊",nil) image:... selectedImage:...];

在要说区别就是组织使用的是StoryBard加载的控制器。

于是我开始猜想,难道真的在这里,但是为撒只有第一个有Bug,第三个没有Bug呢?

六:群聊问答

就在沉思和与同事讨论的时候,我之前在群里提过的问题,有人几个回答了,但是一开始都是让我直接搜索错位Bug显示对应的标题文案,仔细查看对应代码,检查tabBar控制器,Item标题等信息代码等等…..

后面有一个大牛说了一句话:

这是一个历史悠久的Bug,从iOS 5就开始有了,tabBarController对应子控制器标题最好不要这么设置,会有问题。

附上截图

曹理鹏(iCocos)-梦工厂

顿时我好想又想到了stackoverflow的那个问题,并想起来项目中设置TabBarController对应控制器和相关标题文案,图的代码。好像终于找到了解决方案,但是是真的吗?我也不知道,因为前面提到了,无法复现了(这Bug非常变态,你想它出了,死都不出来,但是不知不觉可能又出来了,而那个时候是不是又不是调试模式)。

七:解决方案?

最后我决定换掉上面设置TabBarController对应控制器和相关标题文案,图片的代码,并且和部门同事,测试人员一起想办法专门测了一下这个问题,但是最终一次都没有出现过,于是我就跟测试人员说:你先测试或者回忆一下之前出现的方案,尽量多测试一下,不管这个问题是不是真的解决了,跟其他同事也说一下,留意一下这个问题,然后就闪人了……

回到座位后,我沉思了几秒,再回想了一下整个过程,并且带讽刺的微笑,问自己:

这个问题真的解决了吗?我也不知道.......

坚持原创技术分享,您的支持将鼓励我继续创作!