Как работать с HTTP cookies в iOS?

«Как работать с HTTP cookies в iOS?» — вопрос из категории Сети, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В iOS основная работа с HTTP cookies ведется через класс HTTPCookieStorage, который интегрирован с URLSession. Cookies автоматически сохраняются для соответствующих доменов и добавляются к последующим HTTP-запросам, если политика конфигурации сессии это позволяет.

Основные операции:

  1. Создание и сохранение cookie:

    let cookieProperties: [HTTPCookiePropertyKey: Any] = [
        .name: "sessionID",
        .value: "abc123",
        .domain: "api.example.com",
        .path: "/",
        .secure: true,
        .expires: Date().addingTimeInterval(86400)
    ]
    if let cookie = HTTPCookie(properties: cookieProperties) {
        HTTPCookieStorage.shared.setCookie(cookie)
    }
  2. Чтение cookies для конкретного URL:

    let url = URL(string: "https://api.example.com")!
    if let cookies = HTTPCookieStorage.shared.cookies(for: url) {
        for cookie in cookies {
            print("(cookie.name): (cookie.value)")
        }
    }
  3. Удаление всех cookies:

    if let cookies = HTTPCookieStorage.shared.cookies {
        for cookie in cookies {
            HTTPCookieStorage.shared.deleteCookie(cookie)
        }
    }

Ключевые нюансы:

  • WKWebView: Использует отдельное, изолированное хранилище через WKWebsiteDataStore. Для управления cookies внутри WebView необходимо использовать JavaScript или настраивать политики на уровне WKHTTPCookieStore.
  • Intelligent Tracking Prevention (ITP): Начиная с iOS 14, Safari (и WKWebView в режиме Safari) применяет строгие ограничения на сторонние cookies. Это может нарушить работу традиционных механизмов аутентификации, требующих кросс-доменных cookies.
  • Фоновые сессии: Cookies, установленные в фоновой URLSession, хранятся в памяти и не сохраняются в общее HTTPCookieStorage после завершения работы приложения.