Сессия не поддерживается между UIWebView

В моем приложении я пытаюсь войти в систему через UIWebView. При успешном входе в систему устанавливаются куки NSHTTPCookieStorage, Немногие страницы моего приложения открыты в UIWebView.

Когда отправляется запрос на определенную веб-страницу, он проверяет, вошел ли пользователь в систему или нет, основываясь на файлах cookie.

Я проверил, что куки присутствуют в NSHTTPCookieStorage, но не являются действительными куки на сервере. То есть пользователь считает пользователя, вышедшего из системы.

Мой код для загрузки 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.

Любая помощь будет оценена.

заранее спасибо

1 ответ

Решение

Следующий код не делает то, что вы намереваетесь:

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

Когда куки отправляются по HTTP, они отправляются в Cookie заголовок формата:

Cookie: cookie1=value1; cookie2=value2

Вы создаете несколько заголовков с именем cookie, поэтому ваш запрос выглядит так:

cookie1: value1
cookie2: value2

Самый простой способ создать правильные заголовки NSHTTPCookie.requestHeaderFieldsWithCookies(_:[NSHTTPCookie]), Поскольку вы не добавили никаких других заголовков, вы можете просто сделать:

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

Кроме того, вы используете разные URL-адреса для запроса и поиска файлов cookie. Они должны быть такими же, как файлы cookie, могут быть определены по определенным путям в домене.

Другие вопросы по тегам