Как установить Cookie с NSURLRequest? - PullRequest
13 голосов
/ 12 февраля 2012

Я пытаюсь создать логин в приложении для iPhone.

NSURL *urlNew = [NSURL URLWithString:urlstring];
NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:urlNew];
NSString *msgLength = [NSString stringWithFormat:@"%d", [parameterString length]];
[theRequest addValue: msgLength forHTTPHeaderField:@"Content-Length"];
[theRequest setHTTPMethod:@"POST"];
[theRequest setValue:length forHTTPHeaderField:@"Content-Length"];
[theRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[theRequest setHTTPBody: httpbody];

NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self startImmediately:YES];

[connection start];

То, как я размещаю свои данные на сервере, работает - я получаю ответ.Проблема в том, что ответом является код стороны входа в систему, а не код «сохраненной» области.Я думаю, что мне нужно создать куки, чтобы веб-сайт знал, что я вошел в систему.

Я искал в Интернете, но не нашел ничего полезного.Итак, как мне создать cookie, когда я вхожу в систему?Нужно ли мне публиковать этот файл cookie каждый раз, когда я перехожу к другой ссылке в «сохраненной» области?

Надеюсь, вы понимаете мою проблему.

Greetz

Ответы [ 4 ]

29 голосов
/ 12 февраля 2012

Попробуйте это

[theRequest setValue:@"myCookie" forHTTPHeaderField:@"Cookie"];

Edit:

ОП хочет знать, как создать cookie. Итак, вот код

NSDictionary *cookieProperties = [NSDictionary dictionaryWithObjectsAndKeys:
                        @"domain.com", NSHTTPCookieDomain,
                        @"\\", NSHTTPCookiePath,  
                        @"myCookie", NSHTTPCookieName,
                        @"1234", NSHTTPCookieValue,
                        nil];
NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:cookieProperties];
NSArray* cookieArray = [NSArray arrayWithObject:cookie];
NSDictionary * headers = [NSHTTPCookie requestHeaderFieldsWithCookies:cookieArray];
[request setAllHTTPHeaderFields:headers];
4 голосов
/ 21 марта 2014

не уверен, что это все еще актуально, но в случае, если кто-то посчитает это полезным, вот как вы получаете куки после выполнения запроса. Вы должны реализовать селектор connectionDidFinishLoading: в объекте, который был указан как делегат для NSURLConnection (self в вашем случае):

NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self startImmediately:YES];

в связи с этимDidFinishLoading: селектор, вы можете получить доступ к таким файлам cookie:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSHTTPCookieStorage * storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
    NSArray * cookies = [storage cookiesForURL:connection.currentRequest.URL];
    for (NSHTTPCookie * cookie in cookies)
    {
        NSLog(@"%@=%@", cookie.name, cookie.value);
        // Here you can store the value you are interested in for example
    }
}

потом, это сохраненное значение можно использовать в таких запросах:

[request setValue:[NSString stringWithFormat:@"%@=%@", cookieName, cookieValue] forHTTPHeaderField:@"Cookie"];

или более расширенный setAllHTTPHeaderFields:, но не забывайте использовать правильное значение в поле NSHTTPCookiePath, подробности см. Здесь

также NSHTTPCookieStorage имеет селектор -setCookies:forURL:mainDocumentURL:, который также можно использовать для установки файлов cookie.

3 голосов
/ 11 ноября 2015

У меня была такая же проблема с WKWebView, показывающим cookie на странице PHP при начальной загрузке, но cookie был очищен, когда страница была перезагружена / обновлена. Вот что я сделал, чтобы это работало.

Мой WKWebView с настройкой cookie:

WKWebViewConfiguration *webViewConfig = [[WKWebViewConfiguration alloc] init]; // empty for now
_awesomeWebView = [[WKWebView alloc] initWithFrame:self.view.frame configuration:webViewConfig];
_awesomeWebView.UIDelegate = self;
[self.view addSubview:_awesomeWebView];

NSString *url = @"https://phpwebsitewithcookiehandling.com";
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];

// set all the cookies from my NSHTTPCookieStorage in the WKWebView too
[request setHTTPShouldHandleCookies:YES];
[request setAllHTTPHeaderFields:[NSHTTPCookie requestHeaderFieldsWithCookies:[NSHTTPCookieStorage sharedHTTPCookieStorage].cookies]];

// set the cookie on the initial load
NSString *cookie = @"status=awesome";
[request setValue:cookie forHTTPHeaderField:@"Cookie"];
NSLog(@"cookie set in WKwebView header: %@", cookie);

[_awesomeWebView loadRequest:request];

На моем phpwebsitewithcookiehandling.com я использовал следующее, чтобы убедиться, что это работает:

<?php
    echo "<li>status is: " . $_COOKIE['status'];

    // Here comes the magic which set the servers SET-COOKIE header (apparently) so it works on consecutive page loads
    setcookie('status', $_COOKIE['status'], time() + (86400 * 30), '/');

    echo '<li><a href="">Blank reload</a>';
    echo '<li><a href="#" onclick="location.reload(true);">Javascript reload</a>';

    exit;
?>

Это сработало для меня после долгих проб и ошибок. Удачи. :)

0 голосов
/ 27 сентября 2016

Существует исходный код для извлечения строки cookie из NSHTTPURLResponse:

static NSString *CookieFromResponse(NSHTTPURLResponse *response) {
    NSArray<NSHTTPCookie *> *cookies = [NSHTTPCookie cookiesWithResponseHeaderFields:response.allHeaderFields forURL:response.URL];

    NSMutableString *cookieStr = [NSMutableString string];
    for (NSHTTPCookie *cookie in cookies) {
        if (cookieStr.length) {
            [cookieStr appendString:@"; "];
        }
        [cookieStr appendFormat:@"%@=%@", cookie.name, cookie.value];
    }
    return cookieStr.length ? cookieStr : nil;
}

И установить строку cookie на NSMutableURLRequest:

NSString *cookieStr = CookieFromResponse(response);
[request addValue:cookieStr forHTTPHeaderField:@"Cookie"];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...