2010-05-12 12 views
7

मेरे पास एक वेबकिट वेबव्यू का उपयोग कर एक एप्लीकेशन है और मैं इस वेबव्यू में एक अलग HTTP यूआरएल के लिए कस्टम यूआरएल प्रोटोकॉल के साथ यूआरएल को मैप करना चाहता हूं। उदाहरण के लिए, कहते हैं कि मैं लोड हो रहा हूँ:HTTP पर कस्टम यूआरएल प्रोटोकॉल (NSURLProtocol का उपयोग कर?)

कस्टम: // path/to/संसाधन

मैं आंतरिक रूप से वास्तव में लोड करना चाहते हैं:

http://something-else.com/path/to/resource

दूसरे शब्दों में, कस्टम प्रोटोकॉल में कार्य करता है लगभग एक शॉर्टेंड के रूप में। मैं हालांकि -webView का उपयोग नहीं कर सकता: संसाधन: willSendRequest: redirectResponse :डेटा स्रोत से: क्योंकि मैं चाहता हूं कि वेबकिट वास्तव में विश्वास करे कि यह प्रश्न में यूआरएल है, न केवल एक से दूसरे को रीडायरेक्ट करना है।

अब तक मैं एक कस्टम NSURLProtocol subclass का उपयोग करने का प्रयास कर रहा हूं। हालांकि, यह पहली बार सोचने की तुलना में अधिक कठिन साबित हो रहा है क्योंकि, कम से कम मेरी समझ के लिए, मुझे NSRLProtocol subclass 'startLoading विधि में वास्तविक लोडिंग करना होगा। मैं मौजूदा HTTP प्रोटोकॉल लोडर को काम को बंद करने का एक तरीका चाहता हूं, लेकिन मुझे ऐसा करने का कोई आसान तरीका नहीं मिल रहा है।

क्या किसी के पास इस मुद्दे को हल करने के लिए कोई सुझाव है, या शायद एक वैकल्पिक तरीका है?

धन्यवाद!

उत्तर

3

मैं नीति प्रतिनिधि का उपयोग करता हूं। इसके कुछ नुकसान हैं, लेकिन यह मेरी आवश्यकताओं के लिए सरल और पर्याप्त है।

- (void)webView:(WebView *)webView decidePolicyForNavigationAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id <WebPolicyDecisionListener>)listener; 

{ 
    if ([request.URL.scheme isEqualToString:@"custom"]) { 

     // do something interesting 
     // like force the webview to load another URL 

     [listener ignore]; 
     return; 
    } 

    [listener use]; 
} 

अपने प्रयोग के लिए मैं भी जे एस घटनाओं के प्रसार को रोकने के लिए की जरूरत है,: मैं कुछ इस तरह से करते हैं। इसलिए मैं आमतौर पर यूआरएल को ऑनक्लिक इवेंट हैंडलर में रखता हूं जो window.event.stopPropagation() को कॉल करता है; location.href सेट करने के बाद।

यह बहुत ही फैंसी नहीं है, लेकिन यह एक जेएस इवेंट कोको को संचार करने के लिए एक बहुत ही लचीला और बहुत आसान तरीका है।

- (NSURLRequest *)webView:(WebView *)sender resource:(id)identifier willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse fromDataSource:(WebDataSource *)dataSource 

यह आपको HTTP URL के साथ एक के लिए अनुरोध को बदलने की अनुमति चाहिए:

+0

क्या इसका वेबपृष्ठ को कस्टम प्रोटोकॉल यूआरएल पर विचार करने का असर पड़ता है? अगर मैं उस ब्लॉक से बस एक नया यूआरएल लोड करता हूं, तो मुझे लगता है कि मैं पहले जैसा ही स्थिति में रहूंगा: प्रभावी ढंग से रीडायरेक्ट बनाना। लेकिन शायद मैं उस फैशन को गलत समझ रहा हूं जिसमें मुझे वहां से एक नया यूआरएल लोड करना है। –

+0

"क्या इसका वेबवर्क को कस्टम प्रोटोकॉल यूआरएल पर सोचने का असर पड़ता है?" नहीं, निश्चित रूप से नहीं। यदि आपका लक्ष्य href.location को एक चीज़ पर सेट करना और दूसरे लोड करना है, तो यह समाधान आपको वहां नहीं ले जाएगा। माफ़ कीजिये। इस मामले में, जब कस्टम योजना का पता चला है, तब भी यह मारे गए - तो location.href कभी नहीं बदलता है। "प्रभावी रूप से एक रीडायरेक्ट बनाना" यह रीडायरेक्ट जैसा नहीं है। रीडायरेक्ट में पहला यूआरएल लोड किया जाता है, हैंडल इत्यादि। फिर अगला यूआरएल लोड हो जाता है। नीति प्रतिनिधि का उपयोग करना और [श्रोता अनदेखा] को कॉल करना पूरी तरह से पहले यूआरएल लोड को मारता है। – isaiah

0

आप WebResourceLoadDelegate विधि लागू कर सकते हैं।

वैकल्पिक रूप से, एक NSURLProtocol उपवर्ग को लागू नहीं बहुत मुश्किल इस बात के लिए क्योंकि आपके प्रोटोकॉल आंतरिक रूप से सही HTTP URL का उपयोग कर एक और NSURLConnection ऊपर आग और प्रोटोकॉल ग्राहक के लिए अपनी प्रतिनिधि तरीकों को मैप कर सकते है।