У меня есть 2 приложения, оба приложения используют WKWebview для входа в систему единого входа. Оба приложения работают нормально по отдельности.
Теперь давайте рассмотрим этот сценарий ниже.
Предположим, я вошел в одно приложение, получил файл cookie WKWebview из этого приложения и установил эту информацию cookie в WKWebview второго приложения. Я ожидаю, что система единого входа должна работать во втором приложении, но не работает.
Ниже приведен код, который я использую для получения файлов cookie из WKwebview после входа в систему из 1-го приложения.
extension WKWebView {
@available(iOS 11.0, *) private var httpCookieStore: WKHTTPCookieStore { return WKWebsiteDataStore.default().httpCookieStore } func getCookies(for domain: String? = nil, completion: @escaping ([String : Any])->()) { var cookieDict = [String : AnyObject]() if #available(iOS 11.0, *) { httpCookieStore.getAllCookies { (cookies) in for cookie in cookies { print("cookie iterator started") print("cookie=======\(cookie)") if let domain = domain { if cookie.domain.contains(domain) { cookieDict[cookie.name] = cookie.properties as AnyObject? } } else { cookieDict[cookie.name] = cookie.properties as AnyObject? } } completion(cookieDict) } } else { // Fallback on earlier versions } } }
Ниже приведен код, который я использую для установки cookie в WKwebview 2-го приложения.
let cookie= HTTPCookie(properties: [
.domain: "dev.mycompany.net",
.path: "/",
.name: "PF",
.value: "327y48234g2hgdhjwedguyw23oSYVbVLwf9",
.secure: "TRUE",
.version: 1,
.expires: NSDate(timeIntervalSinceNow: (562225018+1000000))
])!
HTTPCookieStorage.shared.cookieAcceptPolicy = HTTPCookie.AcceptPolicy.always
HTTPCookieStorage.shared.setCookie(cookie)
отладьте свой файл cookie через портал разработчика Safari, там должен быть ваш последний файл cookie.





Я чувствую, что вы ошибаетесь во втором приложении. Wkwebview имеет собственное хранилище файлов cookie. но вы предполагаете, что это установит cookie в WkwebviewHTTPCookieStorage.shared.setCookie(cookie). Чтобы установить cookie во втором приложении Wkwebview, вы должны настроить файл cookie для входа в систему в httpcookiestore из Wkwebview.
self.webview.configuration.websiteDataStore.httpCookieStore.setCookie("your http cookie here", completionHandler: {
// делайте здесь что хотите. теперь cookie установлен в wkwebview
})
Используйте этот метод для создания файлов cookie.
let newcookie = HTTPCookie(properties: [
.domain: "your domain",
.path: "/",
.name: "name",
.value: "value",
.secure: "FALSE",
.expires: NSDate(timeIntervalSinceNow: 31556926)
])!
Спасибо @shauket за быстрый ответ. Да, я уже пробовал это, но все равно не работало
вы уверены, что ваш новый файл cookie находится в системе cookie? Я на 100% уверен, что если он зашел в файл cookie, тогда веб-браузер Safari должен отобразить его, и ваш сервер распознает его. но если вы говорите, что cookie не настраивается, проблема на вашей стороне .. в противном случае похоже, что ваш cookie недействителен
К вашему сведению, какую версию iOS вы проверяете? Также ваш файл cookie настроен для этого домена "dev.mycompany.net", поэтому ваш сервер распознает только этот домен.
Я использую WKWebview, а не браузер Safari. Да, я получаю файл cookie после входа в систему, и, конечно, он действителен, потому что SSO работает в первом приложении с использованием этой информации cookie. Я проверяю это в симуляторе с iOS версии 11.4. Одна вещь, которую я заметил выше, меняется, когда я пытаюсь войти во 2-е приложение. «ПФ»: {Created = 562489153; Сбросить = ИСТИНА; Домен = "dev.mycompany.net"; Имя = ПФ; Путь = "/"; Безопасность = ИСТИНА; Значение = JYFs8Xsa5L4jG92WV1VGSM; Версия = 1; }
Тогда, пожалуйста, проконсультируйтесь со своим сервером, возможно, для входа в систему также требуются другие ограничения. WKHTTPCookieStoreObserver реализует этого наблюдателя, может это помочь
это записано в файл cookie "327y48234g2hgdhjwedguyw23oSYVbVLwf9", верно? спросите вашего разработчика сервера, этот файл cookie должен быть действителен после входа пользователя в систему