दिलचस्प पोस्ट
एक मिश्रित डेटा प्रकार (int, float, char, आदि) एक सरणी में कैसे संग्रहीत किया जा सकता है? PHP ईमेल सत्यापन कार्य एंड्रॉइड डाटाबेस लेनदेन आंतरिक वर्ग ऑब्जेक्ट से बाहरी कक्षा ऑब्जेक्ट को पकड़ना मैं कैसे अपने सी + + प्रोग्राम में हेडर फाइल <graphics.h> प्राप्त कर सकता हूं और उपयोग कर सकता हूं? IPhone पर कमजोर जोड़ने से काम करने से मना कर दिया PHP में एक तिथि बढ़ाने का सबसे आसान तरीका? MongoDB – व्यवस्थापक उपयोगकर्ता अधिकृत नहीं है Html पर नए टैब में लिंक कैसे खोलें? ORM का उपयोग करने के क्या फायदे हैं? MySQL सिंटैक्स त्रुटि संदेश "संचालन में 1 कॉलम होना चाहिए" Google Weather API 403 त्रुटि प्रवेश-नियंत्रण-अनुमति-उत्पत्ति त्रुटि Google एपीआई के लिए एक jQuery पोस्ट भेज रहा है बाश में समानांतर में बाल प्रक्रियाओं की एक सीमित संख्या में चल रहा है? मैं ggplots के एक 'असंतुलित' ग्रिड कैसे प्राप्त कर सकता हूं?

UIWebViewDelegate निगरानी नहीं XMLHttpRequest?

क्या यह सच है कि UIWebViewDelegate एक XMLHttpRequest का उपयोग करके अनुरोधों की निगरानी नहीं करता है? यदि हां, तो क्या इस तरह के अनुरोधों पर निगरानी रखने का कोई तरीका है?

उदाहरण के लिए UIWebViewDelegate इस में -(BOOL) webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSMutableURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType नहीं पकड़ता है -(BOOL) webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSMutableURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType ;

 var xhr = new XMLHttpRequest(); xhr.open("GET", "http://www.google.com", true); xhr.onreadystatechange=function() { if (xhr.readyState==4) { alert(xhr.responseText); } } xhr.send(); 

Solutions Collecting From Web of "UIWebViewDelegate निगरानी नहीं XMLHttpRequest?"

दिलचस्प सवाल

यह काम करने के लिए दो भाग हैं: एक जावास्क्रिप्ट हैंडलर और UIWebView प्रतिनिधि तरीकों। जावास्क्रिप्ट में, हम एक एजेएक्स अनुरोध बनाया जाता है जब घटनाओं को ट्रिगर करने के लिए प्रोटोटाइप तरीकों को संशोधित कर सकते हैं। हमारे UIWebView प्रतिनिधि के साथ, हम इन घटनाओं पर कब्जा कर सकते हैं

जावास्क्रिप्ट हैंडलर

जब एक AJAX अनुरोध किया जाता है तो हमें सूचित करना होगा। मैंने यहां समाधान पाया

हमारे मामले में, कोड का काम करने के लिए, मैंने निम्नलिखित JavaScript को ajax_handler.js नामक एक संसाधन में डाल दिया है जो मेरे ऐप से बंडल किया गया है।

 var s_ajaxListener = new Object(); s_ajaxListener.tempOpen = XMLHttpRequest.prototype.open; s_ajaxListener.tempSend = XMLHttpRequest.prototype.send; s_ajaxListener.callback = function () { window.location='mpAjaxHandler://' + this.url; }; XMLHttpRequest.prototype.open = function(a,b) { if (!a) var a=''; if (!b) var b=''; s_ajaxListener.tempOpen.apply(this, arguments); s_ajaxListener.method = a; s_ajaxListener.url = b; if (a.toLowerCase() == 'get') { s_ajaxListener.data = b.split('?'); s_ajaxListener.data = s_ajaxListener.data[1]; } } XMLHttpRequest.prototype.send = function(a,b) { if (!a) var a=''; if (!b) var b=''; s_ajaxListener.tempSend.apply(this, arguments); if(s_ajaxListener.method.toLowerCase() == 'post')s_ajaxListener.data = a; s_ajaxListener.callback(); } 

वास्तव में यह क्या होगा, ब्राउज़र के स्थान को कुछ बनाई गई यूआरएल योजना (इस मामले में, mpAjaxHandle ) के अनुरोध के बारे में जानकारी के साथ बदल दिया गया है। चिंता मत करो, यह पकड़ने के साथ हमारे प्रतिनिधि और स्थान नहीं बदलेगा।

UIWebView प्रतिनिधि

सबसे पहले, हमें हमारी जावास्क्रिप्ट फाइल पढ़ने की जरूरत है। मेरा सुझाव है कि इसे एक स्थिर चर में संग्रहीत करना मैं + आरंभ करने की आदत में हूँ

 static NSString *JSHandler; + (void)initialize { JSHandler = [[NSString stringWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"ajax_handler" withExtension:@"js"] encoding:NSUTF8StringEncoding error:nil] retain]; } 

