我们从应用收到了一些崩溃报告。它们看起来都很相似。调用[AVAudioSession currentRoute]位于每个崩溃堆栈的顶部:
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Subtype: KERN_INVALID_ADDRESS at 0x0000000c0b25beb8
Termination Signal: Segmentation fault: 11
Termination Reason: Namespace SIGNAL, Code 0xb
Terminating Process: exc handler [0]
Triggered by Thread: 14
...
Thread 14 name:
Thread 14 Crashed:
0 libobjc.A.dylib objc_msgSend + 16
1 AVFAudio -[AVAudioSession currentRoute] + 140 (AVAudioSession.mm:1715)
...
我们发现崩溃发生在AVAudioSessionRouteChangeNotification通知的处理程序中。在这个处理程序中,我们在自定义串行队列上发布异步调用,我们获取当前路由并枚举所有输出。
- (instancetype)init
{
if (self = [super init])
{
_commandsQueue = dispatch_queue_create("com.app.commandsQueue", DISPATCH_QUEUE_SERIAL);
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleRouteChanged:)
name:AVAudioSessionRouteChangeNotification
object:nil];
}
return self;
}
- (void)handleRouteChanged:(NSNotification *)notification
{
dispatch_async(self.commandsQueue, ^{
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
AVAudioSessionRouteDescription* currentRoute = audioSession.currentRoute;
for (AVAudioSessionPortDescription *outputPort in currentRoute.outputs)
{
if ([outputPort.portType isEqualToString:AVAudioSessionPortAirPlay])
{
// updating dictionary with status
}
}
});
}
我们无法重现该问题,我们不知道确切的情况。我们在不同的路线变化情景中玩了很多,但我们没有观察到崩溃。 有没有人知道这次崩溃的任何可能的根本原因?