2011-02-17 201 views
6

在我们的iPad应用程序内,我们使用的是一个UIWebView从一些其中的一个领域与hml5视频加载不同的网站。 没有视频的网站可以完美加载。但是当我加载一个包含htmlt5-video的网站时,有时我的应用程序 会在UIWebView的加载过程中使用EXC_BAD_ACCESS崩溃,有时它不会。每当发生这样的崩溃时,似乎都发生在将视频播放器添加到站点的时刻。UIWebView中加载HTML5视频EXC_BAD_ACCESS崩溃

我没有下载从苹果的UICatalog-例,只是没有更改WebViewController-类的默认网址将网站方含HTML5视频的URL。相同的结果...有时会崩溃有时不会崩溃。

我也没有创建Xcode的一个新项目(基于视图的应用程序 - 为iPad),只有做一个UIWebView添加到新项目的ViewController。再次...加载包含html5视频的网站有时会导致崩溃,有时甚至不会。

CODE FROM “新的项目” 的ViewController(实施):

- (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 FROM “新的项目” 的ViewController(HEADER):

@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 

有人可以给我一个想法吗?

在此先感谢,Florian

回答

0

我有完全相同的问题。还没有答案。看到很多人报告类似的问题 - 仅限iOS 4.2.1。

基本上,我有一个UIView控制器与网页视图作为其子视图中,并加载一个URLRequest到YouTube连结。

我第一次加载viewController时,控制台记录错误“Unable to read symbols for /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 2011-02-18 09:37:56

+0

解决@Florian你是对的!问题通过升级到iOS 4.3的Xcode 3.2.6解决。我推迟了两个星期的应用升级,等待这个...... – 2011-03-07 01:56:59

2

有一个小窍门,以覆盖此崩溃。如果您在加载视频内容之前轻轻地滚动webview,则可以避免崩溃。在从代码中尝试出来之前,尝试用手指在设备上滚动一下webView。它现在不会崩溃。

在代码中,做这样的事情:

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

到通过JavaScript的网页视图模拟滚动。滚动值可以低至1,所以用户根本不会注意到滚动。

1

告诉web视图,以评估对webViewDidFinishLoad任何JavaScript(或根本没有):似乎工作(虽然哈克)。

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

感谢您的支持!在我的情况下,它仅适用于在iPad上

不同相当高的偏移值,纵向和横向模式

(人像模式:大于60;景观模式:大于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--; 
} 

但是通过这个解决方案,我的应用在网站加载过程中通过双击缩放来缩小。

我做了子类的UIWebView来解决这个问题(防止web视图缩放从加载时):

.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 INIT loadCounter)

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

我似乎已经解决了这个问题... 我已经感动了所有的HTML 5视频标签插入Javascript中

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

而且我在我的情况下调用JS在[UIWebView的didFinishLoad]

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

完美的作品。 其他建议没有为我工作。