SFSafariViewController cookies

13

我了解到自iOS9以来,您应该能够在SFSafariViewController中读取cookie。

如果我在我的网页上使用以下JS设置cookie:

var dd = new Date(Date.now() + 1000 * 60 * 60 * 24).toGMTString();
var expires = "expires="+ dd;
document.cookie = "mycookie=cookievalue; " + expires  + " domain=.mydomain.co.uk ; path=/ ";

如果我做:

- (void)safariViewController:(SFSafariViewController *)controller didCompleteInitialLoad:(BOOL)didLoadSuccessfully
{
  NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
  NSArray *cookiesArray = [storage cookies];
}

cookiesArray 始终为空。

如果我使用传统的 UIWebView

-(void)webViewDidFinishLoad:(UIWebView *)webView
{
  NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
  NSArray *cookiesArray = [storage cookies];
}

我得到了我期望的 cookie。

有什么想法我可能做错了吗?

2个回答

19

SFSafariViewController 基本上是一个运行在您的应用程序外部的 Safari 进程。与您的应用程序无法访问 Safari 应用程序中的 cookie 一样,您的应用程序也无法访问 SFSafariViewController 使用的 cookie。

如果您需要这种功能,您需要使用UIWebViewWKWebView


感谢您回复我,但根据:https://developer.apple.com/reference/safariservices/sfsafariviewcontroller该视图控制器包括 Safari 的功能,如 Reader、AutoFill、欺诈网站检测和内容阻止。它与 Safari 共享 cookie 和其他网站数据。用户在 SFSafariViewController 中的活动和交互对您的应用程序不可见,您的应用程序无法访问 AutoFill 数据、浏览历史记录或网站数据。您不需要在应用程序和 Safari 之间保护数据。 - Jai Byron
2
你误解了“SFSafariViewController与Safari共享cookie和其他网站数据”的含义。SFSafariViewController是Safari的一个实例,它不是你的应用程序的一部分。它正在访问Safari的数据沙盒(cookie、自动填充等),而不是你的应用程序与Safari共享这些数据。你的应用程序无法访问Safari中的任何安全数据,包括cookie。如果你需要在应用程序中访问网站cookie,SFSafariViewController不是正确的选择。 - wottle
你在代码中证实了我的答案。如果您通过 SFSafariViewController 访问网站,则 NSHTTPCookieStorage 将为空。SFSafariViewController 有它的用途,但不适用于您尝试做的事情。 - wottle
好的,感谢澄清。只是为了提供一些背景,我被建议可以使用SFSafariViewController进行延迟深度链接。即:
  1. 在网页上点击通用链接(包含cookie数据)
  2. 因为应用程序未安装,App Store打开并下载我的应用程序
  3. 当我的应用程序打开并运行时,它会读取“共享cookie”并执行操作。
- Jai Byron
1
我不相信那个建议是正确的。看看这个链接:https://blog.branch.io/install-attribution-ios-9-safari-view-controller - 注意引用中的话:“实际上,你不能只是打开SFSafariViewController并从任何网站读取cookie(那将是可怕的)。” - wottle
显示剩余2条评论

1

SFSafariViewController运行在一个独立的进程中,所以无法读取cookies。

然而,如果由于一些限制,例如WKWebView和UIWebView等现有可用选项的存在问题,SFSafariViewController是唯一的选择。那么自定义URL方案方法将有助于从SFSafariViewController向启动SFSafariViewController的父应用程序发送数据。

在上述情况下,可能的URL如下所示,其中“myapp”是自定义URL方案

"myapp://SendData?mycookie=cookievalue&domain=.mydomain.co.uk&path=/"

因此,自定义URL方案将针对父应用程序进行注册以启动它,并且自定义URL方案参数将具有要由父应用程序接收的预期数据。如果数据是敏感的,则可以在发送之前通过JavaScript进行加密,并且可以在接收后由父应用程序进行解密。

希望这会有所帮助 :)

有关自定义URL方案的更多详细信息,请访问https://developer.apple.com/documentation/xcode/defining-a-custom-url-scheme-for-your-app


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接