我正在try 将现有的应用程序从UIWebView切换到WKWebView.当前APP管理webview之外的用户登录/会话,并将认证所需的cookies设置到NSHTTPCookieStore中.不幸的是,新WKWebView没有使用NSHTTPCookieStorage中的cookies.有没有其他方法可以做到这一点呢?

推荐答案

Edit for iOS 11+ only

使用WKHTTPCookieStore:

let cookie = HTTPCookie(properties: [
    .domain: "example.com",
    .path: "/",
    .name: "MyCookieName",
    .value: "MyCookieValue",
    .secure: "TRUE",
    .expires: NSDate(timeIntervalSinceNow: 31556926)
])! 

webView.configuration.websiteDataStore.httpCookieStore.setCookie(cookie)

由于您要将它们从HTTPCookeStorage拉过来,因此可以执行以下操作:

let cookies = HTTPCookieStorage.shared.cookies ?? []
for cookie in cookies {
    webView.configuration.websiteDataStore.httpCookieStore.setCookie(cookie)
}

Old answer for iOS 10 and below

如果您需要在初始加载请求上设置cookie,可以在NSMutableURLRequest上设置它们.因为Cookie只是一个特殊格式化的请求头,所以可以这样实现:

WKWebView * webView = /*set up your webView*/
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://example.com/index.html"]];
[request addValue:@"TeskCookieKey1=TeskCookieValue1;TeskCookieKey2=TeskCookieValue2;" forHTTPHeaderField:@"Cookie"];
// use stringWithFormat: in the above line to inject your values programmatically
[webView loadRequest:request];

如果需要页面上的后续AJAX请求设置cookie,只需在文档开始时使用WKUserScript通过javascript编程设置值即可实现,如下所示:

WKUserContentController* userContentController = WKUserContentController.new;
WKUserScript * cookieScript = [[WKUserScript alloc] 
    initWithSource: @"document.cookie = 'TeskCookieKey1=TeskCookieValue1';document.cookie = 'TeskCookieKey2=TeskCookieValue2';"
    injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:NO];
// again, use stringWithFormat: in the above line to inject your values programmatically
[userContentController addUserScript:cookieScript];
WKWebViewConfiguration* webViewConfig = WKWebViewConfiguration.new;
webViewConfig.userContentController = userContentController;
WKWebView * webView = [[WKWebView alloc] initWithFrame:CGRectMake(/*set your values*/) configuration:webViewConfig];

将这两种技术结合起来,应该可以为您提供足够的工具,将cookie值从本机应用程序区转移到Web视图区.如果你需要更高级的cookie,你可以在cookie javascript API on Mozilla's page上找到更多信息.

是的,苹果不支持the niceties of UIWebView个中的很多个,这真是太糟糕了.我不确定他们是否会支持他们,但希望他们很快就能做到这一点.希望这能有所帮助!

Ios相关问答推荐

SWIFT中具有可选返回类型和泛型的网络请求

IFrame内容拒绝仅在iOS浏览器上加载-即使发布了内容-安全-策略(CSP)框架-祖先指令

SwiftUI:.toolbar 不适用于 UITextView

如何通过点击按钮滚动到 ScrollView 中的特定视图?

归档时命令 PhaseScriptExecution 失败,退出代码非零

如何使用 pushViewController 从 UIHostingController 的 SwiftUI 视图中推送 ViewController?

iOS应用程序崩溃,必需条件为false:isformatsamplerateandchannelcountvalid(format)

包装在 AnyView 中时 UIViewControllerRepresentable 无法正常工作

Swiftui为什么在点击第二行之前背景不起作用

iOS,Swift 5,AppDelegate open url / .onOpenUrl - 如何找到调用我的自定义方案的调用应用程序

有什么方法可以预填充核心数据?

Xcode - 错误 ITMS-90635 - Bundle 包中的 Mach-O 无效 - 提交到 App Store

Swift tableView 分页

检测 iOS UIDevice 方向

如何在 OS X 或 iOS(不使用格式塔)中确定运行时的操作系统版本?

将 iPhone xib 转换为 iPad xib?

Sierra 中的安全/协同设计: keys 串忽略访问控制设置和 UI 提示权限

为给定的 UIColor 获取更亮和更暗的 colored颜色 变化

Parse for iOS:try 运行应用程序时出错

打开 XIB 文件后 Xcode 6.3 冻结/挂起