UIWebView загрузка html5-видео EXC_BAD_ACCESS сбой - PullRequest
7 голосов
/ 17 февраля 2011

в нашем iPad-приложении мы используем UIWebView для загрузки разных сайтов из одного домена, некоторые из них с hml5-Video. Сайты без видео загружаются отлично. Но когда я загружаю сайт, содержащий htmlt5-видео, иногда мое приложение происходит сбой во время процесса загрузки UIWebView с EXC_BAD_ACCESS, а иногда нет. Каждый раз, когда происходит такой сбой, кажется, что это происходит в тот момент, когда Video-Player добавляется на сайт.

Я загрузил UICatalog-Example от Apple и просто изменил Default-URL в WebViewController-Class на URL сайта, связанного с html5-video. Те же результаты ... иногда сбой иногда сбой.

Я также создал новый проект на XCode (приложение на основе View - для iPad) и только добавил UIWebView в новый Projects ViewController. Опять же ... загрузка сайта, содержащего html5-видео, иногда приводит к сбою, а иногда нет.

КОД ОТ ПРОСМОТРА НОВЫХ ПРОЕКТОВ (РЕАЛИЗАЦИЯ):

- (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

Кто-нибудь может дать мне идею?

Заранее спасибо, Флориан

Ответы [ 5 ]

2 голосов
/ 24 февраля 2011

Есть небольшая хитрость, чтобы преодолеть эту аварию.Если вы слегка прокрутите веб-просмотр непосредственно перед загрузкой видеоконтента, сбоя можно избежать.Прежде чем попробовать это из кода, попробуйте немного прокрутить веб-вид на устройстве пальцем.Это не рухнет сейчас.

В коде сделайте что-то вроде этого:

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

, чтобы имитировать прокрутку веб-просмотра через JavaScriptЗначение прокрутки может быть всего 1, поэтому пользователь вообще не заметит прокрутку.

1 голос
/ 11 мая 2011

Кажется, я решил эту проблему ... Я переместил вставку всех тегов видео 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()"];
}

Отлично работает в моем случае.Другие предложения не сработали для меня.

1 голос
/ 28 февраля 2011

Указание веб-представлению оценить любой JavaScript (или его вообще нет) на webViewDidFinishLoad: кажется, работает (хотя и хакерский).

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
  [webView stringByEvaluatingJavaScriptFromString:@""];
}
0 голосов
/ 02 марта 2011

Спасибо за ваши сообщения !!!В моем случае он работает только с разными довольно высокими значениями смещения для Портретного и Ландшафтного режима на 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 для решения этой проблемы (чтобы предотвратить масштабирование веб-вида во время загрузки):

.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++;
}
0 голосов
/ 18 февраля 2011

У меня точно такая же проблема.пока нет ответа.Видел, что многие другие сообщали о подобных проблемах - только iOS 4.2.1.

По сути, у меня есть UIView Controller с веб-представлением в качестве его подпредставления, и я загружаю URLRequest на ссылку на YouTube.

ПервыйКогда я загружаю viewController, в консоли регистрируется ошибка «Невозможно прочитать символы для /Developer/Platforms/iPhoneOS.platform/DeviceSupport/4.2.1 (8C148) / Symbols / System / Library / Internet Plug-Ins / QuickTime Plugin.webplugin /Плагин QuickTime (файл не найден). "Я прекращаю загрузку и выпускаю viewController.Во второй раз, когда я перезагружаю новый viewController с тем же запросом на эту ссылку на YouTube, теперь происходит сбой приложения с EXC_BAD_ACCESS

...