标签: wkhttpcookiestore

iOS 17 中的 WKWebView Cookie 同步问题

我遇到一个奇怪的问题,在某些设备上升级到 iOS 17 后,cookie 同步失败(很少有 cookie 丢失)。

Cookie 同步在我们的应用程序中如何运作?

  • 身份验证令牌通过 REST 调用中的标头接收。
  • 令牌与NSHTTPCookieStorage&同步WKHTTPCookieStore
  • WKWebView 请求将 WKHTTPCookieStore 中找到的 cookie 附加到 HTTP 请求。

有什么问题吗?

WKWebView 错过了在少数设备上的 iOS 17 上随机附加一些 cookie。

这个问题有多普遍?

  1. 我们组织中有 3 名人员报告了这一情况。
  2. 8-10 个最终用户已报告此问题。
  3. 此问题在其中一台 iPhone 14 Pro 设备上重现。

有修复工作吗?

将 iOS 设备设置重置为默认设置对少数最终用户来说有效,但在错误仍然可重现的设备上却失败了。

我们尝试了什么?

  • 我们尝试将 Cookie 手动设置为NSMutableRequest通过WKWebView禁用 Cookie 自动同步setHTTPShouldHandleCookies。它在所有情况下都有效,除非应用程序注销并再次登录而不进入前台。

请帮忙提供合理的解决方案。

cookies ios wkwebview wkhttpcookiestore ios17

9
推荐指数
0
解决办法
466
查看次数

WKWebview getAllCookies在iOS 11.3中崩溃

我们最近迁移到了WKWebview.我们添加了一个用于更改cookie的监听器,以获取更新的cookie并更新我们自己的商店.

- (void)cookiesDidChangeInCookieStore:(WKHTTPCookieStore *)cookieStore {
    [cookieStore getAllCookies:^(NSArray* cookies) {
    }];
}
Run Code Online (Sandbox Code Playgroud)

加载控制器后,它会调用cookiesDidChangeInCookieStore并在"getAllCookies"崩溃.但这种崩溃只发生在TestFlight/Fabric构建中.当我从xcode直接在设备上运行应用程序时(在调试和发布模式下)都不会发生.以下是崩溃报告,

Thread 9 name:  WebThread
Thread 9 Crashed:
0   WebKit                          0x0000000192fbfc10 WebKit::CallbackMap::put+ 1186832 (WTF::Ref<WebKit::CallbackBase, WTF::DumbPtrTraits<WebKit::CallbackBase> >&&) + 128
1   WebKit                          0x0000000192fbfbb4 WebKit::CallbackMap::put+ 1186740 (WTF::Ref<WebKit::CallbackBase, WTF::DumbPtrTraits<WebKit::CallbackBase> >&&) + 36
2   WebKit                          0x00000001930490cc WebKit::CallbackID WebKit::CallbackMap::put<WTF::Vector<WebCore::Cookie, 0ul, WTF::CrashOnOverflow, 16ul, WTF::FastMalloc> const&, WebKit::CallbackBase::Error>(WTF::Function<void + 1749196 (WTF::Vector<WebCore::Cookie, 0ul, WTF::CrashOnOverflow, 16ul, WTF::FastMalloc> const&, WebKit::CallbackBase::Error)>&&) + 136
3   WebKit                          0x0000000193049008 WebKit::WebCookieManagerProxy::getAllCookies(PAL::SessionID, WTF::Function<void + 1749000 (WTF::Vector<WebCore::Cookie, 0ul, WTF::CrashOnOverflow, 16ul, WTF::FastMalloc> const&, WebKit::CallbackBase::Error)>&&) + 44
4   WebKit                          0x0000000192eb5b90 …
Run Code Online (Sandbox Code Playgroud)

ios wkwebview wkwebviewconfiguration wkhttpcookiestore ios11.3

8
推荐指数
2
解决办法
1242
查看次数

WKHTTPCookieStore没有检索设置的Cookie。

