28

我有一个 iOS 应用程序,它使用UIWebView. 升级到 iOS 9 时,我遇到了 ATS 阻止登录页面的 https 请求的问题。然后我为 Uber 登录页面添加了一个例外,但随后注意到登录页面向 Facebook、Amazon Web Services 和其他网站发出了其他几个请求,都被 ATS 阻止了。

我不想维护 Uber 登录页面的异常列表,因为 Uber 可以轻松更改他们的页面,而我的应用程序不会有正确的异常。所以我决定SFSafariViewController试一试。

我能够使用 完成 OAuth2 过程SFSafariViewController,问题是身份验证完成时从优步存储了某种类型的 cookie。如果我想验证不同的帐户并SFSafariViewController再次启动,cookie 是从先前的验证中提取的,并且没有机会验证不同的帐户。我UIWebView通过删除 cookie解决了这个问题NSHTTPCookieStorage,但我没有看到删除 cookie 的方法SFSafariViewController

4

2 回答 2

6

对于 iOS 9 及更高版本,最好的选择是使用WebKit 框架中提供的WKWebView

它提供了一个WKWebsiteDataStore,可用于删除 webview 使用的 cookie/缓存,例如:https ://stackoverflow.com/a/31803708/313113或https://stackoverflow.com/a/32491271/313113

根据文档:SFSafariViewController与 Safari 共享 cookie 和其他网站数据,因为它在您的应用程序进程之外运行(出于安全原因),您无法从应用程序内部修改它的状态。请参阅此答案:https ://stackoverflow.com/a/34136074/313113来自联系 Apple 客户支持并得到以下回复的人:

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

于 2016-02-29T20:50:08.543 回答
3

所以我遇到了同样的问题,并在搜索如何解决这个问题时看到了你的问题。就我而言,我想出的最佳解决方案是在应用程序中进行注销,然后呈现一个指向我们的注销 url 的 SFSafariViewController。然后我用它在 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 上调用dismiss(animated: false) 方法,而不是出于某种原因实际当前的UIViewController。我花了一秒钟才弄清楚为什么它对我不起作用。

于 2016-10-20T19:52:27.630 回答