【问题标题】:UIWebView loading html5-Video EXC_BAD_ACCESS crashUIWebView 加载 html5-Video EXC_BAD_ACCESS 崩溃
【发布时间】:2011-06-29 00:16:15
【问题描述】:

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

我确实从 Apple 下载了 UICatalog-Example,只是将 WebViewController-Class 中的 Default-URL 更改为包含 html5-video 的站点的 URL。同样的结果......有时会崩溃有时不会崩溃。

我还在 Xcode 上创建了一个新项目(基于视图的应用程序 - 适用于 iPad),并且只将 UIWebView 添加到新的项目 ViewController 中。再次...加载包含 html5-video 的网站有时会导致崩溃,有时不会。

来自“新项目”视图控制器的代码(实现):

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

来自“新项目”视图控制器(标题)的代码:

@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

谁能给我一个想法?

提前致谢,弗洛里安

【问题讨论】:

    标签: iphone objective-c uiwebview exc-bad-access html5-video


    【解决方案1】:

    有一个小技巧可以覆盖这个崩溃。如果在加载视频内容之前稍微滚动 webview,可以避免崩溃。在从代码中尝试之前,请尝试用手指在设备上稍微滚动一下 webView。现在不会崩溃了。

    在代码中,执行如下操作:

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

    通过javascript模拟webview上的滚动。滚动值可以低至 1,因此用户根本不会注意到滚动。

    【讨论】:

      【解决方案2】:

      告诉 webview 评估 webViewDidFinishLoad 上的任何 JavaScript(或根本不评估任何 JavaScript):似乎可行(尽管很老套)。

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

      【讨论】:

        【解决方案3】:

        看来我已经解决了这个问题... 我已经在 J​​avascript 中移动了所有 HTML-5 视频标签插入

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

        我在 [UIWebView didFinishLoad]

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

        在我的情况下完美运行。 其他建议对我不起作用。

        【讨论】:

        【解决方案4】:

        我也有同样的问题。还没有答案。看到许多其他人报告了类似的问题 - 仅限 iOS 4.2.1。

        基本上,我有一个 UIView 控制器,其子视图为 webview,并将 URLRequest 加载到 youtube 链接。

        第一次加载 viewController 时,控制台记录错误“无法读取 /Developer/Platforms/iPhoneOS.platform/DeviceSupport/4.2.1 (8C148)/Symbols/System/Library/Internet Plug-Ins/ 的符号” QuickTime Plugin.webplugin/QuickTime 插件(未找到文件)。”。我停止加载并释放 viewController。我第二次使用对该 youtube 链接的相同请求重新加载新的 viewController,现在应用程序因 EXC_BAD_ACCESS 而崩溃

        【讨论】:

        • 看来确实是iOS 4.2.1的问题。使用 iOS 3.2.2 进行的测试没有问题。只需阅读下一个 iOS 4.3 的发行说明:“Web - 修复了导致 Safari 和其他应用程序在加载某些繁重的网站后崩溃的问题。”可能问题已通过 iOS 4.3 解决
        • @Florian 你是对的!通过升级到适用于 iOS 4.3 的 Xcode 3.2.6 解决了问题。我已经将应用升级推迟了两周,只是为了等待这个......
        • 哦,我的错,它在 Xcode 3.2.6 for iOS 4.3 中没有解决……只是因为我太兴奋了,在加载之前无法拖动它,正如 Srijith Vijayamohan 所建议的那样。我终于通过 Srijith Vijayamohan 的建议解决了这个问题。谢谢。
        【解决方案5】:

        谢谢你的帖子!!!就我而言,它仅适用于 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 的子类来解决这个问题(防止 webView 在加载时缩放):

        .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”调用并重新激活双击的可能性 (init loadCounter 为 0)

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

        【讨论】:

          猜你喜欢
          • 2010-11-18
          • 1970-01-01
          • 1970-01-01
          • 2012-12-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-24
          相关资源
          最近更新 更多