[ios] WKWebView से सभी कुकीज़ प्राप्त करना



Answers

WKWebView द्वारा उपयोग की जाने वाली कुकीज़ (बनाई गई) वास्तव में NSHTTPCookieStorage.sharedHTTPCookieStorage() में सही ढंग से संग्रहीत होती हैं।

समस्या यह है कि WKWebView तुरंत कुकीज़ को वापस नहीं लिखता है। मुझे लगता है कि यह अपने स्वयं के कार्यक्रम पर करता है। उदाहरण के लिए जब WKWebView बंद हो या समय-समय पर हो।

तो आखिर में वे वहां खत्म हो जाते हैं, लेकिन जब अप्रत्याशित होता है।

आप अपने WKWebView को बंद करके साझा NSHTTPCookieStorage 'सिंक' को मजबूर करने में सक्षम हो सकते हैं। अगर यह काम करता है तो कृपया हमें बताएं।

अपडेट करें : मुझे बस याद आया कि आईओएस के लिए फ़ायरफ़ॉक्स में हम WKWebView को अपने WKProcessPool को एक नए के साथ बदलकर कुकीज़ सहित अपने आंतरिक डेटा को फ्लश करने के लिए मजबूर करते हैं। कोई आधिकारिक एपीआई नहीं है, लेकिन मुझे पूरा यकीन है कि अभी सबसे विश्वसनीय कामकाज है।

Question

UIWebView से कुकीज़ प्राप्त करते समय NSHTTPCookieStorage.sharedHTTPCookieStorage() का उपयोग करके सीधा लगता है, ऐसा लगता है कि WKWebView कहीं और कुकीज़ संग्रहीत करता है।

मैंने कुछ शोध किया, और मैं NSHTTPURLResponse ऑब्जेक्ट से इसे NSHTTPURLResponse से कुछ कुकीज़ प्राप्त करने में सक्षम था। हालांकि, इसमें WKWebView द्वारा उपयोग की जाने वाली सभी कुकीज़ शामिल नहीं हैं:

func webView(webView: WKWebView, decidePolicyForNavigationResponse navigationResponse: WKNavigationResponse, decisionHandler: (WKNavigationResponsePolicy) -> Void) {

  if let httpResponse = navigationResponse.response as? NSHTTPURLResponse {
    if let headers = httpResponse.allHeaderFields as? [String: String], url = httpResponse.URL {
      let cookies = NSHTTPCookie.cookiesWithResponseHeaderFields(headers, forURL: url)

      for cookie in cookies {
        logDebug(cookie.description)

        logDebug("found cookie " + cookie.name + " " + cookie.value)
      }
    }
  }
}

आश्चर्यजनक रूप से, आईओएस 9 में एक वर्ग WKWebsiteDataStore भी है जो WKWebsiteDataStore में कुकीज़ प्रबंधित करने के लिए ज़िम्मेदार है, हालांकि, कक्षा में कुकीज़ डेटा पुनर्प्राप्त करने के लिए सार्वजनिक विधि नहीं है:

let storage = WKWebsiteDataStore.defaultDataStore()

storage.fetchDataRecordsOfTypes([WKWebsiteDataTypeCookies], completionHandler: { (records) -> Void in
  for record in records {
    logDebug("cookie record is " + record.debugDescription)

    for dataType in record.dataTypes {
      logDebug("data type is " + dataType.debugDescription)

      // get cookie data??
    }
  }
})

क्या कुकी डेटा प्राप्त करने के लिए कोई कामकाज है?




प्रैक्टिस में, मैंने "decololicyForNavigationResponse" की विधि में पाया, आप कुकीज लाने के लिए निम्न तरीके का उपयोग कर सकते हैं, लेकिन दुख की बात यह है कि यह सत्र के लिए पूरी / पूरी सूची नहीं है।

let response = navigationResponse.response as! NSHTTPURLResponse
        let headFields = response.allHeaderFields as! [String:String]

        let cookies = NSHTTPCookie.cookiesWithResponseHeaderFields(headFields, forURL: response.URL!)



मैंने उद्देश्य-सी में WKHTTPCookieStore का उपयोग किया, यह मेरे लिए लगातार और सत्र कुकीज़ दोनों प्राप्त करने के लिए काम करता था, लेकिन यह केवल आईओएस 11+ में काम करता है

https://developer.apple.com/documentation/webkit/wkhttpcookiestore?changes=latest_minor&language=objc

 if (@available(iOS 11.0, *)) {
     WKHTTPCookieStore *cookieStore = _webView.configuration.websiteDataStore.httpCookieStore;
     [cookieStore getAllCookies:^(NSArray* cookies) {
        NSHTTPCookie *cookie;
        for(cookie in cookies){
            NSLog(@"cookie: %@", cookie);
        }
 }];

WKWebView को अपने WKProcessPool को प्रतिस्थापित करके अपने आंतरिक डेटा को फ्लश करने के लिए मजबूर करना, जैसा कि स्टीफन के उत्तर द्वारा वर्णित है, आईओएस 10 और 11 में मेरे लिए काम करता है लेकिन केवल लगातार कुकीज़ के लिए; ऐसा लगता है जैसे सत्र कुकीज़ को हटा दिया गया है, जैसा कि जे थू ने वर्णित किया था




मुझे पता है कि यह एक बहुत पुराना सवाल है, और हमारे पास समाधान है लेकिन आईओएस 11 और ऊपरी भाग पर ही काम करता है। उन लोगों के लिए जो आईओएस 10 और उससे कम (मेरे जैसे) से निपट रहे हैं, आप इस विधि पर विचार कर सकते हैं। यह मेरे लिए पूरी तरह से काम करता है:

  • बल रीसेट प्रक्रियापूल:

extension WKWebView {
       func refreshCookies() {
          self.configuration.processPool = WKProcessPool()
          // TO DO: Save your cookies,...
       }
    }

-> यह वास्तविक डिवाइस पर ही काम करता है।

  • सिम्युलेटर के लिए, आपको जोड़ना चाहिए:

    func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
            if let response = navigationResponse.response as? HTTPURLResponse,
                let allHttpHeaders = response.allHeaderFields as? [String: String],
                let responseUrl = response.url {
                let cookies = HTTPCookie.cookies(withResponseHeaderFields: allHttpHeaders, for: responseUrl)
                for cookie in cookies {
                   HTTPCookieStorage.shared.setCookie(cookie)
                }
          }
    
          decisionHandler(.allow)
    }

स्टीफन एंटेंज़ और फेनोम के उत्तर का पालन करें।




Related