2012-02-12 4 views
11

Я пытаюсь создать логин в своем приложении для iPhone.Как установить Cookie с NSURLRequest?

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

+0

Вы должны изменить свой вопрос «Как получить Cookie с NSURLRequest? " так как вы сказали, что хотите, чтобы существующий cookie не создавал новый. – Maziyar

ответ

27

Попробуйте

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

Edit:

ОП хочет знать, как создать печенье. Так вот некоторый код

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]; 
+0

Спасибо, но я этого не выношу. Для «myCookie» я должен что-то заполнить? – Schmarsi

+0

При первом входе в систему мне нужно создать cookie, о котором я думал. Чтобы загрузить другую ссылку, я должен отправить этот созданный файл cookie с запросом, не так ли? Как я могу справиться с этим? – Schmarsi

+0

См. Отредактированный код выше. – mbh

4

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

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

в этом connectionDidFinishLoading селектор: Вы можете получить доступ к куки так:

- (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 поле, детали here

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

2

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

Мой WKWebView с установкой печенья:

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

Существует исходный код для извлечения печенья строки из 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; 
} 

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

NSString *cookieStr = CookieFromResponse(response); 
[request addValue:cookieStr forHTTPHeaderField:@"Cookie"]; 
Смежные вопросы