soporte solo solas porque las desactivar cierran cierra bloqueo aplicaciones activacion abre ios objective-c iphone uiwebview

ios - solo - soporte iphone



La aplicación iPhone se bloquea en WebThread MPVolumeSlider (1)

Este error ocurrió desde iOS 8.

UIWebView que carga HTML que contiene elementos de audio o video se bloqueará aleatoriamente.

Lo arreglé así:

@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

Parece muy amplio hacer una pregunta, pero esto es muy molesto y difícil de arreglar el error.

Este es el registro de bloqueo de WebThread que obtuve de 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

Nunca he visto este tipo de bloqueo durante el desarrollo (estaría muy contento cuando pueda verlo con el breakpoint y el registro de la consola), pero solo aparece cuando los usuarios están en vivo.

Solo puede ser reportado por crashlytics.

Razón posible;

La aplicación utiliza MagicalRecord y obtiene datos del servidor en segundo plano cuando se inicia. Esto usa multi-thread, y cuando webkit está usando la parte UIKit y el bloqueo, otro hilo principal parece tener acceso a él. Así que he intentado eliminar todo dispatch_sync y lo cambié a dispatch_async, pero los bloqueos vuelven a ocurrir después de realizar algunas llamadas funcionales.

Lo que quiero saber es por qué WebCore se está ejecutando y nunca solicité MPVolumeController en UIWebView.

Incluso pueden funcionar en segundo plano por alguna razón, ¿por qué se bloquea? Está sucediendo con frecuencia y los usuarios se quejan.

¿Algún otro tiene el mismo problema?