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


Answers

WKWebView द्वारा उपयोग किए गए कुकीज़ वास्तव में सही रूप से NSHTTPCookieStorage.sharedHTTPCookieStorage()NSHTTPCookieStorage.sharedHTTPCookieStorage() में संग्रहीत हैं।

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

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

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

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

Question

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

मैंने कुछ शोध किए, और मैं इसे 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??
   }
}

क्या कुकी डेटा प्राप्त करने के लिए एक वैकल्पिक उपाय है?




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

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

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



NSHTTPCookie.cookiesWithResponseHeaderFields(headers, forURL: url) , क्या होगा अगर यूआरएल जहां कुकीज़ सेट की जाती हैं एक नेविगेशन प्रतिक्रिया यूआरएल (यूआरएल जो एक नेविगेशन का कारण बनता है) नहीं है? मैं कॉलबैक यूआरएल को नोटिस करता हूं जहां कुकीज़ सेट होते हैं, कभी भी तय नहीं होता है पॉलिसी में नेविगेशन के लिए उत्तर।

func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
    let response = navigationResponse.response as! HTTPURLResponse
    let cookies  = HTTPCookie.cookies(withResponseHeaderFields: response.allHeaderFields as! [String : String], for: response.url!) 
}

कॉलबैक यूआरएल के लिए ऊपर दिए गए प्रतिनिधि को कभी भी निष्पादित नहीं किया गया है क्योंकि कॉलबैक से ही पेज नेविगेशन का कारण नहीं है।

कुकीज़ (withResponseHeaderFields: के लिए :)