美文网首页iOS DeveloperIOS
在iOS11 beta4 遇到的一个私有函数冲突Crash

在iOS11 beta4 遇到的一个私有函数冲突Crash

作者: 熊猫人和熊猫君 | 来源:发表于2017-07-28 19:23 被阅读0次

状况:最近苹果发布iOS11 beta4,导致我们崩溃率上涨0.02%

crash.png

因历史原因,Event未加工程前缀,Event为自定义类。从crash堆栈可以看出,crash很明显没找到对应方法名。可是工程里面确实有Event这个自定义的类,并且引入编译进去了工程。

那么问题来了,既然我们工程里面有Event这个自定义的类,为什么还是找不到方法呢。我们开始怀疑是和苹果本身提供是函数冲突了,那么这个函数到底是哪一个framework的呢?经过调试我们发现和photo.framework有关。使用安装了iOS11 beta4的真机调试,移除photo.framework就ok,加入就crash。那么我们基本确定是photo.framework。

但是问题又来了,photo.framework是以option引入到工程里面的,就是说只有include其里面的头文件才会加载photo.framework进入内存,并且framework都是打包期间就固定编译进IPA里面了,我们是用xcode8发的线上包,也就是说线上包的photo.framework是低版本的,因为bug在非iOS11 beta4的机器上是不存在的。并且我们也反汇编了打包机的xcode里面的photo.framework并没有发现Event这个类,这难道是苹果在iOS11 beta4动态修改了我们的photo.framework增加了Event的类,联想到dylib最近升级到dylib3,瞬间吓出一身冷汗,苹果是要逆天,不让别人使用动态更新,自己却来个更猛地,可是后来再想想这种可能性是很小的,应该是不可能。

既然photo.framework无Event类,那么就可能是photo.framework使用了其他是内部framework,才导致这个bug,顺着这个思路,我们惊喜的发现,Photos.frameworks调用了系统私有API frame work “/System/Library/PrivateFrameworks/Symptoms.framework/Frameworks/SymptomAnalytics.framework/SymptomAnalytics”
从这个路径我们可以看出这是与苹果系统相关的私有framework,猜测,不同iOS系统版本里面的私有framework是可能不同的,我们那个bug就刚刚好碰巧撞到枪口上了。找到了对应的问题framework,并且我们自定义的Event类后于系统framework编译进去

那么如何防御这种crash呢
1.类强制加前缀,并静态代码走查。
2.selector防护,类似与jspatch拦截消息转发的最后一步不让其崩溃。
3.推荐使用libextobjc里面的safecategory
备注:同事反馈后,苹果在beta 5已经修复
https://forums.developer.apple.com/thread/83555

相关文章

  • 在iOS11 beta4 遇到的一个私有函数冲突Crash

    状况:最近苹果发布iOS11 beta4,导致我们崩溃率上涨0.02% 因历史原因,Event未加工程前缀,Eve...

  • JavaScript函数_07 私有变量 + 私有函数 + 特权

    私有变量 使用 var 关键字声明在函数内部的变量称为私有变量 私有函数 在函数内部声明的函数称为私有函数 特权方...

  • js 管理私有属性

    优点: 私有数据非常安全;私有属性的命名不会与其他父类或子类的私有属性命名冲突。缺点: 当你需要在构造函数内把所有...

  • 未初始化局部变量跨ARC使用引发的崩溃

    遇到一次函数调用,在还未进入函数内部就Crash,原因为EXEC_BAD_ACCESS。最后分析的结果是:一个位于...

  • JavaScript 构造函数私有、公有、静态、特权方法

    3. 构造函数的私有、公有、静态、特权方法 私有属性和方法创建:在构造函数内部创建的变量是私有属性,创建的函数是私...

  • Java基础-单例模式

    概述 使用一个私有构造函数、一个私有静态变量以及一个公有静态函数来实现。私有构造函数保证了不能通过构造函数来创建对...

  • [iOS]获取手机已安装应用列表

    注意此方法是私有API适用于iOS8 ~ iOS11之前, iOS11之后不实用 简单方法 详细内容 在iOS 1...

  • 【蜗牛黑板报】write函数和字符串

    今天调试项目中,遇到一个crash问题,和字符串末尾多一个\0有关,和write函数有关。 write() : s...

  • 构造函数

    构造函数分为: 1.实例构造函数 2.私有构造函数 3.静态构造函数 私有构造函数 私有构造函数是一种特殊的实例构...

  • 1、类的定义 类的成员出现顺序:公共静态常量、私有静态变量、私有实体变量,然后才是公共函数,私有的工具函数紧随在该...

网友评论

    本文标题:在iOS11 beta4 遇到的一个私有函数冲突Crash

    本文链接:https://www.haomeiwen.com/subject/drjtlxtx.html