为啥 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,为啥它受到保护?

为啥需要softmax函数?为啥不简单归一化?

为啥 g++ 需要 libstdc++.a?为啥不是默认值?

为啥或为啥不在 C++ 中使用 memset? [关闭]

为啥临时变量需要更改数组元素以及为啥需要在最后取消设置?

为啥 CAP 定理中的 RDBMS 分区不能容忍,为啥它可用?