iOS10中的那些坑
1. 通讯录、相册等读取权限变严格,必须在plist文件中填上相应的描述才能访问,否则会闪退
2. 字体变化导致某些label显示出现问题。这个问题挺明显的,应该很多开发者都注意到了。
3. 今日扩展的视图大小固定了,要显示全部必须点展开按钮。另外跟3D touch一起使用时,会在显示快捷菜单的时候把今日扩展的视图也显示出来,而且只有收缩状态,不可以展开!!
要解决这个问题,目前的办法只能是通过xcode7来编译,不能用xcode8来编译。
另外,还有一个坑爹的地方,就是今日扩展的视图默认的边距改变了,ios10之前设置过UIEdgeInset的在ios10上会发生变化,如果不注意,就会被坑!
4. 想通过本地通知来修改badge的要注意了!! iOS10上的本地通知在前台状态下不生效了,必须在退到后台之后再发才可以。被这个坑了好久。。有人可能会问,为什么不直接设置UIApplication的applicationIconBadgeBumber呢?因为如果将其设置为0,通知栏中的所有该app的通知都会清除了。这是我们的产品不愿意看到的。
5.iOS10上NSUserDefault里面的内容会被随机清除,也就是说,如果你把登录信息存在NSUserDefault中,那么有可能某天你就自动退出登录了。。而且偶现的问题要查起来你懂得。。。。
6.iOS10 上 iPhone5/5c 中运行UIWebView 有一定概率会崩溃,经查是JavaScriptCore中的某些方法出现了问题。。这个目前还没找到具体原因,可能跟我们app中hook了JavaScriptCore的私有方法有关,也有可能是系统bug。在其他机型和其他版本上没有发现该问题。
------2017.6.7更新
7.最近发现iOS10上面有个崩溃挺严重的,使用FMDB的时候,内部会调用一个函数sqlite3_prepare_v2,这个函数在iOS10.2上经常崩溃,但是在iOS10.1和10.3上没有崩溃,看来是系统的一个Bug。
首先分析场景:这个问题出现在我们的商品详情页,这个页面的特点是视图结构非常复杂,内嵌了3个webview,内存消耗很高。我们在页面一进入的时候就会往数据库里写一条数据,记录浏览的商品信息。由于是购物的必经页面,所以崩溃很厉害。
怎么解决呢?使用其他的存储方式吗?切换的成本有点大,数据很有可能丢失。但是又不能强制用户升级系统,只能想办法规避。可不可以减少写数据的频次呢?或者先降低内存的使用?这些都是突破口。
于是,我们从这两个方面入手,先减少写的频次,这点可以由每次进入页面时写数据改为定时去写,先把要记录的数据存到内存中,然后批量写入,这样也可以减少读写的时间。内存方面,之前我们这个页面采用的UIWebView,众所周知,UIWebView相当耗内存,于是我们改成使用 WKWebView。这个方案跟随新版本上线之后,崩溃率降低了80%。由于数据比较敏感,就不贴图了。
8. TCPIOConnection问题
先看问题:这是CFNetwork里面的崩溃,我们的网络层用的是AFNetworking2.x 的代码,从github上提的issue来看,应该跟AFNetworking有关,但是这个问题只出现在iOS10上,而且AFNetworking和我们自己的代码都没有引用SPDY这个框架,说明跟系统也有关系。这个问题暂时还在跟进中,如果有解决方案会同步给大家。
9. WebGL问题:
在一次活动中,H5页面用到了一个webGL的库,引发了iOS10上的崩溃,崩溃的关键词是 libGPUSupportMercury.dylib _gpus_ReturnNotPermittedKillClient 。
这个问题是在app退后台之后,系统检测到有web页面在渲染,从而杀掉了进程,导致崩溃。
解决方案比较简单:当app退后台时,发一个js事件给H5,H5接收到以后,关掉WebGL或者直接把H5页面从当前视图中remove掉。当app返回前台时,再重新加载。