我遇到一个奇怪的问题,在某些设备上升级到 iOS 17 后,cookie 同步失败(很少有 cookie 丢失)。
Cookie 同步在我们的应用程序中如何运作?
NSHTTPCookieStorage&同步WKHTTPCookieStore有什么问题吗?
WKWebView 错过了在少数设备上的 iOS 17 上随机附加一些 cookie。
这个问题有多普遍?
有修复工作吗?
将 iOS 设备设置重置为默认设置对少数最终用户来说有效,但在错误仍然可重现的设备上却失败了。
我们尝试了什么?
NSMutableRequest通过WKWebView禁用 Cookie 自动同步setHTTPShouldHandleCookies。它在所有情况下都有效,除非应用程序注销并再次登录而不进入前台。请帮忙提供合理的解决方案。
我们最近迁移到了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
我正在尝试以编程方式设置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) 内容:
我有一个使用的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。
假设一GET对https://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做出GET对https://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) 我正在使用 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上有任何信息吗?
我们的 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 操作系统版本中观察到,但不确定它是否也会影响任何其他操作系统版本。即使重新启动应用程序也不能解决问题。
有没有人遇到过这个问题?任何解决方案/解决方法可用于解决此问题?
我拼命尝试将自定义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)