इसके बाद, हम इस जावास्क्रिप्ट को इंजेक्ट करना चाहते हैं इससे पहले कि पेज लोड हो रहा है ताकि हम सभी इवेंट्स प्राप्त कर सकें।

 - (void)webViewDidStartLoad:(UIWebView *)webView { [webView stringByEvaluatingJavaScriptFromString:JSHandler]; } 

अंत में, हम घटना को कब्जा करना चाहते हैं।

चूंकि यूआरएल योजना बनाई गई है, हम वास्तव में इसका पालन नहीं करना चाहते। हम नहीं लौटते हैं और सब ठीक है।

 #define CocoaJSHandler @"mpAjaxHandler" - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { if ([[[request URL] scheme] isEqual:CocoaJSHandler]) { NSString *requestedURLString = [[[request URL] absoluteString] substringFromIndex:[CocoaJSHandler length] + 3]; NSLog(@"ajax request: %@", requestedURLString); return NO; } return YES; } 

मैंने समाधान के साथ एक नमूना प्रोजेक्ट बनाया है लेकिन इसकी मेजबानी करने के लिए कहीं नहीं है आप मुझे संदेश दे सकते हैं अगर आप इसे होस्ट कर सकते हैं और मैं इस पोस्ट को तदनुसार संपादित कर दूँगा।

आप एक NSURLProtocol का उपयोग कर सकते हैं उदाहरण के लिए यदि आप http://localhost/path साथ XMLHttpRequest पर कॉल करते हैं तो आप इसे निम्नलिखित के साथ संभाल सकते हैं:

 @interface YourProtocol: NSURLProtocol 

फिर कार्यान्वयन के लिए:

 + (BOOL)canInitWithRequest:(NSURLRequest *)request { return [request.URL.host isEqualToString:@"localhost"]; } + (NSURLRequest *) canonicalRequestForRequest:(NSURLRequest *)request { return request; } - (void) startLoading { // Here you handle self.request } - (void)stopLoading { } 

आपको इस प्रकार प्रोटोकॉल को पंजीकृत करना होगा:

  [NSURLProtocol registerClass:[YourProtocol class]]; 

NSURLProtocol के उपवर्ग को कार्यान्वित और पंजीकृत करके आप अपने UIWebView से सभी अनुरोध पर कब्जा कर सकते हैं। यह कुछ मामलों में ओवरकिल हो सकता है, लेकिन अगर आप वास्तव में चलने वाली जावास्क्रिप्ट को संशोधित करने में सक्षम नहीं हैं, तो यह आपकी सर्वोत्तम शर्त है

मेरे मामले में मुझे सभी अनुरोध पर कब्जा करने और उनमें से हर एक के लिए एक विशिष्ट HTTP शीर्षलेख डालना होगा मैंने यह NSLProtocol लागू करके पंजीकृत किया है, यह रजिस्टर क्लास के माध्यम से पंजीकृत कर रहा है और मेरे subclass में + (BOOL) में जवाब दे सकता है: InitWithRequest: (NSURLRequest *) अनुरोध अगर अनुरोध मैं दिलचस्पी है यूआरएल से मेल खाती है। तब आपको अन्य तरीकों को लागू करना होगा प्रोटोकॉल का यह एक NSURLConnection का उपयोग करके किया जा सकता है, प्रतिनिधि के रूप में प्रोटोकॉल वर्ग की स्थापना और NSURLConnection के प्रतिनिधि तरीकों को NSURLProtocolClient पर पुनर्निर्देशित करना

यह सच साबित होता है क्या UIWebViewDelegate प्रदान करता है उससे परे एक UIWebView क्या कर रहा है की निगरानी करने का कोई तरीका नहीं है, जब तक कि आप stringByEvaluatingJavaScriptFromString: का उपयोग करने के लिए कोई रास्ता नहीं समझ सकते हैं stringByEvaluatingJavaScriptFromString: कुछ जावास्क्रिप्ट इंजेक्ट करने के लिए आपको क्या करना है

जैसा कि अन्य लोगों का उल्लेख है, UIWebViewDelegate केवल window.location और iframe.src के परिवर्तन देखता है।

अगर आप केवल आईओएस की कस्टम यूआरएल योजना का उपयोग करना चाहते हैं, तो आप इस तरह से <iframe> का लाभ ले सकते हैं।

उदाहरण के लिए, यदि आप इस तरह एक यूआरएल योजना को कॉल करना चाहते हैं

 objc://my_action?arg1=1&arg2=2 

आपकी जेएस फ़ाइल में:

 /** * @param msg : path of your query * @param data : arguments list of your query */ var call_url = function(msg, data){ const scheme = "objc"; var url = scheme + '://' + msg; if(data){ var pstr = []; for(var k in data) if(typeof data[k] != 'function') pstr.push(encodeURIComponent(k)+"="+encodeURIComponent(data[k])); url += '?'+pstr.join('&'); } var i = document.createElement("iframe"); i.src = url; i.style.opacity=0; document.body.appendChild(i); setTimeout(function(){i.parentNode.removeChild(i)},200); } //when you call this custom url scheme call_url ("my_action", {arg1:1,arg2:2});