2009-10-16 10 views
16

मैं अब कुछ हफ्तों के लिए एक आईफोन ऐप पर काम कर रहा हूं और मैंने जो पहले की सुविधाओं को जोड़ा है उनमें से एक UIWebView था जो संदर्भ संवेदनशील विकिपीडिया पेज विषयों को लोड करता था। यह लागू करने के लिए बहुत छोटा था और कुछ समय के लिए ठीक काम कर रहा है।क्या किसी ने पाया है कि UIWebView कुछ URLS के लिए विफल रहता है?

आज, मैंने पाया कि कार्यक्षमता अप्रत्याशित रूप से काम करना बंद कर दिया था। मैं उस कोड के टुकड़े के परिधि पर चारों ओर झुका रहा था और शुरू में माना कि मैंने कुछ तोड़ दिया था।

मैंने सभी स्पष्ट स्थानों की जांच की, मेरे यूआरएल, UIWebView अभी भी XIB आदि में झुका हुआ था। मुझे कोई समस्या नहीं मिली।

आगे जांच करते हुए, मैं अपने UIWebViewDelegate पर निपटनेdidFailLoadWithError कुछ त्रुटि अटक और पाया मैं एक -999 त्रुटि हो रही थी:

NSURLErrorCancelled

Returned when an asynchronous load is canceled.

A Web Kit framework delegate will receive this error when it performs a cancel operation on a loading resource. Note that an NSURLConnection or NSURLDownload delegate will not receive this error if the download is canceled.

तो यह एक नया अनुरोध करने (या रद्द) की तरह लगता है इससे पहले कि मूल एक खत्म हो गया है। मैं इस तरह के कुछ भी के लिए अपना कोड जांचता हूं और खाली आ जाता हूं।

तो मैं अपने सामान्य डाउनवर्ड सर्पिल में पायरानिया में गया और मान लिया कि विकिपीडिया UAGent या कुछ के आधार पर अनुरोधों को अवरुद्ध कर रहा था और जंगली हंस पीछा करने के कुछ प्रयासों पर चले गए जो एक खुश जगह पर वापस जाने के लिए प्रयास कर रहे थे। ये प्रयास सफल नहीं थे और अंत में स्वच्छता प्रबल हुई।

string = "GET /wiki/Franklin_D._Roosevelt HTTP/1.1\r\nHost: en.wikipedia.org\r\nUser-Agent: test\r\nReferer: http://en.wikipedia.org/wiki/Franklin_D._Roosevelt\r\nAccept: */*\r\nAccept-Language: en-us\r\n_Accept-Encoding: gzip, deflate\r\nConnection: keep-alive\r\n\r\n" 
import socket 
s = socket.socket() 
s.connect(("en.wikipedia.org",80)) 
s.send(string) 
x = s.recv (1000) 
while (x): 
    print x 
    x = s.recv (1000) 

तो मैं इस आदमी को चलाने के लिए और है कि विकिपीडिया बहुत कृपया मेरी लौटा रहा है की खोज: मैं HTTP अनुरोध मैं सिम्युलेटर में मेरी एपीपी से बना रहा था नकल करने के लिए, विकिपीडिया वापस क्या भेज रहा था देखने के लिए एक सरल अजगर स्क्रिप्ट बनाने के तत्काल और पूरी तरह से डेटा। तो क्या चल रहा है?

चिंक्स मेरे हर वर्तमान, पागल बख्तरबंद "यह हमेशा मेरी गलती" में दिखाई देने लगा और मैं यह जांचने का फैसला करता हूं कि अन्य आईफोन ऐप्स इन यूआरएल को देख सकते हैं या नहीं। मैं tweet को विडंबनात्मक रूप से मनोरंजक (मैं आसानी से खुश हूं) यूआरएल पोस्ट करता हूं और जांचता हूं कि Tweetie यूआरएल देख सकता है या नहीं। यह नहीं कर सकता

एक दोस्त ट्विटर पर इसे बाहर करने की कोशिश करता है। एक ही समस्या है। सफारी और विकिपीडिया ऐप में ठीक काम करता है, लेकिन ऐसा लगता है कि एक बोग मानक UIWebView का उपयोग कर आईफोन ऐप्स की तरह विकिपीडिया पृष्ठों में समस्याएं आ रही हैं।

बस पूरी तरह से निश्चित कोई अन्य चर देखते हैं हो सकता है, मैं सिर्फ एक UIWebView कि http://en.wikipedia.com अप लोड करता है के साथ एक simple test app बनाया है, यह एक ही त्रुटि (अंत में उस कोड जोड़ा) के साथ विफल रहता है।

तो आप लोग क्या सोचते हैं? क्या यह सिर्फ UIWebView बग है? वहां कोई ऐप्पल ग्रोनक्स जानता है कि यहां क्या हो रहा है?

क्या मुझे कुछ पूरी तरह से स्पष्ट याद आया है और मैं एक बार फिर से अपने पैंट के बिना काम करने के लिए ट्रेन पर बैठा हूं?

जो आप सोचते हैं उसे सुनने के लिए तत्पर हैं। ध्यान रखें, यह कल ठीक काम कर रहा था।समाधान और यहाँ क्या हो रहा है की एक बहुत स्पष्ट विवरण के लिए

