Не удалось создать cookie с помощью "NSHTTPCookie cookieWithProperties"

Я использую следующий код для создания куки, но не удалось.(IOS SDK 5)

// add cookie
NSDictionary *properties = [NSDictionary dictionaryWithObjectsAndKeys:
                            req.URL, NSHTTPCookieOriginURL,
                            @"MLSTORAGE", NSHTTPCookieName,
                            @"1234567890", NSHTTPCookieValue,
                            nil];
NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:properties];
NSLog(@"\nurl: %@\ncookie: %@", req.URL, cookie);
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
//

журнал это:

2012-07-26 18:30:49.914 Motilink[15289:707] -[FMWebDAVRequest sendRequest:][Line 154] 
url: http://210.116.114.195:8080/MLServer/storage/
cookie: (null)

Кто-нибудь знает, как создать печенье?

4 ответа

Кажется, что есть проблема при использовании NSHTTPCookieOriginURL с URL вашего запроса.

Попробуйте использовать этот код, он работает для меня:

// add cookie
    NSDictionary *properties = [NSDictionary dictionaryWithObjectsAndKeys:
                                req.URL.host, NSHTTPCookieDomain,
                                req.URL.path, NSHTTPCookiePath,
                                @"MLSTORAGE", NSHTTPCookieName,
                                @"1234567890", NSHTTPCookieValue,
                                nil];
    NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:properties];
    NSLog(@"\nurl: %@\ncookie: %@", req.URL, cookie);
    [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
    //

Однако я не знаю почему NSHTTPCookieOriginURL здесь не работает

Надеюсь это поможет,

Я встречал тот же вопрос. Когда я посмотрел документацию и обнаружил, что для свойств требуются только "name", "value" и "originURL" или "domain", я попытался, но не получилось. После того, как я добавил "путь", и это сработало. Потому что я точно не понял, что если вы просто предоставляете "домен", отличный от "originURL", то также требуется "путь".

<tr>
    <th>Property key constant</th>
    <th>Type of value</th>
    <th>Required</th>
    <th>Description</th>
</tr>
<tr>
    <td>NSHTTPCookieName</td>
    <td>NSString</td>
    <td>YES</td>
    <td>Name of the cookie</td>
</tr>
<tr>
    <td>NSHTTPCookieValue</td>
    <td>NSString</td>
    <td>YES</td>
    <td>Value of the cookie</td>
</tr>
<tr>
    <td>NSHTTPCookieDomain</td>
    <td>NSString</td>
    <td>Special, a value for either NSHTTPCookieOriginURL or
    NSHTTPCookieDomain must be specified.</td>
    <td>Domain for the cookie. Inferred from the value for
    NSHTTPCookieOriginURL if not provided.</td>
</tr>
<tr>
    <td>NSHTTPCookieOriginURL</td>
    <td>NSURL or NSString</td>
    <td>Special, a value for either NSHTTPCookieOriginURL or
    NSHTTPCookieDomain must be specified.</td>
    <td>URL that set this cookie. Used as default for other fields
    as noted.</td>
</tr>
<tr>
    <td>NSHTTPCookiePath</td>
    <td>NSString</td>
    <td>NO</td>
    <td>Path for the cookie. Inferred from the value for
    NSHTTPCookieOriginURL if not provided. Default is "/".</td>
</tr>

Окончательный код ниже:

NSMutableDictionary *cookieProperties = [NSMutableDictionary dictionary];
[cookieProperties setObject:@"SESSION" forKey:NSHTTPCookieName];
[cookieProperties setObject:@"value" forKey:NSHTTPCookieValue];
[cookieProperties setObject:@".domain.com" forKey:NSHTTPCookieDomain];
[cookieProperties setObject:@"/" forKey:NSHTTPCookiePath];
NSHTTPCookie *co = [NSHTTPCookie cookieWithProperties:cookieProperties];
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:co];

Чтобы успешно создать файл cookie, необходимо указать значения (как минимум) ключей NSHTTPCookiePath, NSHTTPCookieName и NSHTTPCookieValue, а также ключа NSHTTPCookieOriginURL или ключа NSHTTPCookieDomain.

Это может быть полезно для установки массива файлов cookie в NSHTTPCookieStorage. Я столкнулся с этой проблемой, и я решил с помощью кода ниже. Надеюсь, это будет полезно для тех, кто пытается установить массив файлов cookie.

 NSDictionary *cookieProperties = [NSDictionary dictionaryWithObjectsAndKeys:
                                  @".domain.com", NSHTTPCookieDomain,
                                  @"/", NSHTTPCookiePath,
                                  @"SESSION", NSHTTPCookieName,
                                  @"Session value",NSHTTPCookieValue,nil];
NSDictionary *cookieProperties1 = [NSDictionary dictionaryWithObjectsAndKeys:
                                  @".domain.com", NSHTTPCookieDomain,
                                  @"/", NSHTTPCookiePath,
                                  @"some cookie", NSHTTPCookieName,
                                  @"some cookie value",NSHTTPCookieValue,nil];

NSHTTPCookie *cookie1 = [NSHTTPCookie cookieWithProperties:cookieProperties1];
NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:cookieProperties];
NSArray* cookieArray = [NSArray arrayWithObjects: cookie,cookie1, nil];
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookies:cookieArray forURL:[NSURL   URLWithString:urlString] mainDocumentURL:nil];

Вы можете перепроверить ваши куки, используя код ниже.

[[[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

    NSLog(@"Printing cookies %@", obj);
}];
Другие вопросы по тегам