Как работать с HTTP cookies в 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 после завершения работы приложения.

Ответ 18+ 🔞

Слушай, с этими куками в iOS история отдельная, просто пиздец какой-то цирк. Вроде бы всё просто: есть HTTPCookieStorage, он прикручен к URLSession, сидит себе тихо и автоматом цепляет печеньки к запросам. Но как только копнёшь глубже — начинается ёперный театр.

Вот как с этим чудом работать:

  1. Создать и запихнуть куку куда надо:

    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. Достать все печеньки для конкретного адреса:

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

    Спрашиваешь у хранилища: «Ну-ка, покажи, что у тебя для этого URL есть!». Оно тебе массив вываливает. Красота.

  3. Удалить всё к хуям собачьим:

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

    Просто берёшь и проходишься по всем, удаляя по одной. Элегантно, блядь. Хотя иногда хочется просто HTTPCookieStorage.shared = nil, но так низя.

А теперь, внимание, главные подводные ебланы:

  • WKWebView — это отдельная банда с районом. У него своя, изолированная камера хранения — WKWebsiteDataStore. Ты в своём приложении куки положил, а вебвью их нихуя не видит. Чтобы там управлять печеньками, надо либо через JS колупаться, либо через его родной WKHTTPCookieStore. Полный пиздец и раздвоение личности.

  • Intelligent Tracking Prevention (ITP). Это, сука, такой зверь от Apple, который с iOS 14 начал крошить сторонние куки в Safari и в WKWebView. Твою красиво собранную схему аутентификации, которая десять лет работала, может нахуй разнести, потому что «кросс-доменные куки — это небезопасно». Волнение ебать, когда всё ломается, а пользователи орут.

  • Фоновые сессии — призраки. Запомни раз и навсегда: куки, которые рождаются в фоновой URLSession, живут только в оперативке. Закрыл приложение — они испарились, как сон. В общее HTTPCookieStorage их не заносит, они там не сохраняются. Так что не удивляйся, если после перезапуска всё ебнулось.

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