2016-02-16 14 views
6

W mojej aplikacji próbuję zalogować użytkownika przez UIWebView. Po pomyślnym zalogowaniu pliki cookie są ustawione w NSHTTPCookieStorage. Kilka moich stron aplikacji jest otwartych w UIWebView.Sesja nie jest utrzymywana między UIWebView

Gdy wysyłane jest żądanie określonej strony internetowej, sprawdza ona, czy użytkownik jest zalogowany, czy nie, na podstawie plików cookie.

Sprawdziłem, czy pliki cookie są obecne w NSHTTPCookieStorage, ale nie są poprawnymi plikami cookie na serwerze. Oznacza to, że uważa użytkownika za wylogowanego użytkownika.

Mój kod do załadunku UIWebView jest jak poniżej:

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

Nawet próbowałem z NSURLSession i ustawianie ciasteczek jako HTTPHeaderField. Poniżej znajduje się również mój kod:

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() 

Działa prawidłowo w kilku przypadkach. Nie mogę znaleźć problemu z plikami cookie.

Każda pomoc zostanie doceniona.

góry dzięki

+0

Rozważ próbowanie 'WKWebView' (iOS 8+). Dzięki niemu możesz skopiować właściwość 'configuration' z ostatnio używanej instancji do nowo utworzonej i _ może to zachowa pliki cookie. Alternatywnie, użyj _jednego_ wystąpienia UIWebView allover aplikacji. – werediver

+0

Mam podobny problem, proszę o pomoc –

Odpowiedz

0

Poniższy kod nie robi tego, co masz zamiar:

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

Gdy ciasteczka są wysyłane przez protokół HTTP, są one wysyłane w Cookie nagłówku formacie:

Cookie: cookie1=value1; cookie2=value2 

Tworzysz wiele nagłówków o nazwie o nazwie, więc Twoja prośba wygląda następująco:

cookie1: value1 
cookie2: value2 

Najprostszym sposobem utworzenia prawidłowych nagłówków jest NSHTTPCookie.requestHeaderFieldsWithCookies(_:[NSHTTPCookie]). Ponieważ dodaliśmy żadnych innych nagłówków, można po prostu zrobić:

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

Tak na marginesie, używasz różnych adresów URL na żądanie i patrząc w górę cookies. Powinny być takie same, jak pliki cookie mogą być ograniczone do określonych ścieżek w domenie.

+0

Dzięki @ Nick Nickel. Rozwiązałem mój problem w podobny sposób, ale zapomnij dodać odpowiedź –

Powiązane problemy