Получить куки от NSHTTPURLResponse

У меня очень странная проблема, я запрашиваю URL-адрес и хочу получить от него файлы cookie. Я использовал этот способ для получения файлов cookie:

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

НО куки не заполнены, некоторые поля отсутствуют, я проверил их на PostMan, все куки есть.

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

[request setHTTPShouldHandleCookies:YES];

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

ПРИМЕЧАНИЕ: эта проблема на iOS, у меня есть версия для Android, и она работает нормально, и все куки есть.

4 ответа

Решение

@biloshkurskyi.ss ответ на месте.

Я потратил полдня, пытаясь выяснить, почему некоторые из моих cookie-файлов не появились в моем response.allHeaderFields на iOS, но они были там на Android (используя тот же сервис).

Причина в том, что некоторые файлы cookie извлекаются заранее и хранятся в общем хранилище файлов cookie. Они не появятся во всех заголовочных полях.

Вот быстрый вариант ответа 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()

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

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

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

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]);
}
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]);
}

Второй код:

NSHTTPURLResponse *HTTPResponsesss = (NSHTTPURLResponse *)response;
NSDictionary *fields = [HTTPResponsesss allHeaderFields];
NSString *cookie = [fields valueForKey:@"Set-Cookie"]; // It is your cookie

NSLog (@ "% @", cookie);

Оба кода работают нормально.

Это сработает.

NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
        NSString *cookieValue = @"";
        NSString *cookieHeaderValue = @"";
        NSString *finalCookieValue = @"";
        
        for (NSHTTPCookie *each in cookieStorage.cookies) {
            if ([each.name isEqualToString:@"ASP.NET_SessionId"]) {
                cookieHeaderValue = [cookieHeaderValue stringByAppendingString:each.name];
                cookieHeaderValue = [cookieHeaderValue stringByAppendingString:@"="];
                cookieHeaderValue = [cookieHeaderValue stringByAppendingString:each.value];
                cookieHeaderValue = [cookieHeaderValue stringByAppendingString:@";"];
            } else {
                cookieValue = [cookieValue stringByAppendingString:each.name];
                cookieValue = [cookieValue stringByAppendingString:@"="];
                cookieValue = [cookieValue stringByAppendingString:each.value];
                cookieValue = [cookieValue stringByAppendingString:@";"];
            }
        }
        
        finalCookieValue = [NSString stringWithFormat:@"%@%@", cookieHeaderValue, cookieValue];
Другие вопросы по тегам