为啥 SFSafariWebViewController 不能与 Safari 正确共享 cookie?
Posted
技术标签:
【中文标题】为啥 SFSafariWebViewController 不能与 Safari 正确共享 cookie?【英文标题】:Why is SFSafariWebViewController not sharing cookies with Safari properly?为什么 SFSafariWebViewController 不能与 Safari 正确共享 cookie? 【发布时间】:2016-03-24 15:13:31 【问题描述】:我创建了一个非常基本的应用程序,其中包括一个指向 URL http://www.w3schools.com/js/js_cookies.asp 的 SFSafariViewController
。这是一个读写cookies的测试网站。
然后我将同一个网站加载到 Mobile Safari 中,并添加了一个 cookie。我切换到我的应用程序,阅读 cookie,它就在那里。我回到 Safari,添加另一个 cookie,回到我的应用程序,但第二个 cookie 没有出现。我刷新页面,没有区别。回到Safari读取cookies,都读取成功了。
为了正确写入和读取 cookie,我需要在应用之间做些什么吗?
【问题讨论】:
cookie 的属性是什么?查看 NSHTTPCookieStorage 内部 这受SFSafariViewController影响吗?值得调查,谢谢。 嘿,你有想过这个吗?我正在尝试在我的应用程序中使用 Safari 身份验证方法并且遇到了同样的问题。浏览器请求显示 cookie 很好,但应用内 SFSafariVC 请求不显示。 您真的在使用 SFSafariViewController 将 Safari 应用程序中的 cookie 读取到您的应用程序内部吗?我需要从 Safari 应用程序读取 cookie 到我的应用程序内部。有可能吗? 【参考方案1】:您可以强制SFSarfariViewController
在应用关闭时关闭。这将确保网页与任何新的 cookie 一起刷新。
在 ViewDidLoad 中:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(shouldDismiss:) name:UIApplicationDidEnterBackgroundNotification object:nil];
然后:
- (void)shouldDismiss:(NSNotification*)notification
[self.safariViewContollerName dismissViewControllerAnimated:YES completion:nil]
希望这会有所帮助,
利亚姆
【讨论】:
太棒了,如果您的用例与您的应用程序相反,无法从 Safari 获取最新的 cookie,该怎么办? 这是一个很好的“hack”,但不幸的是它对我们的特定用例没有帮助。我们来自 Safari,将 cookie 存储在那里,然后当应用程序启动时,我们正在使用 SFSafariViewController 尝试读取该 cookie。不幸的是,当我们尝试读取它时,有时它不会读取为已设置。【参考方案2】:Apple Dev Forums 上的用户建议它可能仅适用于“持久 cookie”而不适用于“会话 cookie”。我没有在我的 cookie 上设置有效期。我通过未来的时间改变了这一点:
const expireTime = new Date(Date.now() + 1000 * 60 * 60 * 24).toGMTString();
然后在头部设置:
"Set-Cookie":`query=$uri.query; path=/; expires=$expireTime`
现在 cookie 值出现在 SFSafariViewController 中。
【讨论】:
为我工作!感谢分享!【参考方案3】:正如苹果文档所说:
SFSafariViewController 类提供了浏览网页的标准界面。视图控制器包括 Safari 功能,例如阅读器、自动填充、欺诈性网站检测和内容阻止。它与 Safari 共享 cookie 和其他网站数据。用户的活动和与 SFSafariViewController 的交互对您的应用程序不可见,它无法访问自动填充数据、浏览历史记录或网站数据。您不需要保护您的应用和 Safari 之间的数据。
默认情况下,它与 Safari 共享 cookie 和其他网站数据。您无需执行任何操作。
【讨论】:
好吧,是的,我以前读过。感谢分享。 Cookie 大约有 50% 的时间被共享,并且通常只有在您强制退出并重新加载应用时才会刷新。 我需要将 Safari 应用程序中的 cookie 读取到我的应用程序内部。有可能吗?以上是关于为啥 SFSafariWebViewController 不能与 Safari 正确共享 cookie?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?