为什么 Twitter webview 会清除我的会话 cookie?

Why does Twitter webview clear my session cookies?

我正在 PHP 中创建您的标准登录。它依赖于用户的会话保持不变来保持用户登录。会话一直按预期在桌面浏览器、iOS 上的 Safari 和 Facebook iOS 应用程序中的 webview 上持续存在。但是,它不会在 Twitter iOS 应用程序的 webview 上持续存在。

我有这个 simple page 来打印会话:

<?php
        session_start();
?>
<html>
<body>
<h1>$_SESSION</h1>
<?php
        print_r($_SESSION);
?>
<h1>$_COOKIE</h1>
<?php
        print_R($_COOKIE);
?>
</body>
</html>

iOS

上的 Safari
  1. 在 iOS 上的 Safari 中打开页面。
  2. 重新加载页面 10 次。
  3. 每次都打印相同的会话 ID。


Facebook iOS

  1. Post link 到您的 Facebook 墙。
  2. 点击 link 10 次。
  3. 每次都打印相同的会话 ID。


Twitter iOS

  1. 在 Twitter 上发推 link。
  2. 点击 link 10 次。
  3. 每次都缺少会话 ID


Twitter 与其他所有人之间的唯一主要区别是 Twitter 使用其缩短服务转换所有 link。如果您检查帖子的网站源代码,您会看到:

<a href="t.co/someCode">yourOriginalLink.com</a>

这会影响您的推荐人。但是 referer 究竟会如何搞砸你的会话?

我知道其他网站已经获得了在 Twitter 上持续存在的会话,因为我已经登录了那些其他应用程序,并且每次启动他们的网站时我都保持登录状态。例如,您可以查看 Meerkat。只需在您的 Twitter iOS 应用程序中搜索 #meerkat,然后单击任何推文中的 link。系统会要求您登录。如果您单击第二个 Meerkat link,它会记住您之前已经登录过。

不幸的是,任何使用 UIWebview 的应用都不太可能保留您的 cookie。这是我们 Branch 每天都面临的问题,因为我们在深度链接时使用 cookie 来了解是否将任何给定用户带到应用程序而不是 App Store / Play Store。

一种解决方法是始终将用户带到 Safari,因为您的 cookie 可以保留在那里。然后你可以重定向到你想带用户去的任何地方。 Safari 中的第一方 cookie 会保留。第三方 cookie 通常不会保留,即使在 Safari 中也是如此。希望这会有所帮助。

Twitter iOS 应用程序会在 web 视图被关闭时销毁其会话。在标准 cookie 管理中,没有任何明确过期的 cookie 在会话结束时被清除。我们希望保留 cookie,以便用户不必一遍又一遍地登录。

     $params = session_get_cookie_params();
     setcookie(
         session_name(),
         $_COOKIE[session_name()],
         time() + 60 * 60 * 24 * 365,
         $params["path"],
         $params["domain"],
         $params["secure"],
         $params["httponly"]
     );

Facebook 应用程序不会在 webview 消失时清除 cookie,这可能是因为它有智能缓存逻辑来将 webview 保留在内存中而不是释放它。