Есть ли способ узнать, когда HTTPCook ie доступен для WKWebView? - PullRequest
1 голос
/ 12 марта 2020

Отказ от ответственности

Я знаю, что есть несколько вопросов, связанных с этим вопросом, и я рассмотрел все из них, которые я мог, но они, кажется, задают вопросы о том, как syn c куки в общем. Это отличается от тех, в том смысле, что файлы cookie передаются должным образом, просто кажется, что существует задержка между их передачей и временем, когда они доступны для WKWebView

ситуации

У меня есть приложение, которое использует собственный поток входа в систему, а затем, после проверки подлинности, переводит пользователя на WKWebView для содержимого приложения. Кажется, есть проблема с установкой файлов cookie для WKWebsiteDataStore httpCookieStore (WKHTTPCookieStore).

Проблема, с которой я сталкиваюсь, заключается в том, что после того, как я установил куки на httpCookieStore, возникает задержка между установкой повара ie (и вызванным обработчиком завершения) и тем, когда повара ie фактически доступно для WKWebView.

По сути, я вызываю метод set cook ie, а в обработчике его завершения я вызываю load(_:) для WKWebView. Веб-представление загружается, как и ожидалось, однако первые сетевые вызовы, сделанные внутри веб-представления, пропускают только что установленную настройку ie. Если я добавлю задержку, скажем, 500 мс перед вызовом load(_:) на WKWebView, первые сетевые вызовы будут иметь повар ie.

Код

На мой взгляд контроллер:


public override func viewDidLoad() {
    super.viewDidLoad()

    let config = WKWebViewConfiguration()
    config.websiteDataStore = WKWebsiteDataStore.default()
    config.processPool = self.webProcessPool // This is a WKProcessPool that is injected

    createWebView(configuration: config)

    // This method is defined in an extension below.
    webView.configuration.websiteDataStore.httpCookieStore.set(cookies: self.cookies) {
        // This completion is called and the web page is loaded as expected
        self.webView.load(URLRequest(url: self.navigationUrl))

        // The first requests made by the content loaded do not have the session cookie
        // which should have been present from the call to `set(cookies:)` however,
        // instead of calling load right away as we did above, if we add a delay here 
        // such as:
        //
        // self.cookieSettingDelaySubscribtion = Observable<Int>
        //        .interval(.milliseconds(500), scheduler: MainScheduler.instance)
        //        .take(1)
        //        .subscribe({ [unowned self] _ in
        //            self.webView.load(URLRequest(url: self.navigationUrl))
        //            self.cookieSettingDelaySubscribtion.dispose()
        //        })
        //
        // The cookie will be present on the first requests every time. 
    }
}


private func createWebView(configuration: WKWebViewConfiguration) {
    webView = WKWebView(frame: view.frame, configuration: configuration)

    // Setup code follows here 
}
extension WKHTTPCookieStore {
    /// Set multiple cookies, with a single completion handler.
    /// - parameters:
    ///   - cookies: The cookies to set.
    ///   - completion: A completion block to be called when all cookies have been set. The block
    ///                 will be called on the main queue.
    public func set(cookies: [HTTPCookie], completion: @escaping () -> Void) {
        let completionDispatchGroup = DispatchGroup()

        for cookie in cookies {
            completionDispatchGroup.enter()
            setCookie(cookie) {
                completionDispatchGroup.leave()
            }
        }

        completionDispatchGroup.notify(queue: .main, execute: completion)
    }
}

Вопрос

I угадайте, что вопрос здесь в том, может ли кто-нибудь объяснить, почему существует задержка между установленным поваром ie и вызовом обработчика его завершения, и когда повар ie фактически доступен внутри WkWebView и есть ли способ (очевидно, за пределами установленного завершения повара ie, поскольку это уже происходит), чтобы узнать, когда повар ie станет доступным внутри WKWebView?

...