URLSession использовать пользовательское CookieStorage на iOS?

Мне нужна urlsession, которая хранит куки в отдельном cookieStorage

В следующем коде cookieStorage в urlSession - это то же самое, что и cookieStorage для общих ресурсов. Можно ли создать отдельное хранилище cookie?

    let config = URLSessionConfiguration.default
    session = URLSession(configuration: config)
    config.httpCookieAcceptPolicy = .always
    session.configuration.httpCookieStorage = HTTPCookieStorage.sharedCookieStorage(forGroupContainerIdentifier: "adfadf")

    let task = session.dataTask(with: URL(string: "https://www.google.com")!) { (data, response, error) in
        print((response as? HTTPURLResponse)?.allHeaderFields ?? "")

        DispatchQueue.main.async {
            print(self.session.configuration.httpCookieStorage?.cookies ?? "wtf")
            print(HTTPCookieStorage.shared === self.session.configuration.httpCookieStorage)
        }
    }

    task.resume()

Тот же результат, если я инициализирую хранилище cookie, используя HTTPCookieStorage()

РЕДАКТИРОВАТЬ

Я попытался создать хранилище cookie вручную и добавить в него файлы cookie после завершения запроса.

let cookies = HTTPCookie.cookies(withResponseHeaderFields: headers, for: url)
 // cookies is not empty
self.cookieStore.setCookies(cookies, for: url, mainDocumentURL: nil)
print(self.cookieStore.cookies) //result is nil

и в конце я получаю ноль как печенье

2 ответа

По-видимому HTTPCookieStorage.sharedCookieStorage(forGroupContainerIdentifier: "groupName") кажется, работает только на iOS 10+, на iOS 9 он вернет ноль, даже если документация говорит @available(iOS 9.0, *) open class func sharedCookieStorage(forGroupContainerIdentifier identifier: String) -> HTTPCookieStorage

Вы можете использовать этот обходной путь:

let cookies: HTTPCookieStorage
    if #available(iOS 10.0, *) {
        cookies = HTTPCookieStorage.sharedCookieStorage(forGroupContainerIdentifier: "groupName")
    } else {
        cookies = HTTPCookieStorage.shared
    }

Если вы откроете файл заголовка для NSHTTPCookieStorage вы увидите эту документацию (по какой-то причине эти данные не отображаются в обычной документации).

/*!
    @method sharedCookieStorageForGroupContainerIdentifier:
    @abstract Get the cookie storage for the container associated with the specified application group identifier
    @param identifier The application group identifier
    @result A cookie storage with a persistent store in the application group container
    @discussion By default, applications and associated app extensions have different data containers, which means
    that the sharedHTTPCookieStorage singleton will refer to different persistent cookie stores in an application and
    any app extensions that it contains. This method allows clients to create a persistent cookie storage that can be
    shared among all applications and extensions with access to the same application group. Subsequent calls to this
    method with the same identifier will return the same cookie storage instance.
 */
@available(iOS 9.0, *)
open class func sharedCookieStorage(forGroupContainerIdentifier identifier: String) -> HTTPCookieStorage

Чтобы иметь действительную группу приложений, необходимо добавить ее, следуя инструкциям в разделе Добавление приложения в группу приложений.

Я предполагаю, что, поскольку у вас нет групп приложений, добавленных к вашим правам, по умолчанию NSHTTPCookieStorage.shared,

Другие вопросы по тегам