Можно ли установить cookie вручную с помощью sharedHTTPCookieStorage для UIWebView?


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

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

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

4 71

4 ответа:

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

[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];

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

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

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.

для одного большого предостережения к установке куки, пожалуйста, смотрите мой вопрос здесь!

состояние nshttpcookiestorage не сохраняется при выходе из приложения. Любые окончательные знания / документация там?

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

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 ' s -dictionaryWithContentsOfFile: а затем создание файла cookie с помощью -initWithProperties:.)

затем вы можете вытащить печенье из хранилища, когда вам это нужно:

- ( 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 ];
}

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

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)
}

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

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

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