Отказ от ответственности
Я знаю, что есть несколько вопросов, связанных с этим вопросом, и я рассмотрел все из них, которые я мог, но они, кажется, задают вопросы о том, как 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
?