2013-09-28 2 views
5

Я чрезвычайно странные проблемы, я с просьбой о URL, и я хочу, чтобы получить печенье из этого, я использовал этот способ, чтобы получить печенье:Получить печенье из NSHTTPURLResponse

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{ 
    NSHTTPURLResponse *HTTPResponse = (NSHTTPURLResponse *)response; 
    NSDictionary *fields = [HTTPResponse allHeaderFields]; 
    NSString *cookie = [fields valueForKey:"Set-Cookie"]; 
} 

НО куки-файлы не заполнены, нет поля, я проверил его на PostMan, все файлы cookie есть.

Я использовал этот метод при запуске NSURLRequest.

[request setHTTPShouldHandleCookies:YES]; 

В чем проблема?

ПРИМЕЧАНИЕ. Эта проблема на iOS, у меня есть версия для Android, и она работает нормально, и все файлы cookie есть.

+1

Получить Charles Proxy (бесплатно в течение месяца) и посмотреть на то, что посылается сервером. – zaph

+0

@Zaph Я тестировал сервер в приложении Android, все файлы cookie отображаются, но в iOS некоторые из файлов cookie отсутствуют. – Scar

+0

'NSHTTPCookieStorage' является возможным решением. Но нет никакой возможности взглянуть на то, что сервер отправляет. Возможно, сервер подключается к пользовательскому агенту и отправляет другой файл cookie или что-то еще. Чарльз прост в использовании и даже работает с SSL. – zaph

ответ

6

@ biloshkurskyi.ss ответа пятно на.

Я потратил полдня, пытаясь выяснить, почему некоторые мои файлы cookie не появлялись в моем ответе.

Причина в том, что некоторые файлы cookie извлекаются заранее и хранятся в общем хранилище файлов cookie. Они не будут отображаться во всехHeaderFields.

Вот скор 3 вариант ответа, если кто нуждается в этом:

let request = URLRequest(url: myWebServiceUrl) 
let session = URLSession.shared 
let task = session.dataTask(with: request, completionHandler: { 
    (data, response, error) in 
    if let error = error { 
     print("ERROR: \(error)") 
    } else { 
     print("RESPONSE: \(response)") 
     if let data = data, let dataString = String(data: data, encoding: .utf8) { 
      print("DATA: " + dataString) 
     } 
     for cookie in HTTPCookieStorage.shared.cookies! { 
      print("EXTRACTED COOKIE: \(cookie)") //find your cookie here instead of httpUrlResponse.allHeaderFields 
     } 
    } 
}) 
task.resume() 
+1

Вы спасатель жизни! Есть так много вопросов об этом с неправильным ответом (с использованием cookiesWithResponseHeaderFields), и у вас есть правильный. Я потратил бесчисленные часы, пытаясь понять это. Спасибо. –

11

ли Вы пробовали следующий пример кода, он должен работать:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{ 
    NSArray *cookies =[[NSArray alloc]init]; 
    cookies = [NSHTTPCookie 
     cookiesWithResponseHeaderFields:[response allHeaderFields] 
     forURL:[NSURL URLWithString:@""]]; // send to URL, return NSArray 
} 
+0

То же самое, «Set-Cookie» не содержит всех файлов cookie. – Scar

+0

Если сервер не отправляет * cookie, клиент не может * иметь * cookie. – ipmcc

+1

@ipmcc. Он отправляет файл cookie, но не все файлы cookie для iOS, при использовании одной и той же службы на android, он возвращает все файлы cookie. – Scar

7

Попробуйте этот код:

for (NSHTTPCookie *cookie in [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]) 
{ 
    NSLog(@"name: '%@'\n", [cookie name]); 
    NSLog(@"value: '%@'\n", [cookie value]); 
    NSLog(@"domain: '%@'\n", [cookie domain]); 
    NSLog(@"path: '%@'\n", [cookie path]); 
} 
+0

Просто хедз-ап, это не работает в OSX, когда приложение имеет песочницу включен –

 Смежные вопросы

  • Нет связанных вопросов^_^