SFSafariViewController Eliminar cookie OAuth2

Tengo una aplicación iOS que se autentica con la API Uber usando OAuth2 en una UIWebView . Al actualizar a iOS 9, corro al problema de ATS bloqueando la request https para la página de inicio de session. Luego agregué una exception para la página de inicio de session de Uber, pero luego noté que la página de inicio de session hace varias otras requestes a Facebook, Amazon Web Services y otros sitios web, todos bloqueados por ATS.

No quiero tener que mantener una list de excepciones para la página de inicio de session de Uber, ya que Uber puede cambiar fácilmente su página y mi aplicación no tendrá las excepciones correctas. Entonces decidí darle una oportunidad a SFSafariViewController .

Soy capaz de completar el process OAuth2 con el SFSafariViewController , el problema es que hay algún tipo de cookie almacenada desde Uber cuando se completa la authentication. Si deseo autenticar una count diferente y SFSafariViewController nuevo el SFSafariViewController , la cookie se recoge de la authentication previa y no hay posibilidad de autenticar una count diferente. Conseguí esto con el UIWebView eliminando la cookie a través de NSHTTPCookieStorage , pero no veo una forma de eliminar la cookie de SFSafariViewController .

Para iOS 9 y en adelante, la mejor opción es utilizar la class WKWebView disponible en WebKit Framework

que proporciona una WKWebsiteDataStore que se puede utilizar para eliminar las cookies / cachings utilizadas por la vista web, consulte, por ejemplo: https://stackoverflow.com/a/31803708/313113 o https://stackoverflow.com/a/32491271/313113

Según los documentos: SFSafariViewController comparte cookies y otros datos del website con Safari y porque se ejecuta fuera del process de su aplicación (por razones de security), no puede modificar su estado desde dentro de su aplicación. Consulte esta respuesta: https://stackoverflow.com/a/34136074/313113 de alguien que se puso en contacto con el service de atención al cliente de Apple y recibió la siguiente respuesta:

SFSafariViewController se ejecuta fuera del process de mi aplicación y, para estar seguro, mi aplicación no puede modificar el estado de SFSafariViewController. En otras palabras, mi aplicación no puede borrar las cnetworkingenciales almacenadas por SFSafariViewController.

Entonces me encontré con este mismo problema y vi tu pregunta cuando buscas cómo resolver esto. En mi caso, la mejor solución que se me ocurrió fue hacer las cosas para cerrar session en la aplicación y luego presentar un SFSafariViewController apuntando a nuestra URL de cierre de session. Luego utilicé esto para cerrar el SFSafariViewController tan pronto como se completó la carga:

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

Almacené el SFSafariViewController en logoutSVC, así que solo ejecuté este código si este es el cierre de session SFSafariViewController. En su caso, parece que acaba de hacer una llamada a la API para revocar el token OAuth, que es un poco mejor, ya que no se muestra al usuario en absoluto, pero esto es bueno para las instancias en las que no tiene dicho acceso. Una cosa más, por alguna razón, tuve que llamar al método dismiss (animated: false) en el SFSafariViewController en lugar del actual UIViewController por alguna razón. Me tomó un segundo para descubrir por qué no estaba funcionando para mí.