2010-11-28 60 views
57

मैंने हाल ही में पाया कि मेरा UIWebView आईटीएमएस लिंक पर चकित कर रहा था। विशेष रूप से, मेरे ऐप में UIWebView से, यदि मैं this one जैसी साइट पर नेविगेट करता हूं और "ऐप स्टोर पर उपलब्ध" लिंक पर क्लिक करता हूं, तो UIWebView "त्रुटि डोमेन = WebKitErrorDomain Code = 101 के साथ त्रुटि होगी URL को दिखाया नहीं जा सकता । "UIWebView में ऐप यूआरएल कैसे संभालें?

कुछ गुगलिंग के बाद, मुझे एहसास हुआ कि मुझे ऐप लिंक के लिए अनुरोधों को पकड़ने की आवश्यकता है और आईओएस उन्हें संभालता है। मैंने यह देखने के लिए शुरू किया कि क्या योजना -webView:shouldStartLoadWithRequest:navigationType: में "itms" से शुरू होती है, लेकिन एहसास हुआ कि सिस्टम के अन्य प्रकार के ऐप लिंक हो सकते हैं। तो मैं इस के साथ आया था, बजाय:

- (void)webView:(UIWebView *)wv didFailLoadWithError:(NSError *)error { 
    // Give iOS a chance to open it. 
    NSURL *url = [NSURL URLWithString:[error.userInfo objectForKey:@"NSErrorFailingURLStringKey"]]; 
    if ([error.domain isEqual:@"WebKitErrorDomain"] 
     && error.code == 101 
     && [[UIApplication sharedApplication]canOpenURL:url]) 
    { 
     [[UIApplication sharedApplication]openURL:url]; 
     return; 
    } 

    // Normal error handling… 
} 

मैं इस बारे में दो प्रश्न हैं:

  1. इस समझदार है? मैं विशेष रूप से त्रुटि डोमेन और त्रुटि कोड की जांच कर रहा हूं और URLInfo से URL स्ट्रिंग ला रहा हूं। क्या वह सामान बनी रहने की संभावना है?
  2. यह उपरोक्त लिंक किए गए ऐप स्टोर लिंक के लिए काम करता है, लेकिन जब मैं अपने ऐप पर वापस स्विच करता हूं, तो ऐसा लगता है कि "फ्रेम लोड बाधित" के साथ असफल असफल अनुरोध हुआ है। मैं इससे कैसे छुटकारा पा सकता हूं? ऐसा तब नहीं होता जब मेरे पास ओएस -webView:shouldStartLoadWithRequest:navigationType: से अनुरोध संभालता है, इसलिए यह थोड़ा परेशान है।

आप कैसे ऐसे अनुरोधों को संभालते हैं?

उत्तर

88

यहां मैं क्या आया हूं। webView:shouldStartLoadWithRequest:navigationType: में, मैं ओएस किसी भी गैर- http और गैर https कि यह कर सकते हैं, तो जैसे अनुरोधों को हैंडल करने से पूछते हैं:

- (BOOL)webView:(UIWebView *)wv shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { 

    // Determine if we want the system to handle it. 
    NSURL *url = request.URL; 
    if (![url.scheme isEqual:@"http"] && ![url.scheme isEqual:@"https"]) { 
     if ([[UIApplication sharedApplication]canOpenURL:url]) { 
      [[UIApplication sharedApplication]openURL:url]; 
      return NO; 
     } 
    } 
    return YES; 
} 

इस खूनी त्रुटि "फ्रेम बाधित लोड" के अलावा बहुत अच्छी तरह से काम करता है। मैंने सोचा था कि webView:shouldStartLoadWithRequest:navigationType: से झूठी वापसी करके वेब दृश्य अनुरोध लोड नहीं करेगा और इसलिए संभाल करने में कोई त्रुटि नहीं होगी। लेकिन भले ही मैं ऊपर NO लौटाता हूं, फिर भी मैं "फ्रेम लोड बाधित" त्रुटि करता हूं। ऐसा क्यों है?

वैसे भी, मैं यह सोचते हैं रहा हूँ यह -webView:didFailLoadWithError: में अनदेखा किया जा सकता:

- (void)webView:(UIWebView *)wv didFailLoadWithError:(NSError *)error { 
    // Ignore NSURLErrorDomain error -999. 
    if (error.code == NSURLErrorCancelled) return; 

    // Ignore "Fame Load Interrupted" errors. Seen after app store links. 
    if (error.code == 102 && [error.domain isEqual:@"WebKitErrorDomain"]) return; 

    // Normal error handling… 
} 

और अब आइट्यून्स यूआरएल, ठीक से काम के रूप में mailto: और ऐप्स लिंक है।

+1

न सिर्फ आईट्यून्स - मेरे पास वेब दृश्यों के माध्यम से फेसबुक लॉगिन के साथ भी था। – Adam

+0

यह मेरे लिए भी बहुत अच्छा काम करता है, धन्यवाद! – spstanley

+0

मेरा दिन बचाएं, बहुत धन्यवाद – duan

-2

यदि आप अपने ऐप को इसे प्रबंधित करने के लिए पंजीकृत करते हैं तो यह मदद करता है: लिंक?

उदा। http://inchoo.net/iphone-development/launching-application-via-url-scheme/

आप योजना http साथ शुरू हो सकता है, लेकिन फिर एक itms रीडायरेक्ट, जो कि आपके ऐप कि योजना से निपटने के रूप में पंजीकृत नहीं है विफल हो सकता है मिलता है।

+1

मैं नहीं चाहता कि मेरा ऐप 'itms' योजना को संभाले। मैं जानना चाहता हूं कि जब कोई UIWebView में किसी लिंक पर क्लिक करता है, तो दृश्य स्वयं को संभाल नहीं सकता है, और फिर यह देखने के लिए जांचें कि आईओएस इसे संभाल सकता है या नहीं, और ऐसा होता है, तो ऐसा करें।मेरे अपने ऐप के लिए एक यूआरएल योजना पंजीकृत है या नहीं, इसके साथ कुछ भी नहीं करना है। – theory

+0

यूआरएल को देखने से बताने का कोई तरीका नहीं है। विफलता को संभालना (जैसा कि आपने दिखाया) शायद सबसे अच्छा तरीका है। मुझे संदेह है कि "फ्रेम लोड बाधित" एक रीडायरेक्ट से एक आईटीएम योजना यूआरएल में आ सकता है, इसलिए मैंने आपके ऐप को सक्षम के रूप में पंजीकृत करने का सुझाव दिया है। –

8

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

- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request 
    navigationType:(UIWebViewNavigationType)navigationType 
{ 
    if ([[[request URL] scheme] isEqualToString:@"itms-apps"]) { 
     [webView stopLoading]; 
     [[UIApplication sharedApplication] openURL:[request URL]]; 
     [self.navigationController popViewControllerAnimated:YES]; 
     return NO; 
    } else { 
     return YES; 
    } 
} 
+0

आईओएस 6.0 पर मुझे योजना "आईएमएस" के रूप में मिलती है – cynistersix

+0

आईओएस 9 पर यह योजना "itms-appss" है –

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