背景
上午突然有用户反馈,使用录音功能崩溃。起初以为是最近更新的APP新版本有问题,赶紧去排查。
排查
首先在测试手机上,测试环境调试,发现并没有崩溃,长出了一口气,说明不是所有用户都有,不是新版本改出来的问题。
然后去听云后台看日志,发现崩溃的地方是初始化AVAudioRecorder
的方法——[[AVAudioRecorder alloc] initWithURL:url settings:recordSettings error:&error];
。很费解,只是简单的初始化方法,为什么会导致崩溃呢?
一开始猜测会不会是用户录音权限没开,导致开始录音的时候崩溃。尝试后发现如果权限关闭,在进入录音页面前就会提示权限未开启,去开启权限,并不能进入到录音步骤。
然后怀疑会不会是初始化的url为空,又或者机型不支持设置recordSettings
中的某些参数?搜索后,发现有url为空崩溃的条目,所以这里大概率也是初始化的url为空。
继续排查,发现初始化的url,是本地的缓存文件夹中Audio文件夹,并且文件名字是取日期+时分秒用于避免重复,格式为yyyyMMdd_HHmmss
,这里按道理来说是不会出现空的问题的,所以究竟是哪里的问题;于是和用户沟通,用户反馈问题是今天出现的,之前是好的,最近有升级了15.6.1的系统。但是恰好手头的测试机也是iOS 15.6.1,并没有出现崩溃的问题,说明和系统版本并无关系。
再排查,发现听云后台用户崩溃的日志显示的时间和用户反馈时录屏的时间不一致?会不会是修改了系统时间?但是系统时间修改会导致初始化AVAudioRecorder
崩溃吗?不报太大的希望,尝试后发现,Yohoo,修改时间后,初始化录音还真会崩溃。。。神奇,哈哈哈,这可不是我的错,赶紧再去找用户
再去和用户沟通,用户反馈并没有修改时间,只是修改了日期显示从24小时制改为12小时制,what。。。难道。。。。赶紧再去验证,果然设置12小时制会导致崩溃。。。Why?日期格式yyyyMMdd_HHmmss
可以兼容12小时没错,但是返回的字符串时20220829_上午104030
,里面会有中文,而用这个中文去生成NSURL时,生成的就是nil,然后nil取初始化AVAudioRecorder
就导致了崩溃。。。😭还是我的锅,不多说了,赶紧修改