iPhone“Bookmark to Homescreen”删除了cookie和会话?

时间:2010-09-28 14:06:02

标签: iphone web-applications mobile-safari iphone-standalone-web-app

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

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

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

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

4 个答案:

答案 0 :(得分:14)

一种非常简单的方法可能是使用Bookmark-URL中的唯一标记,该标记可以作为唯一的设备标识符。

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

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

每当现在从主屏幕打开书签时,令牌将被发送到您的服务器,您可以识别用户的活动会话。 您也可以将令牌用作永久会话ID,但出于安全考虑,我提出反对意见。

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

只要用户从主屏幕重新打开您的链接,该令牌就会将您作为唯一的设备标识符。

答案 1 :(得分:12)

与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

答案 2 :(得分:4)

我将进一步扩展Waldo Baggins'答案。

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

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

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

请注意,作为一个副作用,当您从桌面浏览器访问您的站点,并且用户关闭并重新打开浏览器时,会话将继续保持,并且用户仍将登录,这不会是&#39以前是这种情况(除非他们私下浏览)。你的退出"功能必须正确处理此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>

答案 3 :(得分:3)

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