2010-10-30 4 views
4

У меня возникают некоторые странные проблемы с NSHTTPCookieStorage в моем приложении для iPhone. Когда я вызываю действие входа в мою веб-службу, служба отправляет обратно файл cookie с именем «auth», а также некоторые другие файлы cookie.Почему NSHTTPCookieStorage не сохраняет файлы cookie?

Когда я регистрирую пользователя, я вызываю действие выхода на сервер, который удаляет файлы cookie. Если я печатаю результат [cookie NSHTTPCookieStorage] перед вызовом выхода из системы, я вижу файл cookie, как и ожидалось. После того, как я выхожу из системы, я вижу, что auth cookie больше не существует (как и ожидалось).

Однако, если я закрою приложение и перезагрузите его, файл cookie auth вернется!

Я не уверен, что здесь происходит. Одно дело, если NSHTTPCookieStorage просто не сохранял файлы cookie, но, похоже, некоторые из них сохраняют.

Кто-нибудь знает, что происходит? Мне нужно управлять файлами вручную? Есть ли способ зафиксировать то, что находится в NSHTTPCookieStorage на диске?

+0

Я также вижу связанное поведение, когда я получаю cookie из веб-запроса, подтверждаю его существование, а затем закрываю приложение через несколько секунд (и удаляю его из фонового лотка), cookie не существует когда я запускаю приложение. Однако это непротиворечиво. –

+0

Абрагинский: К сожалению, это то, что я тоже видел. Я решил проблему, сохранив соответствующие файлы cookie в NSUserDefaults и заполнив NSHTTPURLCookieStorage из пользовательских настроек по умолчанию при запуске приложения. Он выполняет свою работу, но было бы неплохо выяснить, что случилось с NSHTTPCookieStorage. – Bill

+0

Да, я видел то же обходное решение, и в настоящее время я работаю над его внедрением. Необходимо убедиться, что NSUserDefault обновляется с помощью файлов cookie достаточно быстро, прежде чем пользователь прекратит приложение из фонового лотка. Ввод его в «завершение» не будет работать, поскольку он не вызывается (по крайней мере, в симуляторе). –

ответ

1

Существует три локальных механизма хранения связанных URL-адресов, которые влияют на то, как обрабатываются проблемы проверки подлинности: (очевидно) NSHTTPCookieStorage, NSURLCredentialStorage и NSURLCache. NSURLCredentialStorage, вероятно, следующее место, на которое вы должны смотреть, но очистка всех кешей обычно считается самым надежным способом добиться желаемого эффекта.

Этот фрагмент удобен: https://gist.github.com/559071 (очищает все кеши).

+0

Пробовал, что. Если я посмотрю на [файлы cookie NSHTTPCookieStorage] сразу после выполнения удаления, они исчезнут; но когда я снова открываю приложение, [cookie NSHTTPCookieStorage] имеет файлы cookie, которые он изначально имел! – Bill

+0

Извините, я думал, что вы внедрили для этого другой механизм. У меня есть другая идея ... –

+0

Отредактирован мой первоначальный ответ. Надеюсь, поможет. –

0

Ник, я предполагаю, что вы строите IOS 4.x SDK с XCode 3.x. Это может быть длинный выстрел, но вы упомянули, что закрываете приложение, а затем снова запускаете его. Начиная с IOS 4.x, многозадачность включена по умолчанию в приложениях iPhone. Это означает, что вы хотите этого или нет, ваше приложение останется в памяти, если вы просто закроете его как обычно. Чтобы победить это, зайдите в ваше приложение-имя-Info.plist и добавьте в список ключ «Приложение не работает в фоновом режиме». Затем установите флажок. Я бы порекомендовал вам выполнить полную очистку и построить на этом этапе после сохранения вашего проекта. Кроме того, рекомендуется, чтобы при запуске в симуляторе вы полностью сбросили симулятор, выбрав «iPhone Simulator», а затем «Сбросить содержимое и параметры» в раскрывающемся меню приложения.

+0

Это был я (Билл), который задал оригинальный вопрос :) – Bill

0

У меня также была та же проблема, и я решил ее с помощью NSUserDefaults.

Обратитесь к this link.

Смежные вопросы