Как установить Cookie с помощью NSURLRequest?
Я пытаюсь создать логин в своем приложении для 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
Ответы
Ответ 1
Попробуйте это
[theRequest setValue:@"myCookie" forHTTPHeaderField:@"Cookie"];
Edit:
OP хочет знать, как создать 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];
Ответ 2
не уверен, что это все еще актуально, но в случае, если кто-то найдет это полезным, вот как вы получаете файлы cookie после запроса. Вы должны реализовать селектор 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
У меня была та же проблема с 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;
?>
Он работал у меня после долгих проб и ошибок. Удачи.:)
Ответ 4
Существует исходный код для извлечения строки 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"];