2015-04-08 28 views
15

Es scheint wie sehr breit, eine Frage zu stellen, aber das ist sehr ärgerlich und schwierig, den Fehler zu beheben.iPhone app stürzt auf WebThread ab MPVolumeSlider

Hier ist das Absturzprotokoll für WebThread, das ich von Crashlytics erhalten habe.

Thread : Crashed: WebThread 
0 libobjc.A.dylib    0x0000000193e97bd0 objc_msgSend + 16 
1 UIKit       0x0000000187f65dd8 +[UIViewAnimationState popAnimationState] + 332 
2 MediaPlayer     0x0000000185953358 -[MPVolumeSlider volumeController:volumeValueDidChange:] + 92 
3 MediaPlayer     0x00000001859c5fc4 -[MPVolumeController updateVolumeValue] + 260 
4 MediaPlayer     0x0000000185952cb0 -[MPVolumeSlider didMoveToSuperview] + 144 
5 UIKit       0x0000000187f2c1dc -[UIView(Hierarchy) _postMovedFromSuperview:] + 484 
6 UIKit       0x0000000187f37cbc -[UIView(Internal) _addSubview:positioned:relativeTo:] + 1764 
7 MediaPlayer     0x0000000185955f54 -[MPVolumeView _createSubviews] + 264 
8 MediaPlayer     0x00000001859549d4 -[MPVolumeView _initWithStyle:] + 240 
9 MediaPlayer     0x0000000185954a60 -[MPVolumeView initWithFrame:style:] + 88 
10 WebCore      0x0000000191ba4684 -[WebMediaSessionHelper initWithCallback:] + 132 
11 WebCore      0x0000000191ba3db8 WebCore::MediaSessionManageriOS::MediaSessionManageriOS() + 96 
12 WebCore      0x0000000191ba3d28 WebCore::MediaSessionManager::sharedManager() + 56 
13 WebCore      0x0000000191ba2890 WebCore::MediaSession::MediaSession(WebCore::MediaSessionClient&) + 44 
14 WebCore      0x00000001916e8604 WebCore::HTMLMediaSession::create(WebCore::MediaSessionClient&) + 36 
15 WebCore      0x00000001916d0fb0 WebCore::HTMLMediaElement::HTMLMediaElement(WebCore::QualifiedName const&, WebCore::Document&, bool) + 1100 
16 WebCore      0x000000019170a2b4 WebCore::HTMLVideoElement::create(WebCore::QualifiedName const&, WebCore::Document&, bool) + 68 
17 WebCore      0x00000001916bdd9c WebCore::videoConstructor(WebCore::QualifiedName const&, WebCore::Document&, WebCore::HTMLFormElement*, bool) + 92 

ich nie diese Art von Absturz während der Entwicklung zu sehen (ich würde sehr glücklich sein, wenn ich es mit Breakpoint und Konsolenprotokoll fangen), scheint aber nur für Benutzer, wenn er auf Spannung.

Kann nur von crawlytics gemeldet werden.

Mögliche Ursache;

App verwendet MagicalRecord und erhalten Daten vom Server im Hintergrund beim Start. Dies verwendet Multi-Thread, und wenn Webkit UIKit Teil und Sperren verwendet, scheint ein anderer Haupt-Thread wie Zugriff darauf. Also habe ich versucht, alle dispatch_sync zu entfernen und änderte es in dispatch_async, aber die Abstürze passiert wieder nach ein paar funktionelle Anrufe.

Ich möchte wissen, warum WebCore ausgeführt wird, und ich habe nie MPVolumeController auf UIWebView angefordert.

Auch sie können aus irgendeinem Grund auf Hintergrund laufen, warum stürzt es ab? Es passiert häufig und Benutzer Beschwerde.

Haben andere dasselbe Problem?

+0

Hier gilt das gleiche ... Es ist meine häufigste Crash und es begann in iOS 8. Ich verbrachte Tage erscheinen nach einer Lösung gesucht, ohne Erfolg .... – cujo30227

+0

Sehen Sie auch, sehen Sie nichts auf Apples Dev-Foren oder etwas anderes. – bpapa

+0

Fragen, ob der Wechsel von UIWebView zu WKWebView helfen würde, aber noch nicht ausprobiert. – bpapa

Antwort

2

Dieser Fehler aufgetreten seit iOS 8.

UIWebView, die HTML enthalten audio oder video Elemente lädt zufällig abstürzen.

ich es wie folgt festgelegt:

@interface H5WebKitBugsManager : NSObject 

+ (void)fixAllBugs; 

@end 


#import "H5WebKitBugsManager.h" 
#import <objc/runtime.h> 

void H5Swizzle(Class c, SEL orig, SEL new) 
{ 
    Method origMethod = class_getInstanceMethod(c, orig); 
    Method newMethod = class_getInstanceMethod(c, new); 
    if(class_addMethod(c, orig, method_getImplementation(newMethod), method_getTypeEncoding(newMethod))) { 
     class_replaceMethod(c, new, method_getImplementation(origMethod), method_getTypeEncoding(origMethod)); 
    } else { 
     method_exchangeImplementations(origMethod, newMethod); 
    } 
} 

@implementation H5WebKitBugsManager 

+ (void)fixAllBugs 
{ 
    [self fixBug_MediaPlayerVolumeView]; 
} 

+ (void)fixBug_MediaPlayerVolumeView 
{ 
    CGFloat systemVersion = [UIDevice currentDevice].systemVersion.floatValue; 

    if (systemVersion < 8.0f || systemVersion > 9.1) { 
    // below ios version 8.0 has no VolumeView 
     return; 
    } 

    Class cls = NSClassFromString(@"WebMediaSessionHelper"); 
    NSString *allocateVolumeView = @"allocateVolumeView"; 
    SEL orig = NSSelectorFromString(allocateVolumeView); 
    SEL new = @selector(H5WKBMAllocateVolumeView); 
    Method newMethod = class_getInstanceMethod(self, new); 

    if(class_addMethod(cls, new, method_getImplementation(newMethod), method_getTypeEncoding(newMethod))) { 
     H5Swizzle(cls, orig, new); 
    } 
} 

- (void)H5WKBMAllocateVolumeView 
{ 
    // WebKit's MediaSessionManageriOS is a singleton,in MediaSessionManageriOS.m. svn version181,859. 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
      // must be dispatch in background thread 
      [self H5WKBMAllocateVolumeView]; 
     }); 
    }); 
} 

@end 
+0

Es scheint, 'MPVolumeView'' alloc' 'init' in BG-Thread verursacht das Problem. 'allocateVolumeView' bereits in WebThread (bg thread). – ooops

Verwandte Themen