我正在尝试以编程方式设置Cookie,但无法正常工作。Cookie给人的印象是有效。然后,将其设置在上WKWebsiteDataStore.default().httpCookieStore。然后,在异步回调中,我尝试将所有cookie从商店中取出。但是,我的cookie不在那里。哪里去了!?

    let httpCookieStore = WKWebsiteDataStore.default().httpCookieStore

    var cookieProperties = [HTTPCookiePropertyKey: Any]()
    cookieProperties[.name] = "MarkCookie"
    cookieProperties[.value] = "MarkValue"
    cookieProperties[.domain] = "localhost"
    cookieProperties[.maximumAge] = 1234
    cookieProperties[.path] = "/"

    let cookie = HTTPCookie(properties: cookieProperties)!

    httpCookieStore.setCookie(cookie) {
        // This is called fine. The cookie looks ok. 
        print("Cookie set \(cookie)")

        DispatchQueue.main.async {
            httpCookieStore.getAllCookies { cookies in
                // This is empty!!!!
                print(cookies)
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

nshttpcookie wkwebview ios11 wkhttpcookiestore

6
推荐指数
1
解决办法
631
查看次数

在WKHTTPCookieStore中设置cookie时,WKWebView不会更新document.cookie

内容

我有一个使用的iOS Cordova应用程序WKWebView。我需要拦截WKWebView无法使用http|httpsscheme的请求(可以使用,UIWebView但我必须移至WKWebView)。因此,我在科尔多瓦config.xml

<content src="xyz://host.domain.com/app" />
<allow-navigation href="xyz://*/*" />
Run Code Online (Sandbox Code Playgroud)

并且我已经配置WKWebView为处理(拦截)xyz://方案:

[configuration setURLSchemeHandler:self forURLScheme:@"xyz"];
Run Code Online (Sandbox Code Playgroud)

将Safari检查器附加到我的iPhone document.origin输出之后xyz://host.domain.com

假设一GEThttps://host.domain.com/app/foo具有下列头响应:

Set-Cookie: a=1; Domain=host.domain.com; Path=/
Set-Cookie: b=2; Domain=host.domain.com; Path=/; Secure
Set-Cookie: c=3; Domain=host.domain.com; Path=/; Secure; HttpOnly
Run Code Online (Sandbox Code Playgroud)

使用NSURLSessionDataTask做出GEThttps://host.domain.com/app/foo我建立NSHTTPCookie从物体Set-Cookie上面的响应报头,并将其存储在WKHTTPCookieStore我的WKWebView使用

[wkWebView.configuration.websiteDataStore.httpCookieStore setCookie:cookie completionHandler:^{
    NSLog(@"SET COOKIE\n%@", cookie);
}];
Run Code Online (Sandbox Code Playgroud)

按照这个答案。Cookies设置正确,可以使用进行检索

[wkWebView.configuration.websiteDataStore.httpCookieStore …
Run Code Online (Sandbox Code Playgroud)

cookies ios cordova wkwebview wkhttpcookiestore

6
推荐指数
0
解决办法
242
查看次数

从 IOS 13.0 开始,当 webview 上的 cookie 更改时,永远不会触发 cookiesDidChange

我正在使用 Cookie Store Observer 来跟踪我的 web 视图上 cookie 值的变化。它在所有版本的 IOS 上都运行良好。但自从 IOS 13.0 出来后,这不再有效。我没有接到任何电话

@available(iOS 11.0, *)
func cookiesDidChange(in cookieStore: WKHTTPCookieStore){
  cookieStore.getAllCookies { cookies in
  //Store cookies to UserDefaults on Background Thread
  DispatchQueue.global(qos: .userInitiated).async {
     self.storeCookies(cookies: cookies)
  }
 }
} 
Run Code Online (Sandbox Code Playgroud)

我在创建 web 视图之前设置 cookie 观察器。

WKWebsiteDataStore.default().httpCookieStore.add(self)
Run Code Online (Sandbox Code Playgroud)

突然间,它从 IOS 13.0 停止工作。我没有注意到围绕这个 API 的文档有任何变化。

有人在IOS 13.0上有任何信息吗?

cookies wkwebview wkhttpcookiestore ios13

5
推荐指数
0
解决办法
860
查看次数

在某些操作系统版本中未调用 WKHTTPCookieStore getAllCookies 完成处理程序

我们的 iOS 应用程序从中读取 cookieWKHTTPCookieStore以调用初始化 web 服务。如果我们正在寻找的特定 cookie 不存在于 CookieStore 中,则将在 web 服务中传递空值并返回相关响应。由于这是一个初始化 API,我们在完成处理程序中调用 web 服务,如下所示,并通过添加活动指示器来阻止 UI,直到它给出成功或失败。

WKWebsiteDataStore.default().httpCookieStore.getAllCookies { (cookies) in
            callInitializationService(cookies)
        }
Run Code Online (Sandbox Code Playgroud)

在我们的测试中,它在从 iOS 11.3 到 12.2 的操作系统版本的所有可用测试设备中运行良好。

当前的问题是生产应用程序有一个奇怪的行为,即安装后活动指示器根本不关闭。我们发现根本原因WKHTTPCookieStore.getAllCookies是从未调用完成处理程序,因此它阻塞了 UI。该问题主要在 iOS 11.2.x 操作系统版本中观察到,但不确定它是否也会影响任何其他操作系统版本。即使重新启动应用程序也不能解决问题。

有没有人遇到过这个问题?任何解决方案/解决方法可用于解决此问题?

cookies ios swift wkwebview wkhttpcookiestore

3
推荐指数
1
解决办法
1400
查看次数

无法设置WKWebView设置Cookie(iOS 11+)

我拼命尝试将自定义cookie添加到WKWebView实例(不使用Javascript或类似的解决方法)。

从iOS 11及更高版本开始,Apple提供了执行此操作的API:WKWebViews WKWebsiteDataStore具有属性httpCookieStore

这是我的(示例)代码:

import UIKit
import WebKit

class ViewController: UIViewController {

    var webView: WKWebView!

    override func viewDidLoad() {
        webView = WKWebView()
        view.addSubview(webView)
        super.viewDidLoad()
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        let cookie = HTTPCookie(properties: [
            HTTPCookiePropertyKey.domain : "google.com",
            HTTPCookiePropertyKey.path : "/",
            HTTPCookiePropertyKey.secure : true,
            HTTPCookiePropertyKey.name : "someCookieKey",
            HTTPCookiePropertyKey.value : "someCookieValue"])!

        let cookieStore = webView.configuration.websiteDataStore.httpCookieStore
        cookieStore.setCookie(cookie) {
            DispatchQueue.main.async {
                self.webView.load(URLRequest(url: URL(string: "https://google.com")!))
            }
        }
    }

    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()

        webView.frame …
Run Code Online (Sandbox Code Playgroud)

cookies ios wkwebview wkhttpcookiestore

2
推荐指数
2
解决办法
4362
查看次数