2011-02-17 2 views
6

우리의 iPad-App에서는 하나의 도메인에서 hml5- 비디오로 다른 사이트를로드하기 위해 UIWebView를 사용하고 있습니다. 동영상이없는 사이트는 완벽하게로드됩니다. 하지만 htmlt5- 비디오가 포함 된 사이트를로드 할 때 가끔 내 앱 이 (가) EXC_BAD_ACCESS가있는 UIWebView로드 프로세스 중에 충돌하며 때로는 그렇지 않습니다. 이러한 충돌이 발생할 때마다 비디오 플레이어가 사이트에 추가되는 시점에 발생하는 것으로 보입니다.UIWebView 로딩 html5- 비디오 EXC_BAD_ACCESS 충돌

Apple에서 UICatalog-Example을 다운로드했고 WebViewController-Class의 Default-URL을 html5- 비디오가있는 사이트의 URL로 변경했습니다. 같은 결과가 때때로 충돌하는 경우도 있습니다.

또한 Xcode (iPad 용보기 기반 응용 프로그램)에서 새 프로젝트를 만들고 새 프로젝트 ViewController에만 UIWebView를 추가했습니다. 다시 ... html5- 비디오가 포함 된 사이트를로드하면 가끔씩 충돌이 발생하는 경우가 있습니다. "NEW PROJECTS"의 ViewController (IMPLEMENTATION) FROM

CODE :

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

@property (nonatomic, retain) UIWebView *myWebView; 

기기 로그 :

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 

"NEW PROJECTS"의 ViewController (HEADER) FROM

- (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]; 
} 

CODE 아무도 내게 아이디어를 줄 수 있습니까?

미리 감사드립니다. Florian

답변

0

나는 정확히 같은 문제가 있습니다. 아직 대답이 없습니다. 많은 사람들이 iOS 4.2.1과 유사한 문제를보고합니다.

기본적으로, 나는 하위보기로 webview가있는 UIView 컨트롤러가 있고 YouTube 링크에 URLRequest를로드합니다.

처음으로 viewController를로드 할 때 콘솔에 "/Developer/Platforms/iPhoneOS.platform/DeviceSupport/4.2.1 (8C148)/Symbols/System/Library/Internet Plug-Ins에 대한 기호를 읽을 수 없습니다/QuickTime Plugin.webplugin/QuickTime Plugin (파일을 찾을 수 없음). " 나는로드를 멈추고 viewController를 놓습니다. 두 번째로 해당 youtube 링크에 동일한 요청으로 새로운 viewController를 다시로드합니다. 이제 앱이 EXC_BAD_ACCESS와 충돌했습니다.

+0

iOS 4.2.1에서는 실제로 문제가있는 것으로 보입니다. iOS 3.2.2를 사용한 테스트는 문제가되지 않습니다. 다음 iOS 4.3에 대한 출시 노트를 읽으십시오 : "웹 - 특정 무거운 웹 사이트를로드 한 후 Safari 및 기타 응용 프로그램을 중단시키는 문제가 수정되었습니다." 아마도 문제는 iOS 4.3 – Florian

+0

@Florian으로 해결할 수 있습니다! iOS 4.3 용 Xcode 3.2.6으로 업그레이드하여 해결 된 문제. 나는 이것을 기다리기 위해 2 주간 앱 업그레이드를 연기했다 ... –

+2

오, 내 실수로, 아이폰 OS 4.3에 대한 Xcode 3.2.6에서 해결되지 않았다. 단지 내가 전에 드래그하기에는 너무 흥분했기 때문이다. Srijith Vijayamohan이 제안한대로로드됩니다. 나는 Srijith Vijayamohan의 제안을 통해 마침내 문제를 해결했다. 감사. –

2

이 트 래픽을 무시하려면 약간의 트릭이 있습니다. 동영상 콘텐츠가로드되기 바로 전에 웹보기를 약간 스크롤하면 충돌을 피할 수 있습니다. 코드에서 시도하기 전에 손가락으로 장치에있는 webView를 스크롤 해보십시오. 그것은 지금 추락하지 않을 것이다.

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

자바 스크립트를 통해 웹보기에 스크롤을 시뮬레이션 : 코드에서

,이 같은 뭔가. 스크롤 값은 1만큼 낮을 수 있으므로 사용자는 스크롤을 전혀 알지 못합니다.

1

webViewDidFinishLoad에서 자바 스크립트를 평가하기 위해 웹뷰를 알려주거나 전혀 작동하지 않는 것 같습니다 (해킹 임에도 불구하고).

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

감사합니다.(:; : 이상 780 풍경 모드보다 큰 60 세로 모드) :

- (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--; 
} 
내 경우 만 아이 패드

에 Portrait- 및 가로 모드에 대해 서로 다른 매우 높은 오프셋 값

와 함께 작동

하지만이 솔루션을 사용하면 사이트의 로딩 과정에서 확대/축소를 두 번 탭하여 응용 프로그램이 충돌합니다.

나는 (로드하는 동안 줌에서 웹보기를 방지하기 위해)이 문제를 해결하기 위해 서브 클래스의 UIWebView을했다 :

.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; 

그리고 마지막 "didFinish"울어을 결정하고 이중 도청 가능성을 활성화하기 위해 카운터를 추가 (0으로 초기화 loadCounter)

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

내가이 문제를 해결 한 것 같다 ... 은 내가

0 자바 스크립트의 모든 HTML-5의 비디오 태그 삽입을 이동 한
function placeVideoTag() { 
    var val = '<video />'; 
    var el = document.getElementById('video-id'); 
    el.innerHTML = val; 
} 

그리고 난 내 경우에는

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

작품 완벽하게 [UIWebView에서 didFinishLoad]에 JS를 호출하고 있습니다. 다른 제안이 저에게 효과적이지 않았습니다.

+0

이것은 iOS 8.1.3에서 나에게 동일한 문제를 해결했습니다 !!! 동영상 태그를 추가하면 내 앱이 다운되었으므로 이제 placeVideoTag를 호출하면 앱이 더 이상 중단되지 않습니다. 이런 종류의 회귀를 믿을 수 있습니다. 내 모든 문제는 이것과 동일합니다 : [http://stackoverflow.com/questions/26656342/uiwebview-random-crash-at-uiviewanimationstate-release-message-sent-to-deallo](http://stackoverflow.com/ 질문/26656342/uiwebview-random-crash-at-uiviewanimationstate-release-message-sent-to-deallo) –