ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • WKWebView와 쿠키의 관계에 대하여
    앱등이에게 살충제를 뿌린다./iOS 2020. 4. 13. 23:54

    UIWebView에서 WKWebView로 많이들 넘어왔다.


    쿠키관리에 있어서 둘은 큰 차이점을 갖는다.

    UIWebView: HTTPCookieStorage에서 공통으로 관리한다.

    WKWebView: 웹뷰에서 단독으로 쿠키를 관리한다.


    웹뷰안에서는 새로운 세계가 펼쳐진다. 그 안에서 무수한 Request가 발생한다.

    앱을 사용하다가 웹뷰로 Seamless하게 이어지려면 쿠키 전달이 필수적이다.


    1. WKWebView로 쿠키 전달하기

    NSHTTPCookieStorage에 아무리 쿠키가 많아도 WKWebView로는 쿠키가 전달되지 않는다.

    따라서, 필요한 쿠키를 WKWebView로 직접 전달해줘야 한다.


    아래 코드를 통해 전달할 수 있다.

    let cookie = HTTPCookie(.....)

    webView.configuration.websiteDataStore.httpCookieStore.setCookie(cookie) // 뭐이렇게 많이 타고들어감?? 아래 코드 참조하세요



    왜이렇게 프로퍼티를 많이 타고 들어가냐???

    open class WKWebView : UIView { 

    /** @abstract A copy of the configuration with which the web view was initialized. */ 

    @NSCopying open var configuration: WKWebViewConfiguration { get }

    ...

    }



    open class WKWebViewConfiguration : NSObject, NSSecureCoding, NSCopying {

    ...

    /** @abstract The website data store to be used by the web view. */ 

    @available(iOS 9.0, *) 

    open var websiteDataStore: WKWebsiteDataStore

    ...

    }



    open class WKWebsiteDataStore : NSObject, NSSecureCoding {

    ...

    /** @abstract Returns the cookie store representing HTTP cookies in this website data store. */ 

    @available(iOS 11.0, *) 

    open var httpCookieStore: WKHTTPCookieStore { get }

    ...

    }



    /** A WKHTTPCookieStore object allows managing the HTTP cookies associated with a particular WKWebsiteDataStore. */ 

    @available(iOS 11.0, *)

    open class WKHTTPCookieStore : NSObject { 

    /** 

    @abstract Fetches all stored cookies. 

    @param completionHandler A block to invoke with the fetched cookies. 

    */ 

    open func getAllCookies(_ completionHandler: @escaping ([HTTPCookie]) -> Void) 


    /** 

    @abstract Set a cookie. 

    @param cookie The cookie to set. 

    @param completionHandler A block to invoke once the cookie has been stored. 

    */ 

    open func setCookie(_ cookie: HTTPCookie, completionHandler: (() -> Void)? = nil)


    ...

    }



    2. 쿠키 변화 감지하기

    WKHTTPCookieStore클래스에는 아래와 같은 메소드가 있다.

    /** 

    @abstract Adds a WKHTTPCookieStoreObserver object with the cookie store. 

    @param observer The observer object to add. 

    @discussion The observer is not retained by the receiver. It is your responsibility to unregister the observer before it becomes invalid. 

    */ 

    open func add(_ observer: WKHTTPCookieStoreObserver


    /** 

    @abstract Removes a WKHTTPCookieStoreObserver object from the cookie store. 

    @param observer The observer to remove. 

    */ 

    open func remove(_ observer: WKHTTPCookieStoreObserver)



    WKHTTPCookieStoreObserver는 어떤 놈이냐??

    @available(iOS 11.0, *) 

    public protocol WKHTTPCookieStoreObserver : NSObjectProtocol { 

    optional func cookiesDidChange(in cookieStore: WKHTTPCookieStore) 

    }



    심플하다.

    webView.configuration.websiteDataStore.httpCookieStore.add(self)


    extension MyClass: WKHTTPCookieStoreObserver {

    func cookiesDidChange(in cookieStore: WKHTTPCookieStore) {

    cookieStore.getAllCookies({ cookies in

    print(cookies)

    })

    }

    }



    근데...............

    우리가 명시적으로 CookieStore에 쿠키를 심어줄 때는 위 델리게이트가 정상적으로 호출된다.


    하지만 WKWebView 내부에서 발생한 Request의 Response로 쿠키가 생성되었을 때, 델리게이트가 호출되지 않음을 발견했다.

    딥빡 ㅋㅋㅋㅋㅋㅋ,,,,,,,,,ㅠㅠ








    댓글 1

Designed by Tistory.