Как использовать AFNetworking для сохранения cookie навсегда, пока приложение не будет удалено с iPhone?

Может кто-нибудь, пожалуйста, покажите мне, как сохранить cookie FOREVER, используя AFNetworking для iOS? Я использую ios7, но я думаю, что это не имеет значения?

Вариант использования заключается в том, что при успешной аутентификации с помощью webservice он дает мне два куки, которые мне нужно передать вместе с каждым одним запросом. Эти куки никогда не истекают, или истекают годы с этого момента. Пока у меня есть файлы cookie с каждым запросом HTTPS, пользователю не нужно снова входить в систему. Я понимаю, что AFNetworking автоматически сохраняет файлы cookie до тех пор, пока вы не покинете приложение, но мне нужно, чтобы файлы cookie продолжались вечно до тех пор, пока пользователь не удалит приложение со своего телефона.

1) После успешной аутентификации веб-сервис вручит мне два файла cookie. Как мне получить к ним доступ? Я иду прямо в хранилище NSHTTPCookie и хватаю куки по его названию, или есть ли способ "AFNetworking" для этого?

2) Как сохранить эти два волшебных куки навсегда, чтобы мой подкласс AFHTTPClient прошел эти два волшебных куки вместе с каждым запросом? Я просто сохраняю их в цепочке ключей или NSUserDefaults или NSURLCredentialsStorage? Или снова есть способ AFNetworking сделать это? Я читал о методе setAuthorization() внутри AFNetworking, но я не уверен, что это относится к имени пользователя и паролю, а также к файлам cookie.

3) Как удалить эти куки файлы в формате AFNetworking?

Спасибо!!

Ответ 1

AFNetworking не делает ничего явно с файлами cookie, поэтому нет способа "AFNetworking" для работы с файлами cookie. Вы будете работать с NSHTTPCookie и NSHTTPCookieStorage.

В моих проектах мне не нужно было делать что-то конкретное для запросов, чтобы заставить их работать с файлами cookie. Если вам требуется различное поведение запроса, чем предоставляется AFNetworking по умолчанию, вы переопределяете requestWithMethod:path:parameters: в подклассе AFHTTPClient.

  • Чтобы получить куки, возвращенные из AFJSONRequest, например

    NSURLRequest* request = <some request returned from your AFHTTPClient subclass>
    AFJSONRequestOperation* op = [AFJSONRequestOperation JSONRequestOperationWithRequest:request 
     success:^(NSURLRequest* request, NSHTTPURLResponse* response, id userData) {
        NSArray* cookies = [NSHTTPCookie cookiesWithResponseHeaderFields:[response allHeaderFields] forURL:url];
     }
     failure:...
    
  • Этот ответ говорит, чтобы установить дату истечения срока действия cookie. Если вы хотите сохранить файлы cookie самостоятельно, вы можете преобразовать файлы cookie в словарь и сохранить их. В этом ответе говорится, что нужно использовать цепочку ключей.

    NSMutableDictionary* cookieDictionary = [NSMutableDictionary dictionaryWithDictionary:cookiePrefs];
    for (NSHTTPCookie* cookie in cookies) {
       [cookieDictionary setValue:cookie.properties forKey:cookie.name];
    }
    
  • Удалите файлы cookie из NSHTTPCookieStorage. Существует некоторая хитрость, которой нужно следить. Если вы сами сохранили файлы cookie, удалите сохраненные значения.

    NSArray* cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:theUrl];
    for (NSHTTPCookie* cookie in cookies) {
       [[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie];
    }