专栏首页腾讯Bugly的专栏iOS 9.1 深坑体验及其破解之道

iOS 9.1 深坑体验及其破解之道

众所周知,苹果iOS 9的推新速度已经打破了纪录,9.1刚刚于上周推出后,昨天,9.2 beta1已经出来了。

那么,到底iOS9都有哪些坑?网上能够搜索到的那些大的方面,本文不再罗列,想必每一个使用Xcode7编译的App都已经做过了相关的工作。本文只讲本团队开发过程中遇到的非常小但却非常隐蔽的“坑”“坑”“坑”!

1问题的发现

某天,本团队正在如常监控App的Crash数据,突然发现其中多了几个特殊的Crash类型。经过汇总分析,发现了重现Crash的软硬件环境,于是尝试重现了一下,将系统升级到9.1beta,果然,启动App后发生了Crash。

看来,问题出现在layer的bounds的x坐标是nan。这种错误是在float经过函数运算出现了不是数字的值,通常这种情况是因为除以0造成的,而layer的bounds不接受nan值,所以出现了问题。

那么nan是在哪里产生的呢,经过debug确定问题点:

通过打印发现此时self.contentSize.width是0,所以造成movepercent的值是nan,之后使用nan进行赋值所以出现Crash。

那么问题来了:

1.scrollViewDidScroll:方法不是只有滑动屏幕或者设置contentoffset才被调用吗?2.程序刚刚启动,为什么会调用到scrollViewDidScroll:方法,是谁调用的。

3.调用scrollViewDidScroll:方法的时候contensize为什么是0呢,此时contensize应该已经被赋值才对。

4.为什么9.1beta版有问题而之前的版本没有问题呢。

2问题的分析

带着这些疑问继续debug:

通过上图我们发现两个版本之间的区别是9.1beta系统在App初始化阶段就调用了scrollViewDidScroll方法,而此时scroll的contentsize还没有被初始化(contentsize的default值是0),所以导致了nan问题的发生。

新的疑问又来了,两个版本都执行了_setNavigationControllerContentInsetAdjustment:方法,为什么9.1beta执行了scrollViewDidScroll,而9.1之前的版本没有执行此方法呢。

我们进一步debug如下图

我们发现两个版本之间的区别只是inset值不同,那么苹果会不会以inset的值来决定是否发送scrollViewDidScroll消息呢。继续debug如下图

通过debug,我们发现只要inset的值不是0系统就会执行scrollViewDidScroll方法。而49刚好是我们tabbar的高度,虽然看不到sdk内部的实现但是应该可以推断9.1beta版本对初始化顺序进行了修改,导致scrollViewDidScroll被过早的调用(此时contensize还未初始化)。

3问题的解决

1.首先要对contentsize为0的情况进行容错,防止nan的产生 。

2.其次由于我们无法修改scrollViewDidScroll的调用时机,所以应该尽早初始化contensize(比如在scrollview的init)。

一般说来,iOS系统的更新,大版本的更新变动都比较大,比如6到7,7到8,8到9,但是像这种小版本的变动,尤其是底层实现的细微变动,真的是坑死人啊!

这还不算,由于苹果更新了Store下载的软件分发方式——大的变动总会有风险的,频频发生某些App无法更新的问题。对于微信这种用户必须的App还好,今天下不了,总有一天能下载的。但是对于其它App,就没有这么幸运了,今天下不了,用户直接就不用了。变动总是痛苦的,不仅仅是苹果,还有依赖苹果的我们:)

其实除了这些问题,还有许多细节的不偶遇就不相识的问题,都隐藏在iOS各处。对于我们开发能够做的,只能是尽量的提前测试、发现、兼容、再测试、再发现、再兼容!软件工程师真的很苦逼,塞班挂了,得学iOS;iOS更新了,还得继续学;永无止境!

顺便打个广告:鉴于发现问题的重要性,尤其是已经上架的版本,监控软件质量状态极为重要,因为用户场景各不相同,有些环境是测试部门抓破头皮也想不到的。所以,需要某种工具来收集、分类、定位Crash或bug日志。为了保障App质量,我们接入使用了专业Crash监测工具:腾讯Bugly。

Bugly是腾讯内部产品质量监控平台的外发版本,其主要功能是App发布以后,对用户侧发生的Crash以及卡顿现象进行监控并上报,让开发同学可以第一时间了解到App的质量情况,及时机型修改。目前腾讯内部所有的产品,均在使用其进行线上产品的崩溃监控。

腾讯Bugly 最专业的质量跟踪平台

精神哥、小萝莉,为您定期分享应用崩溃解决方案

本文分享自微信公众号 - 腾讯Bugly(weixinBugly),作者:max(李想)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2015-10-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • RecyclerView 必知必会

    导语 RecyclerView是Android 5.0提出的新UI控件,可以用来代替传统的ListView。 Bugly之前也发过一篇相关文章,讲解了 Recy...

    腾讯Bugly
  • 从 Android 静音看正确的查找 bug 的姿势

    0、写在前面 没抢到小马哥的红包,无心回家了,回公司写篇文章安慰下自己TT。。话说年关难过,bug 多多,时间久了难免头昏脑热,不辨朝暮,难识乾坤。。。艾玛,扯...

    腾讯Bugly
  • 萝莉有话说:你的App真正适配了iOS 9吗?

    时隔三月,如隔三秋。越过层层文档,穿过条条代码,小萝莉终于又和大家见面了!用户朋友们,我想死你们了!当然萝莉来此,并不是来和大家聊春晚的,我们的主题依旧是iOS...

    腾讯Bugly
  • Storm参数配置及代码优化

    gaofc
  • 西门子S7系列PLC安全防护研究

    近年来,随着中国制造的不断崛起,工业控制系统已成为国家关键基础设施的重中之重,工控系统的安全问题也随之而来。工控产品的多样化,造成了工控系统网络通讯协议不同,大...

    FB客服
  • 被解放的姜戈07 马不停蹄

    前面的文章研究了Django最主要的几个方面:数据库,模板,动态生成页面等。但都是使用python manage.py runserver来运行服务器。这是一个...

    Vamei
  • Kubernetes的服务网格(第6部分):简单轻松的分期微服务

    在将代码暴露给生产流量之前,分期新代码是构建可靠的,低故障停机时间软件的关键部分。然而不幸的是,对于微服务来说,每个新服务的添加都提升了分期过程的复杂性,因为服...

    Techeek
  • “打脸”世界杯:AI界没有预测比赛的章鱼保罗

    即便不是足球迷,你也应该听说过章鱼保罗。2010 年南非世界杯,这条八爪鱼预测的比赛结果 8 猜全中,这一不可思议的神奇预测让它受到了全世界球迷的追捧,并赐封其...

    AI科技大本营
  • javascript实现限定高度下文字随不同设备自适应改变字体大小至字数完全展示

    蓓蕾心晴
  • Android progressbar实现带底部指示器和文字的进度条

    本文实例为大家分享了Android实现带指示器和文字的进度条,供大家参考,具体内容如下

    砸漏

扫码关注云+社区

领取腾讯云代金券