写了个防止 iOS APP 崩溃的库,可以拦截一些常见的崩溃 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
kobe1941
V2EX    iDev

写了个防止 iOS APP 崩溃的库,可以拦截一些常见的崩溃

  •  
  •   kobe1941 2018-09-29 19:25:45 +08:00 8837 次点击
    这是一个创建于 2638 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题,项目地址请点击这里

    用 method swizzle 来实现,没有使用 try-catch。 对常见的容器类,数组字典字符串这些有做保护,顺带新增了 NSSet,NSCache,NSUserDefaults,NSData 等几个类的保护,支持拦截 unrecognized selector sent to instance 异常,设置好要拦截的类即可。

    已经在自己的项目用上了,目前工作稳定,iOS8.x 到 iOS11.x 都测试通过。

    一些使用代码规范就能解决的崩溃,比如 NSTimer,通知和 KVO 这些造成的崩溃,本项目并未做额外处理,这种低级的失误,还是用代码规范来限制比较好。

    13 条回复    2019-02-13 17:51:29 +08:00
    YIem
        1
    YIem  
       2018-09-29 19:52:52 +08:00
    为什么不在 V2EX 里用英文介绍呢?
    tanpengsccd
        2
    tanpengsccd  
       2018-09-29 20:06:19 +08:00 via iPhone
    用 swift 不强制解包 应该可以减少 crash
    kobe1941
        3
    kobe1941  
    OP
       2018-09-29 22:34:45 +08:00
    @tanpengsccd 那就跟我这个原理不太一样了哈
    nathanw
        4
    nathanw  
       2018-09-30 00:21:43 +08:00 via iPhone   2
    这么做并不合适,出现这个问题一般由于逻辑缺陷,若简单拦下来只是当时不 crash,程序继续执行还会处于一个不稳定状态,延迟错误的发生将更难定位问题
    classyk
        5
    classyk  
       2018-09-30 08:39:04 +08:00
    防止 crash 并不能保证程序按预期进行。反而问题更难查找了
    ruiwendell
        6
    ruiwendell  
       2018-09-30 10:32:10 +08:00
    这个有写得比较完善的轮子了,也是通过 method swizzle 实现的,https://github.com/chenfanfang/AvoidCrash
    kobe1941
        7
    kobe1941  
    OP
       2018-09-30 11:25:59 +08:00
    @nathanw 我是针对常见的容器类做拦截,并且给出了错误日志回调的接口,只要你上传错误日志,是可以定位到问题的,而且只用了 methos swizzle,而没有使用 try-catch,因为一旦 try-catch 失败后,操作系统抛出的异常,往往很诡异,跟原本的错误是两码事。avoidCrash 的 issue 页面有一些这样的问题,作者根本就无法复现,更不要谈怎么去解决 @ruiwendell
    APP 崩溃对于用户来说始终是最差的体验,没有之一。
    kobe1941
        8
    kobe1941  
    OP
       2018-09-30 11:29:34 +08:00
    @classyk 因为 OC 有语法糖,经常会使用诸如 @[str1,str2],或者 array[5]或者 dic[@"key"] = obj 这样子的写法,所以降低崩溃率是切实可行的,而且上报的错误日志有完整的调用堆栈,为什么会更难查找问题呢?
    当然如果代码或者数据有问题,虽然走到此处并不会崩溃,但程序不见得会正常运行下去,至少让用户可以返回到上一个页面,比直接 crash 还是要好很多吧。。。
    cikelengfeng
        9
    cikelengfeng  
       2018-11-27 18:12:46 +08:00
    火灾发生了,就把报警声关掉。。。。
    这种行为不可取啊
    cikelengfeng
        10
    cikelengfeng  
       2018-11-27 18:14:14 +08:00
    程序之所以要 crash,一个很重要的原因是程序在非预期的状态下能够保护用户的数据,这种情况下如果继续跑多半会有更严重的错误发生
    kobe1941
        11
    kobe1941  
    OP
       2018-11-28 11:41:03 +08:00
    @cikelengfeng 你先看下介绍嘛,拦截的是一些基础容器的异常,常见的是各种越界,插入空值这些导致的崩溃。拦截他们不会有更严重的错误发生,会让一部分操作不是得到它原来的结果,但是其他功能依然可以正常运行。
    你有了解到用户就会知道,常规来说,APP 崩溃是对用户最大的伤害。
    massacreformash
        12
    massacreformash  
       2018-12-01 16:47:58 +08:00
    不建议团队使用. 个人项目使用算是比较适合
    misaka20
        13
    misaka20  
       2019-02-13 17:51:29 +08:00
    拦截到了,把日志记录下来不就好了。
    怎么就问题就更难找了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2492 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 12:31 PVG 20:31 LAX 04:31 JFK 07:31
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86