2011-02-17 28 views
6

en nuestra aplicación iPad estamos usando un UIWebView para cargar diferentes sitios de un dominio, algunos de ellos con un hml5-Video. Los sitios sin video se cargan perfectamente. Pero cuando estoy cargando un sitio que contiene htmlt5-video a veces mi aplicación se cuelga durante el proceso de carga de UIWebView con EXC_BAD_ACCESS y otras veces no. Cada vez que se produce un bloqueo de este tipo, parece suceder en el punto donde se agrega el reproductor de video en el sitio.UIWebView cargando crash html5-Video EXC_BAD_ACCESS

He descargado el UICatalog-Example de Apple y simplemente cambié la URL predeterminada en WebViewController-Class a una URL de un sitio que contiene html5-video. Los mismos resultados ... a veces se cuelgan a veces sin chocar.

También creé un Nuevo Proyecto en Xcode (Aplicación basada en Vista - para iPad) y solo agregué un UIWebView al nuevo ViewController de Proyectos. De nuevo ... cargar un sitio que contiene html5-video algunas veces provoca un bloqueo y otras no.

CÓDIGO DE "NUEVOS proyectos" ViewController (implementación):

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.myWebView = [[[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 768, 1004)] autorelease]; 
    self.myWebView.backgroundColor = [UIColor whiteColor]; 
    self.myWebView.scalesPageToFit = YES; 
    self.myWebView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight); 
    self.myWebView.delegate = self; 
    [self.view addSubview: self.myWebView]; 

    [self.myWebView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.gelbeseiten.de/129103114849"]]]; 

    //More Sites with HTML5-Videos ... 
    //[self.myWebView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.gelbeseiten.de/129103746403"]]]; 
    //[self.myWebView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.gelbeseiten.de/129105233646"]]]; 
} 

- (void)viewDidUnload { 
    [super viewDidUnload]; 

    self.myWebView = nil; 
} 

- (void)viewWillDisappear:(BOOL)animated { 
    [self.myWebView stopLoading]; 
} 

- (void)dealloc { 
    myWebView.delegate = nil; 
    [myWebView release]; 

    [super dealloc]; 
} 

CÓDIGO DE "NUEVOS proyectos" ViewController (cabecera):

@interface WebViewTestViewController : UIViewController <UIWebViewDelegate> { 
    UIWebView *myWebView; 
} 

@property (nonatomic, retain) UIWebView *myWebView; 

registros del dispositivo:

Exception Type: EXC_BAD_ACCESS (SIGBUS) 
Exception Codes: KERN_PROTECTION_FAILURE at 0x00000098 
Crashed Thread: 0 

