Ответ
В iOS основная работа с HTTP cookies ведется через класс HTTPCookieStorage, который интегрирован с URLSession. Cookies автоматически сохраняются для соответствующих доменов и добавляются к последующим HTTP-запросам, если политика конфигурации сессии это позволяет.
Основные операции:
-
Создание и сохранение 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) } -
Чтение 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)") } } -
Удаление всех 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, сидит себе тихо и автоматом цепляет печеньки к запросам. Но как только копнёшь глубже — начинается ёперный театр.
Вот как с этим чудом работать:
-
Создать и запихнуть куку куда надо:
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) }Создал свойства, склепал из них объект и — хуяк! — в общее хранилище. Вроде просто, да? А вот нихуя.
-
Достать все печеньки для конкретного адреса:
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 есть!». Оно тебе массив вываливает. Красота.
-
Удалить всё к хуям собачьим:
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их не заносит, они там не сохраняются. Так что не удивляйся, если после перезапуска всё ебнулось.
Вот такая, блядь, история. Вроде простая штука, а под капотом — целая вселенная ебаных нюансов, которые могут так подставить, что мало не покажется.