Подтвердить что ты не робот

SFSafariViewController Удалить Cookie OAuth2

У меня есть приложение iOS, которое аутентифицируется с помощью Uber API с использованием OAuth2 в UIWebView. При обновлении до iOS 9 я столкнулся с проблемой ATS, блокирующей запрос https для страницы входа. Затем я добавил исключение для страницы входа в Uber, но затем заметил, что страница входа в систему делает несколько других запросов в Facebook, Amazon Web Services и других веб-сайтах, все из которых блокируются ATS.

Я не хочу содержать список исключений для страницы входа в Uber, так как Uber может легко изменить свою страницу, и мое приложение не будет иметь правильных исключений. Поэтому я решил сделать SFSafariViewController выстрел.

Я могу завершить процесс OAuth2 с помощью SFSafariViewController, проблема в том, что при завершении аутентификации существует некоторый тип файлов cookie, хранящихся в Uber. Если я хочу аутентифицировать другую учетную запись, и я снова вызываю SFSafariViewController, cookie будет получен из предыдущей проверки подлинности, и нет возможности аутентифицировать другую учетную запись. Я обошел это с помощью UIWebView, удалив файл cookie через NSHTTPCookieStorage, но я не вижу способа удалить cookie из SFSafariViewController.

4b9b3361

Ответ 1

Для iOS 9 и далее лучшим вариантом является использование класса WKWebView, доступного в WebKit Framework

который предоставляет WKWebsiteDataStore, который может использоваться для удаления файлов cookie/кешей, используемых веб-просмотром, см., например: fooobar.com/questions/277854/... или fooobar.com/questions/277852/...

В соответствии с документами: SFSafariViewController делится файлами cookie и другими данными сайта с Safari и потому, что он работает за пределами вашего процесса приложения (для обеспечения безопасности причины) вы не можете изменить его состояние из своего приложения. См. Этот ответ: fooobar.com/questions/454723/... от кого-то, связавшегося с поддержкой Apple, и получил следующий ответ:

SFSafariViewController запускается за пределами моего процесса App и в порядке чтобы быть в безопасности, мое приложение не может изменять состояние SFSafariViewController. В другими словами, мое приложение не может очистить учетные данные, хранящиеся в SFSafariViewController.

Ответ 2

Итак, я столкнулся с этой же проблемой и увидел ваш вопрос при поиске того, как это решить. В моем случае лучшее решение, которое я придумал, - это сделать материал для входа в приложение, а затем представить SFSafariViewController, указывающий на наш URL выхода. Затем я использовал это, чтобы закрыть SFSafariViewController, как только это было сделано при загрузке:

extension AlertsTableViewController: SFSafariViewControllerDelegate {

    public func safariViewController(_ controller: SFSafariViewController, didCompleteInitialLoad didLoadSuccessfully: Bool) {
        if controller == logoutSVC {
            controller.dismiss(animated: false)
        }
    }

}

Я хранил SFSafariViewController в logoutSVC, поэтому я запускаю этот код только в том случае, если это выход из системы SFSafariViewController. В вашем случае это звучит так, как будто вы только что вызвали API, чтобы отозвать токен OAuth, который немного приятнее, поскольку он вообще не отображается для пользователя, но это хорошо для случаев, когда у вас нет такого доступа. Еще одна вещь, по какой-то причине мне пришлось вызвать метод увольнения (анимированный: ложный) на SFSafariViewController, а не фактический текущий UIViewController. Потребовал мне секунду, чтобы понять, почему он не работает для меня.