SFSafariViewController删除OAuth2 Cookie

我有一个iOS应用程序,使用UIWebView OAuth2使用Uber API进行身份validation。 当升级到iOS 9时,我遇到了阻止login页面的https请求的ATS问题。 然后,我为Uberlogin页面添加了一个例外,但后来注意到login页面向Facebook,Amazon Web Services和其他网站发出了其他几个请求,都被ATS阻止。

我不想维护Uberlogin页面的例外列表,因为Uber可以轻松地更改他们的页面,我的应用程序将不会有正确的例外。 所以我决定给SFSafariViewController一个镜头。

我能够使用SFSafariViewController完成OAuth2进程,问题是当身份validation完成时,Uber会存储某些types的Cookie。 如果我想validation一个不同的帐户,并再次调出SFSafariViewController ,则cookie会从之前的validation中提取出来,并且没有机会validation其他帐户。 我通过使用UIWebView通过NSHTTPCookieStorage删除cookie来解决这个NSHTTPCookieStorage ,但是我没有看到从SFSafariViewController删除cookie的SFSafariViewController

对于iOS 9及以上版本,最好的select是使用WebKit框架中提供的WKWebView类

其中提供了一个WKWebsiteDataStore ,可以用来删除cookie所使用的cookie / caches,例如: https : //stackoverflow.com/a/31803708/313113或https://stackoverflow.com/a/32491271/313113

根据文档: SFSafariViewController与Safari共享cookies和其他网站数据,因为它在您的应用程序的进程之外运行(出于安全原因),您不能从您的应用程序内部修改它的状态。 看到这个答案: https : //stackoverflow.com/a/34136074/313113从谁联系了苹果客户支持,并得到了以下回复:

SFSafariViewController运行在我的应用程序的进程之外,为了安全起见,我的应用程序不能修改SFSafariViewController的状态。 换句话说,我的应用程序无法清除由SFSafariViewController存储的凭据。

所以我遇到了同样的问题,并在寻找如何解决这个问题时看到了你的问题。 在我的情况下,我想出了最好的解决scheme是在应用程序中注销的东西,然后呈现一个SFSafariViewController指向我们的注销url。 然后,我用它来完成加载后closuresSFSafariViewController:

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

我将SFSafariViewController存储在logoutSVC中,所以我只运行这个代码,如果这是注销SFSafariViewController。 在你的情况,这听起来像你只是做了一个API调用来撤销OAuth令牌,这有点更好,因为它根本不显示给用户,但是这对于没有这种访问权限的情况是很好的。 还有一件事,出于某种原因,我不得不在SFSafariViewController上调用dismiss(animated:false)方法,而不是实际的当前UIViewController。 花了我一下,弄清楚为什么它不适合我。