2011-05-26 21 views
20

में रीडायरेक्ट का पता लगाने के लिए कैसे मैं अपने ऐप के भीतर एक एम्बेडेड ब्राउज़र के रूप में UIWebView का उपयोग कर रहा हूं। मेरी समस्या यूआरएल को ट्रैक कर रही है जो यूआरएल बार में प्रदर्शित होना चाहिए।UIWebView

जब एक गूगल खोज कर रही है, परिणाम पृष्ठ अक्सर इस तरह लिंक उत्पन्न करता है:

http://www.google.com/url?sa=t&source=web&cd=1&ved=0CC4QFjAA&url=http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FDog&rct=j&q=dogs&ei=27XeTc6RFIWEvAO858DHBQ&usg=AFQjCNGkEDcWzea4pSlurHhcuQfqFcp_pw

उपयोगकर्ता इस लिंक, UIWebView पहली रिपोर्ट इस लिंक और shouldStartLoadWithRequest:navigationType: में तो पुनः निर्देशित लिंक पर क्लिक करता।

मैं यह कैसे कह सकता हूं कि पेज पर छवियों या अन्य तत्वों के लिए लोड की जाने वाली कुछ पूरक साइट के विपरीत यह एक रीडायरेक्ट है? चूंकि यह खड़ा है कि मेरा यूआरएल बार विकिपीडिया यूआरएल को अपडेट करने के बजाए उपर्युक्त उदाहरण में Google से लंबा लिंक प्रदर्शित कर रहा है।

+0

मेरे पास मेरी वेबसाइट पर एक ट्यूटोरियल है जो आपको दिखाता है कि यह कैसे करें। देखें [UIWebView (भाग 3) के साथ एक वेब ब्राउज़र बनाना [http://iosdeveloperzone.com/2011/05/22/tutorial-building-a-web-browser-with-uiwebview-part-3/)। ट्यूटोरियल के अंत में डाउनलोड करने योग्य स्रोत कोड है जिसे आप अपने स्वयं के प्रोजेक्ट में उपयोग करने के लिए स्वतंत्र हैं। मुझे बताएं कि यह वही करता है जो आप चाहते हैं। यदि शायद नहीं, तो मैं सुझाव दे सकता हूं कि आप इसे कैसे संशोधित कर सकते हैं। – idz

+0

इसके लिए धन्यवाद। मैं अभी भी एक रीडायरेक्ट का निश्चित रूप से पता नहीं लगा सकता, लेकिन [अनुरोध mainDocumentURL] का उपयोग करके मुझे लगता है कि मुझे जो चाहिए वह मुझे देगा। – zorro2b

+0

@idz आपने मेरा पिछला भाग बचाया। धन्यवाद। –

उत्तर

18

सबसे अच्छा आप वास्तव में कर सकते हैं webView:shouldStartLoadWithRequest:navigationType: प्रतिनिधि विधि का पालन करें। मुझे लगता है कि रीडायरेक्ट UIWebViewNavigationTypeOther के अंतर्गत आते हैं।

+0

'UIWebViewNavigationType' केवल अनुरोध शुरू करने में उपयोगकर्ता की कार्रवाई को इंगित करता है, यह सर्वर के बारे में कोई विवरण नहीं देता है। –

5

एक छोटी सी देर अब, लेकिन मैं का प्रयोग करेंगे webViewDidFinishLoad और webViewDidStartLoad प्रतिनिधि तरीकों रीडायरेक्ट पता लगाने के लिए इस प्रकार है:

- (void)webViewDidStartLoad:(UIWebView *)webView{ 

    myRequestedUrl= [webView.request mainDocumentURL]; 
    NSLog(@"Requested url: %@", myRequestedUrl);  
} 

- (void)webViewDidFinishLoad:(UIWebView *)webView{ 

    myLoadedUrl = [webView.request mainDocumentURL]; 
    NSLog(@"Loaded url: %@", myLoadedUrl); 

    //psudocode 
    if(myRequestedUrl is not the same as myLoadedUrl){ 
     doSomething 
    } 
} 
+0

क्या आपने यह कोशिश की है? मुझे 'WebViewDidStartLoad: 'द्वारा अविश्वसनीय होने के लिए' वेब व्यू 'की' अनुरोध 'संपत्ति मिली है। UIWebView को लोड करने के लिए उपयोग किए गए मूल अनुरोध को संग्रहीत करना और 'WebViewDidFinishLoad:' द्वारा प्रदान किए गए अनुरोध के विरुद्ध इसकी तुलना करना सबसे अच्छा है। –

+0

हां यह भी एक अच्छा विचार है, लेकिन मैं ** WebViewDidStartLoad ** में ** ** ** इंप्रेशन के तहत था ** ** इनपुट अनुरोध देता है। मैंने इसका परीक्षण किया है और यह काम करता है, हालांकि शायद जटिल स्थितियों में यह खांसी हो सकती है। – PowerAktar

+0

मुझे पता चला है कि 'webViewDidStartLoad' एक खाली' NSMutableURLRequest' देता है जो खाली है, और इस प्रकार अधिक उपयोग नहीं किया जा सकता है। कुछ भी स्पष्ट रूप से जटिल नहीं कर रहा है, बस 'loadRequest:' का उपयोग कर वेबसाइट लोड कर रहा है, साइट ठीक है और 'webViewDidFinishLoad' सही ढंग से अनुरोध लौटाती है। –

1

मैं इस एक ही मुद्दा के माध्यम से काम कर रहा हूँ। मूल रूप से मैंने यहां सलाह का पालन किया और मैन्युअल रूप से पीछे/आगे नेविगेशन के लिए इतिहास सूची में यूआरएल इनपुट करने के लिए maindocumenturl का उपयोग किया। हालांकि, इसने बहुत सटीक यूआरएल नहीं दिए, चाहे आपने डीएसस्टार्टलोड या डीफिनिशलोड से यूआरएल प्राप्त किया हो या नहीं। यदि आप मेरा दर्द महसूस करना चाहते हैं, तो Google खोज के माध्यम से नेविगेट करने का प्रयास करें और आप देखेंगे कि मैं किस बारे में बात कर रहा हूं, maindocumenturl उस वातावरण में पूरी तरह से बेकार है। इसके विपरीत, webviewdidfinishload के साथ उपयोग की जाने वाली पूर्ण यूआरएल संपत्ति बहुत बेहतर काम करती है, और वास्तव में उपयोगकर्ता को उपयोग करने योग्य इतिहास बनाने देता है। यह मेरा दो सेंट है।