2015-04-08 31 views
15

Wydaje się bardzo szerokie, aby zadać pytanie, ale jest to bardzo denerwujące i trudne do naprawienia błędu.iPhone app ulega awarii na WebThread MPVolumeSlider

Oto dziennik awarii dla WebThread, który dostałem od Crashlytics.

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 

Nigdy nie widziałem tego rodzaju awarii w trakcie rozwoju (Byłbym bardzo szczęśliwy, kiedy mogę złapać go z przerwania i dzienniku konsoli), ale pojawia się tylko do użytkowników, gdy jest na żywo.

Może być zgłaszane tylko przez crashlytics.

Możliwa przyczyna;

Aplikacja używa MagicalRecord i pobiera dane z serwera w tle po uruchomieniu. To wykorzystuje wielowątkowość, a gdy webkit używa części i blokowania UIKit, inny główny wątek wydaje się mieć do niego dostęp. Tak więc próbowałem usunąć wszystkie dispatch_sync i zmieniono je na dispatch_async, ale awarie zdarzają się ponownie po wykonaniu kilku wywołań funkcjonalnych.

Chciałbym wiedzieć, dlaczego WebCore działa, a ja nigdy nie zażądałem MPVolumeController na UIWebView.

Nawet z jakiegoś powodu mogą działać w tle, dlaczego się zawiesi? To się często zdarza, a użytkownicy skarżą się.

Czy inni mają ten sam problem?

+0

samo tutaj ... To moja najczęstszą trzask i zaczęły pojawiać się w iOS 8. spędziłem dzień szuka rozwiązania, bezskutecznie .... – cujo30227

+0

Widząc również, nie widzisz niczego na forach deweloperów Apple ani nic innego. – bpapa

+0

Zastanawiasz się, czy przejście z UIWebView na WKWebView pomogłoby, ale jeszcze go nie wypróbowałem. – bpapa

Odpowiedz

2

Ten błąd wystąpił, ponieważ iOS 8.

UIWebView, który ładuje HTML zawierający audio lub video elementy padnie losowo.

naprawiłem to tak:

@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

Wydaje się, że 'MPVolumeView'' alloc' 'init' w wątku bg powoduje problem. 'allocateVolumeView' już w WebThread (wątek bg). – ooops

Powiązane problemy