Thread 0 Crashed: 
0 WebCore       0x34c7d09e WebCore::RenderLayer::clippingRoot() const + 110 
1 WebCore       0x34c7cf2a WebCore::RenderLayer::childrenClipRect() const + 26 
2 WebCore       0x34c7ce0c WebCore::RenderWidget::setWidgetGeometry(WebCore::IntRect const&) + 40 
3 WebCore       0x34c5e0f8 WebCore::RenderWidget::updateWidgetPosition() + 320 
4 WebCore       0x34ba0170 WebCore::RenderView::updateWidgetPositions() + 144 
5 WebCore       0x34b97d16 WebCore::FrameView::performPostLayoutTasks() + 202 
6 WebCore       0x34b8a6c0 WebCore::FrameView::layout(bool) + 2116 
7 WebCore       0x34bc5244 WebCore::FrameView::forceLayout(bool) + 4 
8 WebKit       0x302c0c24 -[WebHTMLView layoutToMinimumPageWidth:height:maximumPageWidth:adjustingViewSize:] + 136 
9 WebKit       0x302c0b8e -[WebHTMLView layout] + 18 
10 WebKit       0x302c26f2 -[WebHTMLView(WebInternal) _layoutIfNeeded] + 50 
11 WebKit       0x302c2622 -[WebHTMLView(WebInternal) _web_layoutIfNeededRecursive] + 14 
12 WebKit       0x302c251e -[WebHTMLView(WebPrivate) viewWillDraw] + 50 
13 CoreFoundation     0x3581dfc0 -[NSObject(NSObject) performSelector:] + 12 
14 CoreFoundation     0x35826d4a -[NSArray makeObjectsPerformSelector:] + 382 
15 WebCore       0x34bb000c -[WAKView viewWillDraw] + 24 
16 CoreFoundation     0x3581dfc0 -[NSObject(NSObject) performSelector:] + 12 
17 CoreFoundation     0x35826d4a -[NSArray makeObjectsPerformSelector:] + 382 
18 WebCore       0x34bb000c -[WAKView viewWillDraw] + 24 
19 CoreFoundation     0x3581dfc0 -[NSObject(NSObject) performSelector:] + 12 
20 CoreFoundation     0x35826d4a -[NSArray makeObjectsPerformSelector:] + 382 
21 WebCore       0x34bb000c -[WAKView viewWillDraw] + 24 
22 CoreFoundation     0x3581dfc0 -[NSObject(NSObject) performSelector:] + 12 
23 CoreFoundation     0x35826d4a -[NSArray makeObjectsPerformSelector:] + 382 
24 WebCore       0x34bb000c -[WAKView viewWillDraw] + 24 
25 WebKit       0x302c24cc -[WebView(WebPrivate) viewWillDraw] + 56 
26 WebCore       0x34bafec0 WebCore::TileCache::prepareToDraw() + 36 
27 WebCore       0x34bafe6e -[TileLayer display] + 26 
28 QuartzCore      0x31079fb0 CALayerDisplayIfNeeded + 176 
29 QuartzCore      0x3106f56e CA::Context::commit_transaction(CA::Transaction*) + 214 
30 QuartzCore      0x3106f37c CA::Transaction::commit() + 184 
31 QuartzCore      0x31092f96 CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*) + 46 
32 CoreFoundation     0x3580ac52 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 10 
33 CoreFoundation     0x3580aac6 __CFRunLoopDoObservers + 406 
34 CoreFoundation     0x358020c4 __CFRunLoopRun + 848 
35 CoreFoundation     0x35801c80 CFRunLoopRunSpecific + 224 
36 CoreFoundation     0x35801b88 CFRunLoopRunInMode + 52 
37 GraphicsServices    0x320c84a4 GSEventRunModal + 108 
38 GraphicsServices    0x320c8550 GSEventRun + 56 
39 UIKit       0x341dc322 -[UIApplication _run] + 406 
40 UIKit       0x341d9e8c UIApplicationMain + 664 
41 WebViewTest      0x00002c24 0x1000 + 7204 
42 WebViewTest      0x00002bd8 0x1000 + 7128 

¿Alguien puede darme una idea?

Gracias de antemano, Florian

Respuesta

0

Tengo exactamente el mismo problema. sin respuesta aún. Vimos muchos otros informes de problemas similares - iOS 4.2.1 solamente.

Básicamente, tengo un controlador UIView con una vista web como subvista y cargo una URLRequest a un enlace de youtube.

La primera vez que cargo ViewController, la consola registra el error "No se pueden leer símbolos para /Developer/Platforms/iPhoneOS.platform/DeviceSupport/4.2.1 (8C148)/Symbols/System/Library/Internet Plug-Ins/QuickTime Plugin.webplugin/QuickTime Plugin (archivo no encontrado). ". Dejo de cargar y lanzo viewController. La segunda vez que vuelvo a cargar viewController con la misma solicitud a ese enlace de YouTube, ahora la aplicación se bloqueó con EXC_BAD_ACCESS

+0

Realmente parece ser un problema con iOS 4.2.1. Las pruebas con iOS 3.2.2 no dan problemas. Simplemente lea una Nota de publicación para el próximo iOS 4.3: "Web: problema resuelto que causó el bloqueo de Safari y otras aplicaciones después de cargar ciertos sitios web pesados". Probablemente el problema esté resuelto con iOS 4.3 – Florian

+0

@Florian ¡tienes razón! Problema resuelto al actualizar a Xcode 3.2.6 para iOS 4.3. He pospuesto la actualización de la aplicación durante dos semanas solo para esperar esto ... –

+2

Oh, error mío, no se resolvió en Xcode 3.2.6 para iOS 4.3 ... solo porque estaba demasiado emocionado como para arrastrarlo antes cargado, como lo sugirió Srijith Vijayamohan. Finalmente resolví el problema a través de la sugerencia de Srijith Vijayamohan. Gracias. –

2