धन्यवाद Duncan:

सवाल-जवाब (या शायद पोस्टमार्टम अधिक उपयुक्त है)।

कारण मैं मूल रूप से त्रुटि देखा था, जब मैं बिल्कुल didFailLoadWithError प्रतिनिधि विधि को लागू नहीं किया गया था, यह था कि उस विधि के लिए डिफ़ॉल्ट व्यवहार जाहिरा तौर पर UIWebView स्पष्ट और फलस्वरूप अनुरोध को मारने के लिए है की तरह लग रहा । जब मैंने यह पता लगाने के लिए अपना कार्यान्वयन जोड़ा कि क्या हो रहा था, तो मैं कुछ कोड में दृश्य में त्रुटि लिखने के लिए फंस गया और जैसा कि डंकन बताते हैं, यही मुझे मिला है।

कॉलबैक में 999 त्रुटि कोडों को अनदेखा करने के लिए एक बहुत ही भयानक समाधान की तरह लगता है, लेकिन मैं नलिका टेप के साथ ठीक हूं।

मैंने परीक्षण करने के लिए कुछ ऐप्स की कोशिश की, यदि यह UIWebView समस्या (Tweetie, Twitteriffic आदि ...) था और उन सभी को यह समस्या थी। ऐसा लगता है कि डेवलपर्स के लिए यह एक आम आम निगरानी हो सकती है। शायद ऐप्पल इसे अगले संस्करण में साफ कर सकता है।

अन्य दिलचस्प बात यह है कि जब मैंने http://en.wikipedia.com के बजाय http://en.m.wikipedia.com का उपयोग करने के लिए अपने यूआरएल को स्विच किया, तो समस्या दूर हो गई।

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    _webView = (UIWebView*)self.view; 
    _webView.delegate = self; 

    // load the url 

    // FAIL 
    //NSURL * newUrl = [[[NSURL alloc] initWithString:@"http://en.wikipedia.com"] autorelease]; 

    // OK 
    NSURL * newUrl = [[[NSURL alloc] initWithString:@"http://www.stackoverflow.com"] autorelease]; 

    NSURLRequest * newUrlRequest = [NSURLRequest requestWithURL:newUrl]; 
    [_webView loadRequest:newUrlRequest];          
} 

// delegate stuff 
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)req navigationType:(UIWebViewNavigationType)navigationType { return YES; } 
- (void)webViewDidStartLoad:(UIWebView *)wv 
    { 
    // starting the load, show the activity indicator in the status bar 
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; 
} 

- (void)webViewDidFinishLoad:(UIWebView *)webView 
{ 
    // finished loading, hide the activity indicator in the status bar 
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 
} 

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error 
{ 
    NSURLErrorDomain 
    // load error, hide the activity indicator in the status bar 
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 
    [_webView loadHTMLString:[[[NSString alloc] initWithFormat:@"Failed to load page %@", [error localizedDescription]] autorelease] baseURL:nil]; 
} 
+0

ऐसा लगता है कि आपने यहां अपना शोध किया है। मैं सहमत हूं। मुझे लगता है कि अगर आप ऐप्पल के साथ रडार फाइल करना चाहते हैं तो आप हमें सभी एहसान करेंगे। सुनिश्चित करें कि जब आप इसे फ़ाइल करते हैं तो आप अपना टेस्ट ऐप शामिल करते हैं। –

+0

धन्यवाद मैट। मैंने डंकन के काम को चारों ओर करने की कोशिश की और यह वास्तव में समस्या के आसपास काम करता है। मुझे लगता है कि UIWebView गलत व्यवहार कर रहा है, लेकिन अगर यह काम करता है ... :) – RedBlueThing

+0

मैंने @atebits को बग के बारे में ट्वीट किया और Tweetie2 के नवीनतम संस्करण में ठीक है :) – RedBlueThing

उत्तर

17

ऐसा लगता है कि यहाँ एक जवाब है जैसे:

How do I fix NSURLErrorDomain error -999 in iPhone 3.0 OS

जो बारी में करने के लिए संदर्भित करता है:

http://www.iphonedevsdk.com/forum/iphone-sdk-development/6280-uiwebview-didfailloadwitherror-how-get-errors-code-list.html

ऐसा लगता है कि WebView में इस तरह की एक हैक की जरूरत है: didFailLoadWithError: प्रतिनिधि:

if ([error code] != NSURLErrorCancelled) { 
    //show error alert, etc. 
} 

संक्षेप में क्या हो रहा है प्रतिनिधि को "रद्द" (-99 9) विफलता मिल रही है, जिसका जन्म जावास्क्रिप्ट में हो सकता है या शायद UIWebView बग ​​में भी हो सकता है।

अपने कोड के साथ वेबव्यू कुछ भी नहीं दिखाता है क्योंकि आप त्रुटि प्रदर्शित करने के लिए एक ही UIWebView का उपयोग कर रहे हैं। यदि आपके पास केवल एनएसएलॉग की त्रुटि थी तो आपको विफलता दिखाई देगी, लेकिन तब पृष्ठ ठीक से लोड हो गया होगा, जिससे आपको संकेत मिलता है कि विफलता फर्जी है।

संबंधित मुद्दे