2011-01-10 12 views
1

Ich habe eine iPhone-Anwendung entwickelt, die verschiedene Musikdateien abspielt. Alles funktioniert gut, außer wenn ein eingehender Anruf die Wiedergabe unterbricht. Das stürzt die App mit dem folgenden Protokoll:iPhone Absturz beim Abspielen von Audiodateien mit AVAudioPlayer und eingehende Anrufe unterbricht die Wiedergabe

START Crashlog

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 Crashlog

Ich habe es verengt in der applicationWillResignActive Methode in der AppDelegate auf einen Anruf nach unten, aber ich kann Es scheint nicht zu funktionieren, denn wenn die App in den Hintergrundmodus wechselt (durch Drücken der Home-Taste), funktioniert die App korrekt. Sie stürzt nur ab, wenn ein Telefonanruf eingeht.

Die Linie, die den Absturz in der applicationWillResignActive Methode verursacht ist:

[NavController popToRootViewControllerAnimated: NO]; // navController ist eine Instanz von UINavigationController; Ich habe diese Anweisung verwendet, um alle View-Controller zu entfernen, und wenn die App fortgesetzt wird, schiebe ich den ersten View-Controller, damit die App von Anfang an startet.

Hat jemand eine Idee, warum dieser Absturz nur auftritt, wenn ein Telefonanruf empfangen wird?

+1

Haben Sie gelöst? – user370773

Antwort

1

Wir haben gerade einen sehr ähnlichen Absturz verfolgt.

Ours entpuppen, wie hier beschrieben werden:

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

Insbesondere MyAudioSessionInterruptionListener (oder der Name des Rückruf AudioSessionInitialize bestanden) und es ist inClientData nicht geändert werden kann, nachdem es registriert worden ist, Daher muss der Callback immer etwas Sinnvolles tun, auch wenn das zugrunde liegende Objekt freigegeben wurde. Die vorgeschlagene Lösung für AudioStream besteht darin, eine statische Variable zu verwenden und sicherzustellen, dass sie auf das Objekt verweist, das derzeit an dem Rückruf interessiert ist, und niemals auf ein freigegebenes Objekt zeigt. Wichtig ist, dass inClientData nicht verwendet wird.

Verwandte Themen