Можно ли установить cookie вручную, используя sharedHTTPCookieStorage для UIWebView? - PullRequest
72 голосов
/ 10 мая 2011

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

Эта запись показывает нам, где хранятся файлы cookie UIWebView.

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

Ответы [ 4 ]

138 голосов
/ 10 мая 2011

Да, вы можете сделать это.Во-первых, в applicationDidBecomeActive добавьте эту строку

[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];

CookieAcceptPolicy используется всеми приложениями и может быть изменен без вашего ведома, поэтому вы должны быть уверены, что у вас есть политика принятия, которая вам нужна при каждом запуске приложения.

Затем, чтобы установить cookie:

NSMutableDictionary *cookieProperties = [NSMutableDictionary dictionary];
[cookieProperties setObject:@"testCookie" forKey:NSHTTPCookieName];
[cookieProperties setObject:@"someValue123456" forKey:NSHTTPCookieValue];
[cookieProperties setObject:@"www.example.com" forKey:NSHTTPCookieDomain];
[cookieProperties setObject:@"www.example.com" forKey:NSHTTPCookieOriginURL];
[cookieProperties setObject:@"/" forKey:NSHTTPCookiePath];
[cookieProperties setObject:@"0" forKey:NSHTTPCookieVersion];

// set expiration to one month from now or any NSDate of your choosing
// this makes the cookie sessionless and it will persist across web sessions and app launches
/// if you want the cookie to be destroyed when your app exits, don't set this
[cookieProperties setObject:[[NSDate date] dateByAddingTimeInterval:2629743] forKey:NSHTTPCookieExpires];

NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:cookieProperties];
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];

Этот cookie имеет имя testCookie и значение someValue123456 и будет отправлен с любым запросом http на www.example.com.

Чтобы задать один большой вопрос о настройке файлов cookie, см. Мой вопрос здесь!

Состояние NSHTTPCookieStorage не сохраняется при выходе из приложения.Есть какие-то окончательные знания / документация?

14 голосов
/ 10 мая 2011

Редактировать: адаптация для отредактированного вопроса

NSHTTPCookieStorage имеет метод -setCookies:forURL:mainDocumentURL:, поэтому проще всего использовать NSURLConnection и внедрить -connection:didReceiveResponse:, извлекая кукии вставив их в баночку с печеньем:

- ( void )connection: (NSURLConnection *)connection
          didReceiveResponse: (NSURLResponse *)response
{
    NSHTTPURLResponse        *httpResponse = (NSHTTPURLResponse *)response;
    NSArray                  *cookies;

    cookies = [ NSHTTPCookie cookiesWithResponseHeaderFields:
                             [ httpResponse allHeaderFields ]];
    [[ NSHTTPCookieStorage sharedHTTPCookieStorage ]
            setCookies: cookies forURL: self.url mainDocumentURL: nil ];
}

(Вы также можете просто извлечь объект NSDictionary из NSHTTPCookie с помощью properties, а затем записать словарь на диск.Это так же просто, как использовать NSDictionary -dictionaryWithContentsOfFile:, а затем создать файл cookie с помощью -initWithProperties:.)

Затем вы можете извлечь файл cookie из хранилища, когда оно вам понадобится:

- ( void )reloadWebview: (id)sender
{
    NSArray                 *cookies;
    NSDictionary            *cookieHeaders;
    NSMutableURLRequest     *request;

    cookies = [[ NSHTTPCookieStorage sharedHTTPCookieStorage ]
                cookiesForURL: self.url ];
    if ( !cookies ) {
        /* kick off new NSURLConnection to retrieve new auth cookie */
        return;
    }

    cookieHeaders = [ NSHTTPCookie requestHeaderFieldsWithCookies: cookies ];
    request = [[ NSMutableURLRequest alloc ] initWithURL: self.url ];
    [ request setValue: [ cookieHeaders objectForKey: @"Cookie" ]
              forHTTPHeaderField: @"Cookie" ];

    [ self.webView loadRequest: request ];
    [ request release ];
}
6 голосов
/ 25 апреля 2017

В Swift 3 все ключи заключены в структуру HTTPCookiePropertyKey:

let cookieProperties: [HTTPCookiePropertyKey : Any] = [.name : "name",
                                                       .value : "value",
                                                       .domain : "www.example.com",
                                                       .originURL : "www.example.com",
                                                       .path : "/",
                                                       .version : "0",
                                                       .expires : Date().addingTimeInterval(2629743)
                                                      ]

if let cookie = HTTPCookie(properties: cookieProperties) {
    HTTPCookieStorage.shared.setCookie(cookie)
}
1 голос
/ 24 ноября 2016

Необходимо обойти ограничения на файлы cookie, введенные iOS 10, что делает их невидимыми для различных процессов.

Это означает, что на устройствах с возможностью многопроцессорной обработки веб-просмотры являются отдельным процессом, а не вашим приложением, что означает, что ваш сеанс "приложения" больше не передается в веб-просмотр автоматически.

Так что, по сути, вам нужно будет это сделать (даже если предыдущие плакаты были там, где это было правильно, он работал автоматически до iOS10).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...