2015-04-08 14 views
15

Sembra molto ampio fare una domanda, ma questo è molto fastidioso e difficile da correggere.L'app iPhone si blocca su WebThread MPVolumeSlider

Ecco il registro di arresto anomalo per WebThread che ho ricevuto da 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 

ho mai visto questo tipo di incidente durante lo sviluppo (Sarei molto felice quando posso prenderlo con punto di interruzione e log della console), ma appare solo per gli utenti quando è in tensione.

Può essere segnalato solo da crashlytics.

Possibile motivo;

L'app utilizza MagicalRecord e riceve dati dal server in background all'avvio. Questo utilizza il multi-thread e quando webkit usa la parte UIKit e il blocco, un altro thread principale sembra accedervi. Quindi ho provato a rimuovere tutto dispatch_sync e l'ho cambiato in dispatch_async ma gli arresti anomali si ripetono dopo aver effettuato alcune chiamate funzionali.

Quello che voglio sapere è, perché WebCore è in esecuzione, e non ho mai richiesto MPVolumeController su UIWebView.

Anche se possono funzionare sullo sfondo per qualche motivo, perché si blocca? Si sta verificando frequentemente e il reclamo degli utenti.

Altri hanno lo stesso problema?

+0

Stesso qui ... E 'il mio incidente più frequente ed ha cominciato a comparire in iOS 8. Ho passato giorni alla ricerca di una soluzione, senza alcun risultato .... – cujo30227

+0

Visto anche, non vedi nulla sui forum di sviluppo di Apple o qualsiasi altra cosa. – bpapa

+0

Chiedere se passare da UIWebView a WKWebView sarebbe di aiuto, ma non l'ha ancora provato. – bpapa

risposta

2

Questo errore si è verificato dopo IOS 8.

UIWebView che carica HTML contenente audio o video elementi verrà bloccarsi in modo casuale.

ho risolto in questo modo:

@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

Sembra che 'MPVolumeView'' alloc'' init' in bg thread causi il problema. 'allocateVolumeView' già in WebThread (bg thread). – ooops