2011-02-17 9 views
6

हमारे आईपैड-ऐप में हम एक डोमेन से अलग-अलग साइटों को लोड करने के लिए UIWebView का उपयोग कर रहे हैं जिनमें से कुछ एचएमएल 5-वीडियो के साथ हैं। वीडियो के बिना साइट पूरी तरह लोड हो जाती है। लेकिन जब मैं htmlt5-video वाली साइट लोड कर रहा हूं, तो कभी-कभी मेरा ऐप UICebView की लोडिंग-प्रक्रिया के दौरान EXC_BAD_ACCESS के साथ क्रैश होता है और कभी-कभी ऐसा नहीं होता है। जब भी ऐसा दुर्घटना होती है तो ऐसा लगता है कि उस समय वीडियो प्लेयर को साइट में जोड़ा गया है।UIWebView लोडिंग एचटीएमएल 5-वीडियो EXC_BAD_ACCESS क्रैश

मैंने ऐप्पल से यूआईसीटेल-उदाहरण डाउनलोड किया था और वेबव्यू कंट्रोलर-क्लास में डिफ़ॉल्ट-यूआरएल को एचटीएमएल 5-वीडियो containg साइट के यूआरएल में बदल दिया था। वही परिणाम ... कभी-कभी क्रैश कभी-कभी कोई दुर्घटना नहीं होती है।

मैंने एक्सकोड (व्यू-आधारित एप्लिकेशन - आईपैड के लिए) पर एक नई परियोजना भी बनाई है और केवल नए प्रोजेक्ट व्यू कंट्रोलर में UIWebView जोड़ दिया है। दोबारा ... एचटीएमएल 5-वीडियो वाली साइट लोड करना कभी-कभी दुर्घटना की ओर जाता है और कभी-कभी नहीं।

से "नया परियोजनाओं" ViewController (कार्यान्वयन) कोड:

@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 

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

से "नया परियोजनाओं" ViewController (हेडर) कोड क्या कोई मुझे एक विचार दे सकता है?

अग्रिम धन्यवाद, फ्लोरियन

उत्तर

0

मैं बिल्कुल वैसा ही समस्या है। अभी तक कोई जवाब नहीं है। कई अन्य लोगों ने इसी तरह की समस्याओं की रिपोर्ट की - आईओएस 4.2.1 केवल।

असल में, मेरे पास एक यूवीव्यू कंट्रोलर है जो वेबव्यू के साथ इसके सबव्यूव के रूप में है, और एक यूट्यूब लिंक पर URLRequest लोड करता है।

पहली बार जब मैं व्यू कंट्रोलर लोड करता हूं, तो कंसोल लॉग त्रुटि करता है "/ डेवलपर/प्लेटफार्म/iPhoneOS.platform/DeviceSupport/4.2.1 (8C148)/सिंबल/सिस्टम/लाइब्रेरी/इंटरनेट प्लग-इन के लिए प्रतीकों को पढ़ने में असमर्थ/क्विकटाइम प्लगइन.वेबप्लगिन/क्विकटाइम प्लगइन (फ़ाइल नहीं मिली)। "। मैं लोड कंट्रोलर को लोड करना और रिलीज़ करना बंद कर देता हूं। दूसरी बार जब मैं यूट्यूब लिंक के उसी अनुरोध के साथ नया व्यू कंट्रोलर फिर से लोड करता हूं, अब ऐप EXC_BAD_ACCESS

+0

यह वास्तव में आईओएस 4.2.1 के साथ एक समस्या प्रतीत होता है। आईओएस 3.2.2 के साथ टेस्ट एक समस्या नहीं देते हैं। अगले आईओएस 4.3 के लिए बस रिलीज-नोट पढ़ें: "वेब - निश्चित समस्या जो कुछ भारी वेबसाइटों को लोड करने के बाद सफारी और अन्य ऐप्स को क्रैश कर देती है।" शायद समस्या आईओएस 4.3 – Florian

+0

@ फ्लोरियन के साथ हल हो गई है आप सही हैं! आईओएस 4.3 के लिए एक्सकोड 3.2.6 में अपग्रेड करके समस्या हल हो गई। मैंने ऐप अपग्रेड को सिर्फ दो सप्ताह के लिए स्थगित कर दिया है ... –

+2

ओह, मेरी गलती, इसे आईओएस 4.3 के लिए एक्सकोड 3.2.6 में हल नहीं किया गया था ... सिर्फ इसलिए कि मैं इसे खींचने के लिए बहुत उत्साहित था श्रीजीथ विजयमोहन द्वारा सुझाए गए अनुसार लोड किया गया। अंततः श्रीजीत विजयमोहन के सुझाव के माध्यम से समस्या का समाधान किया। धन्यवाद। –

2

इस क्रैश को ओवरराइड करने के लिए एक छोटी सी चाल है। अगर आप वीडियो सामग्री लोड होने से ठीक पहले वेबव्यू को स्क्रॉल करते हैं, तो दुर्घटना से बचा जा सकता है। कोड से इसे आज़माने से पहले, वेब पर स्क्रॉल करने का प्रयास करें अपनी अंगुली से डिवाइस पर थोड़ा सा देखें। यह अब दुर्घटनाग्रस्त नहीं होगा।

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

जावास्क्रिप्ट के माध्यम से वेब दृश्य पर एक स्क्रॉल अनुकरण करने के लिए:

कोड में, कुछ इस तरह से करते हैं। स्क्रॉल मान 1 जितना कम हो सकता है, इसलिए उपयोगकर्ता स्क्रॉल को बिल्कुल नहीं देख पाएगा।

1

वेबव्यूडिडफिनिश लोड पर किसी भी जावास्क्रिप्ट (या बिल्कुल भी नहीं) का मूल्यांकन करने के लिए वेबव्यू को बताते हुए: काम लगता है (हालांकि हैकी)।

- (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- और लैंडस्केप-मोड के लिए ऑफसेट-मूल्यों के साथ काम करता है

लेकिन इस समाधान के साथ मेरी ऐप साइट की लोडिंग-प्रक्रिया के दौरान ज़ूम करने के लिए डबल-टैपिंग द्वारा क्रैश हो जाती है।

मैं इस समस्या को हल करने के लिए (जूमिंग से WebView को रोकने के लिए लोड करने के दौरान) उपवर्ग 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" -call निर्धारित करने के लिए और दो बार टैप करके संभावना को फिर से सक्रिय करने के लिए एक काउंटर जोड़ा (0 के साथ init 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; 
} 

और मैं अपने मामले में [UIWebView didFinishLoad] में जे एस फोन कर रहा हूँ

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

निर्माण पूरी तरह से। अन्य सुझाव मेरे लिए काम नहीं किया।

+0

यह आईओएस 8.1.3 पर मेरे लिए एक ही समस्या हल हो गया !!! वीडियो टैग जोड़ने से मेरा ऐप दुर्घटनाग्रस्त हो गया, अब मैं बस जगह VideoTag को कॉल करता हूं और ऐप अब और क्रैश नहीं होता !!! इस तरह के प्रतिगमन पर विश्वास कर सकते हैं। मेरी सभी समस्याएं इस तरह के समान थीं: [http://stackoverflow.com/questions/26656342/uiwebview-random-crash-at-uiviewanimationstate-release-message-sent-to-deallo](http://stackoverflow.com/ प्रश्न/26656342/UIWebView यादृच्छिक-दुर्घटना-एट-uiviewanimationstate रिलीज-संदेश भेजा करने वाली deallo) –