swift - UIWebView 之间不维护 session

标签 swift uiwebview nsurlconnection nshttpcookiestorage

在我的应用程序中,我试图通过 UIWebView 登录用户。成功登录后,cookie 将设置在 NSHTTPCookieStorage 中。我的应用程序页面很少在 UIWebView 中打开。

当发送特定网页的请求时,它会根据 cookie 检查用户是否登录。

我检查过 cookie 存在于 NSHTTPCookieStorage 中,但在服务器上不是有效的 cookie。也就是说,它将用户视为已注销的用户。

我加载 UIWebView 的代码如下:

let url = serverURL + urlString
let urlRequest = NSMutableURLRequest(URL: NSURL(string: url)!)
webPage.loadRequest(urlRequest)

即使我尝试使用 NSURLSession 并将 cookie 设置为 HTTPHeaderField。下面也是我的代码:

let URLRequest: NSMutableURLRequest = NSMutableURLRequest(URL: NSURL(string: url)!)

let cookies = NSHTTPCookieStorage.sharedHTTPCookieStorage().cookiesForURL(NSURL(string: serverURL)!)
for cookie in cookies!{
    URLRequest.setValue(cookie.value, forHTTPHeaderField: cookie.name)
}

let sessionConfig = NSURLSessionConfiguration.defaultSessionConfiguration()
let session = NSURLSession(configuration: sessionConfig, delegate: self, delegateQueue: nil)

let task = session.downloadTaskWithRequest(URLRequest)
task.resume()

它在少数情况下工作正常。我找不到 cookie 可能有什么问题。

我们将不胜感激。

提前致谢

最佳答案

以下代码不符合您的预期:

for cookie in cookies!{
    URLRequest.setValue(cookie.value, forHTTPHeaderField: cookie.name)
}

当通过 HTTP 发送 cookie 时,它​​们在格式为 Cookie 的 header 中发送:

Cookie: cookie1=value1; cookie2=value2

您正在创建多个 header 命名 cookie 名称,因此您的请求看起来像:

cookie1: value1
cookie2: value2

创建正确 header 的最简单方法是使用 NSHTTPCookie.requestHeaderFieldsWithCookies(_:[NSHTTPCookie])。由于您没有添加其他 header ,您可以简单地执行以下操作:

if let cookies = NSHTTPCookieStorage.sharedHTTPCookieStorage().cookiesForURL(NSURL(string: serverURL)!) {
    URLRequest.allHTTPHeaderFields = NSHTTPCookie.requestHeaderFieldsWithCookies(cookies)
}

顺便说一句,您正在为您的请求和查找 cookie 使用不同的 URL。它们应该与 cookie 可以限定在域中的特定路径一样。

关于swift - UIWebView 之间不维护 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35429524/

相关文章:

ios - Swift 将 unix 时间转换为日期和时间

objective-c - 我如何获得 MPAVController "setting movie path"

iphone - NSURLConnection 固有的内存泄漏?

xml - 下载多个文件会将相同的数据写入所有文件

ios - iOS 中的 NSURLConnection 和基本 HTTP 身份验证

swift - 如何使用 swift 在单个消息 Telegram Bot 中发送照片、标题和内联按钮?

swift - Swift 2.2+ 中类型的上下文类型推断

iphone - 从 UIWebView 中的电影播放器​​获取通知

iphone - UIWebView 事件并按住以选择/复制

swift - 如何在 watchOS 复杂功能中显示图像