Эх сурвалжийг харах

WKWebView Persistent Storage of Cookies

Marino Faggiana 6 жил өмнө
parent
commit
8bebe4698b

+ 0 - 5
iOSClient/Brand/Intro/CCIntro.m

@@ -263,9 +263,4 @@
     
 }
 
-- (void)decidePolicyForNavigationAction:(WKWebView *)webView decidePolicyFor:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
-{
-    decisionHandler(WKNavigationActionPolicyAllow);
-}
-
 @end

+ 0 - 5
iOSClient/Library/SwiftWebVC/SwiftModalWebVC.swift

@@ -13,7 +13,6 @@ import UIKit
     @objc func didReceiveServerRedirectForProvisionalNavigation(url: URL)
     @objc func didFinishLoading(success: Bool, url: URL)
     @objc func webDismiss()
-    @objc func decidePolicyForNavigationAction(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void)
 }
 
 public class SwiftModalWebVC: UINavigationController {
@@ -96,8 +95,4 @@ extension SwiftModalWebVC: SwiftWebVCDelegate {
     public func webDismiss() {
         self.delegateWeb?.webDismiss()
     }
-    
-    public func decidePolicyForNavigationAction(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
-        self.delegateWeb?.decidePolicyForNavigationAction(webView, decidePolicyFor: navigationAction, decisionHandler: decisionHandler)
-    }
 }

+ 82 - 20
iOSClient/Library/SwiftWebVC/SwiftWebVC.swift

@@ -14,7 +14,6 @@ public protocol SwiftWebVCDelegate: class {
     func didFinishLoading(success: Bool)
     func didFinishLoading(success: Bool, url: URL)
     func webDismiss()
-    func decidePolicyForNavigationAction(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void)
 }
 
 public class SwiftWebVC: UIViewController {
@@ -335,28 +334,25 @@ extension SwiftWebVC: WKNavigationDelegate {
     }
     
     public func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
-        
-        self.delegate?.decidePolicyForNavigationAction(webView, decidePolicyFor: navigationAction, decisionHandler: decisionHandler)
-        
-        /*
-        let url = navigationAction.request.url
-        
-        if #available(iOS 9.0, *) {
-            decisionHandler(.allow)
+        if #available(iOS 11.0, *) {
+            let url = request.url!.host!
+            webView.loadDiskCookies(for: url){
+                decisionHandler(.allow)
+            }
         } else {
-            
-            let userAgent : String = CCUtility.getUserAgent()
-
-            if (navigationAction.request.value(forHTTPHeaderField: "User-Agent") == userAgent) {
+            decisionHandler(.allow)
+        }
+    }
+    
+    public func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
+        if #available(iOS 11.0, *) {
+            let url = request.url!.host!
+            webView.writeDiskCookies(for: url){
                 decisionHandler(.allow)
-            } else {
-                let newRequest : NSMutableURLRequest = navigationAction.request as! NSMutableURLRequest
-                newRequest.setValue(userAgent, forHTTPHeaderField: "User-Agent")
-                decisionHandler(.cancel)
-                webView.load(newRequest as URLRequest)
             }
+        } else {
+            decisionHandler(.allow)
         }
-        */
     }
     
     public func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
@@ -367,7 +363,6 @@ extension SwiftWebVC: WKNavigationDelegate {
     }
     
     public func webView(_ webView: WKWebView, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
-        
         if let serverTrust = challenge.protectionSpace.serverTrust {
             completionHandler(Foundation.URLSession.AuthChallengeDisposition.useCredential, URLCredential(trust: serverTrust))
         } else {
@@ -376,3 +371,70 @@ extension SwiftWebVC: WKNavigationDelegate {
     }
     
 }
+
+@available(iOS 11, *)
+
+extension WKWebView {
+    
+    enum PrefKey {
+        static let cookie = "cookies"
+    }
+    
+    func writeDiskCookies(for domain: String, completion: @escaping () -> ()) {
+        fetchInMemoryCookies(for: domain) { data in
+            print("write cookies data", data)
+            UserDefaults.standard.setValue(data, forKey: PrefKey.cookie + domain)
+            completion();
+        }
+    }
+    
+    func loadDiskCookies(for domain: String, completion: @escaping () -> ()) {
+        if let diskCookie = UserDefaults.standard.dictionary(forKey: (PrefKey.cookie + domain)){
+            fetchInMemoryCookies(for: domain) { freshCookie in
+                
+                print("read cookies data", freshCookie)
+                
+                let mergedCookie = diskCookie.merging(freshCookie) { (_, new) in new }
+                
+                for (_, cookieConfig) in mergedCookie {
+                    let cookie = cookieConfig as! Dictionary<String, Any>
+                    
+                    var expire : Any? = nil
+                    
+                    if let expireTime = cookie["Expires"] as? Double{
+                        expire = Date(timeIntervalSinceNow: expireTime)
+                    }
+                    
+                    let newCookie = HTTPCookie(properties: [
+                        .domain: cookie["Domain"] as Any,
+                        .path: cookie["Path"] as Any,
+                        .name: cookie["Name"] as Any,
+                        .value: cookie["Value"] as Any,
+                        .secure: cookie["Secure"] as Any,
+                        .expires: expire as Any
+                        ])
+                    
+                    self.configuration.websiteDataStore.httpCookieStore.setCookie(newCookie!)
+                }
+                
+                completion()
+            }
+            
+        }
+        else{
+            completion()
+        }
+    }
+    
+    func fetchInMemoryCookies(for domain: String, completion: @escaping ([String: Any]) -> ()) {
+        var cookieDict = [String: AnyObject]()
+        WKWebsiteDataStore.default().httpCookieStore.getAllCookies { (cookies) in
+            for cookie in cookies {
+                if cookie.domain.contains(domain) {
+                    cookieDict[cookie.name] = cookie.properties as AnyObject?
+                }
+            }
+            completion(cookieDict)
+        }
+    }
+}

+ 0 - 4
iOSClient/Login/CCLoginWeb.swift

@@ -150,10 +150,6 @@ extension CCLoginWeb: SwiftModalWebVCDelegate {
     public func webDismiss() {
         self.delegate?.webDismiss?()
     }
-    
-    public func decidePolicyForNavigationAction(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
-        decisionHandler(.allow)
-    }
 }
 
 

+ 0 - 4
iOSClient/Main/CCMore.swift

@@ -510,10 +510,6 @@ extension CCMore: SwiftModalWebVCDelegate, SwiftWebVCDelegate{
         print("Finished loading. Success: \(success).")
     }
     
-    public func decidePolicyForNavigationAction(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
-        decisionHandler(.allow)
-    }
-    
     public func webDismiss() {
         print("Web dismiss.")
     }