Hay un pequeño truco para anular este bloqueo. Si desplaza ligeramente la vista web justo antes de que se cargue el contenido del video, se puede evitar el bloqueo. Antes de probarlo desde el código, intente desplazar el webView un poco en el dispositivo con el dedo. No se bloqueará ahora.

En el código, hacer algo como esto:

- (void)webViewDidFinishLoad:(UIWebView *)webView 
{ 
    [webView stringByEvaluatingJavaScriptFromString:@"window.scrollTo(0, 10);"]; 
} 

para simular un desplazamiento a la vista web a través de JavaScript. El valor de desplazamiento puede ser tan bajo como 1, por lo que el usuario no notará el desplazamiento en absoluto.

1

Diciendo a la vista web que evalúe cualquier JavaScript (o ninguno) en webViewDidFinishLoad: parece que funciona (aunque sea hacky).

- (void)webViewDidFinishLoad:(UIWebView *)webView 
{ 
    [webView stringByEvaluatingJavaScriptFromString:@""]; 
} 
0

Gracias, para sus publicaciones !!!En mi caso sólo funciona con diferentes valores de desplazamiento bastante alto para del retrato del paisaje y el modo en IPAD-

(Retrato-Mode: mayor de 60; Paisaje-Mode: superior a 780):

- (void)webViewDidFinishLoad:(UIWebView *)webView 
{ 
    if (self.interfaceOrientation == UIInterfaceOrientationPortrait || 
    self.interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) { 

     [webView stringByEvaluatingJavaScriptFromString:@"window.scrollTo(0, 60);"]; 
    } else if (self.interfaceOrientation == UIInterfaceOrientationLandscapeLeft || 
      self.interfaceOrientation == UIInterfaceOrientationLandscapeRight) { 

     [webView stringByEvaluatingJavaScriptFromString:@"window.scrollTo(0, 780);"]; 
    } 
    webView.loadCounter--; 
} 

Pero con esta solución, mi aplicación se bloquea al tocar dos veces para hacer zoom durante el proceso de carga de un sitio.

hice UIWebView subclase para resolver este problema (para prevenir la web View a partir zoom, mientras que la carga):

.m: 

@synthesize loadCounter; 

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    CGPoint p = currentPoint; 
    NSTimeInterval t = currentTimestamp; 
    currentPoint = point; 
    currentTimestamp = [event timestamp]; 

    if (CGPointEqualToPoint(p, point) && 
     [event timestamp] - t < 0.2 && loadCounter > 0){ 
     return self.superview; 
    } 

    return [super hitTest:point withEvent:event]; 
} 

.h: 

@interface NonDoubleTapableWhileLoadingWebView : UIWebView { 
    CGPoint currentPoint; 
    NSTimeInterval currentTimestamp; 

    NSInteger loadCounter; 
} 

@property (assign) NSInteger loadCounter; 

Y añade un contador para determinar el último -call "didFinish" y reactivar la posibilidad de una doble pulsación (loadCounter init con 0)

- (void)webViewDidStartLoad:(UIWebView *)webView { 
    linkWebView.loadCounter++; 
} 
1

Parece he resuelto este problema ... me he movido todo el HTML-5 etiquetas de vídeo inserción en Javascript

function placeVideoTag() { 
    var val = '<video />'; 
    var el = document.getElementById('video-id'); 
    el.innerHTML = val; 
} 

Y estoy llamando JS en [UIWebView didFinishLoad]

- (void)webViewDidFinishLoad:(UIWebView *)aWebView { 
    [aWebView stringByEvaluatingJavaScriptFromString:@"placeVideoTag()"]; 
} 

funciona perfectamente en mi caso. Otras sugerencias no me funcionaron.

+0

Esto resolvió el mismo problema para mí en iOS 8.1.3 !!! Agregar una etiqueta de video bloqueó mi aplicación, ahora simplemente llamo a placeVideoTag y la aplicación ya no se cuelga. Puede creer este tipo de regresión. Todos mis problemas eran idénticos a esto: [http://stackoverflow.com/questions/26656342/uiwebview-random-crash-at-uiviewanimationstate-release-message-sent-to-deallo](http://stackoverflow.com/ preguntas/26656342/uiwebview-random-crash-at-uiviewanimationstate-release-message-sent-to-deallo) –