2016-03-05 13 views
13

मेरे पास WKWebViewloadFileURL के साथ स्थानीय वेब संपत्तियों को लोड करने वाला एक आईओएस हाइब्रिड ऐप है। WKWebViewjQuery.ajax के साथ बैकएंड एपीआई में HTTPS से संचार करता है। ऐप केवल मोबाइल है और मैं चाहता हूं कि एपीआई "मोबाइल-केवल" भी हो। यही है, मैं एपीआई का उपयोग करने से क्रोम और फ़ायरफ़ॉक्स जैसे ब्राउज़र को अवरुद्ध करना चाहता हूं।आईओएस ऐप में WKWebView की उत्पत्ति बदलें

Access-Control-Allow-Origin: app://myApp 

मैं app://myApp को WKWebView के मूल एपीआई क्वेरी करने से ब्राउज़रों से बचने के लिए बदल सकते हैं:

मेरे रणनीति के रूप में निम्नानुसार एपीआई प्रतिक्रियाओं पर Access-Control-Allow-Origin हेडर स्थापित करने के लिए है?

उत्तर

4

मामला: 1

आप दस्तावेज़ निर्माण या दस्तावेज़ समाप्त लोडिंग के समय में WKWebview में एक जे एस इंजेक्षन और सभी AJAX के लिए इस कस्टम हेडर को जोड़ने के लिए अपने कस्टम कार्यान्वयन के साथ जावा स्क्रिप्ट XMLHttpRequest खुला विधि हुक कर सकते हैं WKWebView से अनुरोध।

उदाहरण कोड

NSString *XMLHTTPRequestHookJSPath = [[NSBundle mainBundle] pathForResource:@"XMLHTTPRequestHook.js" ofType:nil]; 
    NSString *kXMLHTTPRequestHookJS = [NSString stringWithContentsOfFile:XMLHTTPRequestHookJSPath encoding:NSUTF8StringEncoding error:NULL]; 
    WKUserContentController *contentController = [[WKUserContentController alloc] init]; 
    WKUserScript *script = [[WKUserScript alloc] initWithSource:kXMLHTTPRequestHookJS injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:NO]; 
    [contentController addUserScript:script]; 
    WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init]; 
    configuration.userContentController = contentController; 

    self.lastUsedWebView = [[WKWebView alloc] initWithFrame:self.webContainerView.bounds configuration:configuration]; 
    self.lastUsedWebView.navigationDelegate = self; 

और XMLHTTPRequestHook.js में इस कस्टम हेडर जोड़ सकते हैं और वापस मूल खुला विधि कॉल करने के अपने कस्टम कार्यान्वयन के साथ XMLHttpRequest हुक करने की कोशिश करो।

केस 2 आप WKWebview में URLRequest लोड हो रहा है, जबकि इस शीर्ष लेख जोड़ना चाहते हैं, तो आप इस हेडर NSMutableRequest करने के लिए नीचे के रूप में जोड़ सकते हैं और WKWebview में इस अनुरोध को लोड कर सकते हैं। हालांकि इस विधि के साथ आपके पास WKWebview से सभी AJAX कॉल में यह हेडर नहीं हो सकता है।

उदाहरण कोड:

WKWebView * webView = /*set up your webView*/ 
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://example.com/index.html"]]; 
[request addValue:@"app://myApp" forHTTPHeaderField:@"Access-Control-Allow-Origin"]; 
// use stringWithFormat: in the above line to inject your values programmatically 
[webView loadRequest:request]; 

आशा इस मदद करता है।

+0

हाय चंद्र। ऐप की तरफ मैं 'मूल' को बदलना चाहता हूं। एपीआई सर्वर प्रतिक्रियाओं द्वारा 'एक्सेस-कंट्रोल-अनुमति-उत्पत्ति' हेडर जोड़ा जाता है! – Randomblue

+0

हाय .. अगर आप WKWebview से नेटवर्क अनुरोध को अवरुद्ध करने के लिए NSURLProtocol जैसे कुछ ढूंढ रहे हैं, तो NSURLProtocol WKWebview के साथ काम नहीं करता है क्योंकि WKWebview एक अलग प्रक्रिया से सभी नेटवर्क अनुरोध लोड करता है। हालांकि आप अभी भी केस 1 में उपरोक्त उल्लिखित समाधान का प्रयास करते हैं ताकि हेडर्स को WKWebview से सभी AJAX कॉल के लिए आवश्यक मानों में बदल दिया जा सके और देखें कि क्या यह सहायता है। – Chandra

+0

इसके अलावा, आप अपनी रणनीति को बदल सकते हैं और WKWebView से सभी AJAX कॉल के लिए एक कस्टम हेडर (एक्सेस-कंट्रोल-ऑब्जेक्ट-हेडर हेडर का उपयोग करने के बजाय) जोड़ सकते हैं और अपने एपीआई सर्वर में आप यह कस्टम हेडर का उपयोग यह पहचानने के लिए कर सकते हैं कि एपीआई कॉल आपके ऐप से हैं और किसी अन्य ब्राउज़र से नहीं। अगर मुझे मदद मिलती है तो मुझे बताएं। – Chandra

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