Сбой iPhone при воспроизведении аудиофайла с использованием AVAudioPlayer и входящий вызов прерывает воспроизведение - PullRequest
1 голос
/ 10 января 2011

Я разработал приложение для iPhone, которое воспроизводит разные музыкальные файлы. Все работает нормально, кроме случаев, когда входящий телефонный звонок прерывает воспроизведение. Это приводит к сбою приложения со следующим журналом:

START CRASH LOG

Thread 0 Crashed:

0   libobjc.A.dylib                 0x32d98f20 objc_msgSend + 20
1   AVFoundation                    0x30739ddc AVAudioSessionPropertyListener(void*, unsigned long, unsigned long, void const*) + 284
2   AudioToolbox                    0x36d78bec SSServer_AudioSessionInterruptionListenerMessage + 316
3   AudioToolbox                    0x36d017bc _XAudioSessionInterruptionListenerMessage + 128
4   AudioToolbox                    0x36c68584 mshMIGPerform + 224
5   CoreFoundation                  0x3752f5c4 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 22
6   CoreFoundation                  0x3752f582 __CFRunLoopDoSource1 + 158
7   CoreFoundation                  0x3752182e __CFRunLoopRun + 574
8   CoreFoundation                  0x37521504 CFRunLoopRunSpecific + 220
9   CoreFoundation                  0x37521412 CFRunLoopRunInMode + 54
10  GraphicsServices                0x33e76d1c GSEventRunModal + 188
11  UIKit                           0x3591d574 -[UIApplication _run] + 580
12  UIKit                           0x3591a550 UIApplicationMain + 964

END CRASH LOG

Я сузил его до вызова метода applicationWillResignActive в делегате приложения, но я не могу понять это, потому что, если приложение переходит в фоновый режим (нажатием кнопки «Домой»), приложение работает правильно, происходит сбой только при получении телефонного звонка.

Строка, вызывающая сбой в методе applicationWillResignActive:

[navController popToRootViewControllerAnimated: NO]; // navController является экземпляром UINavigationController; Я использовал это утверждение для удаления всех контроллеров представления, и когда приложение возобновляет работу, я нажимаю первый контроллер представления, чтобы приложение запускалось с самого начала.

Кто-нибудь имеет представление, почему этот сбой происходит только при получении телефонного звонка?

1 Ответ

1 голос
/ 04 декабря 2012

Мы только что отслеживали очень похожую аварию.

Наши, как описано здесь:

https://github.com/mattgallagher/AudioStreamer/issues/6

В частности, MyAudioSessionInterruptionListener (или имя обратного вызова, переданного AudioSessionInitialize) и его inClientData нельзя изменить после регистрации, поэтому обратный вызов всегда должен делать что-то разумное, даже если базовый объект был освобожден.

Решение, предложенное для AudioStream, состоит в том, чтобы использовать статическую переменную и убедиться, что она указывает на объект, который в настоящее время заинтересован в обратном вызове, и никогда не указывает на освобожденный объект - важно не использовать inClientData.

...