iPhone“书签到主屏幕”删除 cookie 和会话?

Posted

技术标签:

【中文标题】iPhone“书签到主屏幕”删除 cookie 和会话?【英文标题】:iPhone "Bookmark to Homescreen" removes cookies and session? 【发布时间】:2011-04-18 08:02:43 【问题描述】:

现在我正在开发一个基于 Web 的应用程序,用户必须先登录。

当我通过 iPhone Safari 打开页面时,登录并重新启动 Safari,我仍然处于登录状态(Cookie 和会话 ID 仍然设置)。

但是当我使用“添加到主屏幕”添加此页面时,每次单击该页面的图标时,我都必须重新登录。

我没有找到任何相关信息。我该怎么做才能让我的用户将此页面设置为他们的主屏幕 作为图标,每次打开时仍然不必登录?

【问题讨论】:

【参考方案1】:

一个非常简单的方法是在您的书签 URL 中使用一个唯一令牌,它可以作为唯一的设备标识符。

示例: http://myWebApp.com/?token=randomId29238/1

可以在 Mobile Safari 中打开应用程序时以及在提示用户“添加到主屏幕”信息之前在服务器端生成令牌。 然后可以使用快速重定向 (...&token=randomToken) 或位置哈希 (...#randomToken) 将令牌添加到 URL。

现在无论何时从主屏幕打开书签,令牌都会发送到您的服务器,您可以识别用户的活动会话。 您也可以将令牌用作永久会话 ID,但出于安全考虑,我建议您不要这样做。

为了允许将来的注销和登录过程,您始终可以将新会话分配给令牌。

每当用户从他的主屏幕重新打开您的链接时,该令牌将作为唯一的设备标识符。

【讨论】:

我想我可能已经发现了一个更简单更优雅的策略,但是我一直无法在ios 6.0之前的版本下测试它。我在下面发布了一个答案,说明了如何。【参考方案2】:

有一个比 favo 更简单、更优雅的解决方案。

至少在 iOS 4.2.1、5.1.1、6.0 和 6.1 下(我无法测试其他版本),如果您手动延长会话 cookie 的生命周期,Safari 将保留会话 cookie 甚至允许在您的网络应用程序的“已安装主屏幕”版本和通过 Safari 本身的正常访问之间共享会话。

诀窍是这样做:

// Start or resume session
session_start(); 

// Extend cookie life time by an amount of your liking
$cookieLifetime = 365 * 24 * 60 * 60; // A year in seconds
setcookie(session_name(),session_id(),time()+$cookieLifetime);

有关此策略的更详细讨论,您可以查看我对这个问题的回答:

Maintain php Session in web app on iPhone

【讨论】:

刚刚尝试解决我遇到的一个问题,Wilbo 的小技巧,为我节省了很多时间和精力。 我无法在 iOS7 上使用它,据我所知,即使明确设置 cookie 超时,也不会保留任何 cookie 嗨,Kyle,刚刚在 iOS 7.1.1 下进行了测试,对我来说效果很好(重启设备后会话成功恢复)。您确定会话 ID 实际更改了吗?此解决方案不会神奇地存储用户正在查看的内容,它只是保留会话 cookie,以便您的服务器稍后可以识别相同的会话。但是您的服务器仍然需要记住用户在该会话中的位置,然后在他返回您的网络应用程序时提供该内容。【参考方案3】:

我将进一步扩展 Waldo Baggins 的回答。

当我遇到这种情况时,我发现发生这种情况的原因是服务器上设置的会话 cookie 通常没有设置过期值。这种情况下的默认行为是浏览器在关闭/重新打开浏览器时丢弃 cookie。由于浏览器在重新打开时不会重新发送 cookie,服务器无法识别会话,即使它在服务器上尚未过期,因此,您的用户将被重定向回登录页面。

当用户在网络应用程序模式下使用您的网站时(图标添加到主屏幕),iOS 将导航到/从应用程序处理与台式计算机处理关闭和重新打开浏览器的方式相同,并在重新打开时丢失会话.

因此,按照 Wilbo 的建议并为 cookie 设置过期时间,iOS 在用户导航回您的应用程序时检查 cookie 是否已过期,如果尚未过期,则重新发送 cookie,从而维持会话。 Wilbo 的回答中 1 年的值非常长,您通常希望将其设置为 8 或 24 小时,理想情况下将其与您在服务器上设置的会话到期超时值同步。

请注意,作为副作用,当您从桌面浏览器访问您的网站,并且用户关闭并重新打开浏览器时,会话将继续存在并且用户仍将登录,这不会以前就是这种情况(除非他们是私下浏览)。您的“注销”功能必须正确处理此 cookie 的过期问题。

对于使用 web.xml 3.0 或更高版本的 Java webapp,最简单的方法是修改<session-config>,如下所示:

<session-config>
    <session-timeout>600</session-timeout> <!-- In minutes -->
    <cookie-config>
        <http-only>true</http-only>
        <secure>true</secure>
        <max-age>36000</max-age> <!-- In seconds -->
    </cookie-config>
</session-config>

【讨论】:

【参考方案4】:

有可用于 Web 应用程序的持久键值存储和数据库存储。您可以使用 localStorage 对象保存您的身份验证数据,并使用 XMLHttpRequest 将其发送到服务器。 另一种选择是将您的持久数据保存在 SQLite 数据库中,但这似乎不是您的情况的正确解决方案。 查看 Apple 的 Client-Side Storage and Offline Applications Programming Guide 了解详细信息/示例。

【讨论】:

:) 安静复杂只是为了获得与 safari 浏览器相同的结果。有没有简单的例子。只是为了保存实际的 COOKIES,所以当我重新启动用户时,例如不必再次登录。 如果您想坚持使用 cookie,@favo answer 将是更好的选择,因为:i。 cookie 在现实世界中附加到 http 标头中,将其附加到具有类似效果的 URL ii。如果您的主屏幕应用程序(网络剪辑)在“独立模式”下运行,用户无法更改 URL。最后一件事:如果您关心安全性,您可以使用 localStorage 来刺激 2 向身份验证。 我试过这个。它不能使用“书签到主屏幕”。我找不到任何书面证据,但从我所有的测试来看,每次打开它都会清除 cookie 和 localStorage。 Apple 的 example code 对我来说可以很好地添加到主屏幕 我喜欢我的应用程序的本地存储选项。我至少可以在 iOS7 中确认 localstorage 确实存在于带有书签的网络应用程序中。我们在后端使用 Redis 并从 cookie 检查登录。我们现在只是将这个 sid 存储在 localstorage 中,然后在 url 查询中传递它。服务器查找 cookie 和 url 参数并使用可用的。只是不要忘记在用户注销时清除本地存储!

以上是关于iPhone“书签到主屏幕”删除 cookie 和会话?的主要内容,如果未能解决你的问题,请参考以下文章

Instagram注销在iPhone中不起作用?

iPhone xcode 应用程序可以读取 Safari Mobile 之前存储的 cookie 吗?

怎么设置cookie,怎么设置cookie以及删除cookie和cookie详解

Iphone 上的 Codeigniter 会话问题

在 iPhone 和 iPad 上使用 UIWebView 进行隐私浏览

使用javascript查找和删除cookie [重复]