我在我的原生iPhone应用程序中,在允许登录/注册的网站上使用WKWebView,并将会话信息存储在cookie中.我试图找出如何持久存储cookie信息,因此当应用程序重新启动时,用户仍然可以使用其Web会话.
我在应用程序中有2个WKWebViews,它们共享一个WKProcessPool.我从一个共享进程池开始:
WKWebView
然后为每个WKWebView:
WKWebViewConfiguration *theConfiguration = [[WKWebViewConfiguration alloc] init];
theConfiguration.processPool = processPool;
self.webView = [[WKWebView alloc] initWithFrame:frame configuration:theConfiguration];
Run Code Online (Sandbox Code Playgroud)
当我使用第一个WKWebView登录,然后一段时间后将操作传递给第二个WKWebView时,会话保留,因此cookie已成功共享.但是,当我重新启动应用程序时,会创建一个新的进程池并销毁会话信息.有没有办法让会话信息通过应用程序重启持续存在?
现在我这样做
NSHTTPCookie *cookie;
NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (cookie in [storage cookies])
{
[storage deleteCookie:cookie];
}
Run Code Online (Sandbox Code Playgroud)
但它不适用于iOS 8,64位设备.
WKWebview干净的其他任何方式?任何帮助将不胜感激.谢谢.
我想从WKWebView获取所有cookie.为什么?我已经启动了一个使用基于Web的身份验证的项目.因此,我应该拦截cookie以确保用户已登录并用于其他目的.另一种情况 - 想象一下,如果用户登录,而不是"杀死"应用程序 - 由于存储此cookie会话的一些延迟将丢失:(.
问题似乎是cookie被缓存而不是立即保存到文件中.
(@Kemenaran从这里 - 下面的第5页)
我试图抓住他们的地方 -
webView:decidePolicyForNavigationResponse:decisionHandler:,
func webView(webView: WKWebView, decidePolicyForNavigationResponse navigationResponse: WKNavigationResponse, decisionHandler: (WKNavigationResponsePolicy) -> Void) {
if let httpResponse = navigationResponse.response as? NSHTTPURLResponse {
if let headers = httpResponse.allHeaderFields as? [String: String], url = httpResponse.URL {
let cookies = NSHTTPCookie.cookiesWithResponseHeaderFields(headers, forURL: url {
for cookie in cookies {
NSHTTPCookieStorage.shared.set(cookie)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
但并非所有请求都是导航,因此跳过一个cookie(在我的情况下),请参阅下面的详细信息
关于我试过的其他选项的几句话......
WKHTTPCookieStore提到.但我的项目应该支持iOS 9+我100%肯定,在登录后5-10秒,所需的cookie将保存到NSHttpCookieStorage(至少我几天的所有测试都确认)
我尝试使用提供的观察者NSHTTPCookieManagerCookiesChangedNotification,但它只为内部的cookie提供回调webView:decidePolicyForNavigationResponse:decisionHandler
我也尝试使用这里提到的一些JS来获取cookie …
我正在尝试在我的应用上添加移动,桌面版网站功能.但问题是User Agent只能在webView加载之前立即更改.在我的应用程序中,我添加按钮一个Mobile和Desktop版本站点的第二个.UIWebView选择User Agent刚开始.任何人都告诉我有没有办法User Agent在运行时更改.谢谢
var defaultUserAgent = String()
@IBOutlet weak var webView: UIWebView!
@IBOutlet weak var activityIndicator: UIActivityIndicatorView!
override func viewDidLoad() {
super.viewDidLoad()
let url = NSURL(string: "https://www.youtube.com")
let request = NSURLRequest(URL: url!)
activityIndicator.hidesWhenStopped = true
activityIndicator.startAnimating()
webView.loadRequest(request)
}
@IBAction func mobile(sender: AnyObject) {
NSUserDefaults.standardUserDefaults().registerDefaults(["UserAgent": defaultUserAgent])
print(defaultUserAgent)
let url = NSURL(string: "https://www.youtube.com")
let request = NSURLRequest(URL: url!)
activityIndicator.hidesWhenStopped = true
activityIndicator.startAnimating()
webView.loadRequest(request)
}
@IBAction func desktop(sender: AnyObject) { …Run Code Online (Sandbox Code Playgroud) 我知道SFSafariViewController有私人 cookie 存储和其他实现。但是,我知道我们可以为每个(每个本地系统)Swift 类编写一个扩展。我需要与本机 Safari 共享 cookie,或者Safari使用一些标头请求从我的应用程序打开。至少,如何创建一个API用于获取/设置 cookie 的?
safari ios swift sfsafariviewcontroller sfauthenticationsession