在iPhone上的web应用程序中维护PHP会话



我有一个jquery移动web应用程序。在我的iPhone上,当我在网络应用程序上时,我有一个登录名和会话变量。如果我离开应用程序去手机上的另一个位置,然后返回网络应用程序,我必须再次登录。会议似乎没有得到维持。此外,如果我有一个外部链接,它会为该链接打开safari,那么同一会话不会转移到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);

就是这样!不需要本地缓存清单,您可以在web应用程序中处理会话,就像在常规桌面或移动浏览器中处理网页一样。我在iPhone 5(iOS 6.1)和iPhone Simulator/iPad 2(均为iOS 6.0)上进行了测试,即使在会话期间关闭和重新启动设备/模拟器,这也能正常工作。

它工作得很好:如果用户多次将您的网络应用程序添加到主屏幕,则生成的会话cookie会在网络应用程序的多个实例之间共享。除非Safari的私人浏览模式打开,否则会话cookie甚至在直接从Safari而非使用网络应用程序浏览网页时可用。因此,无论用户如何使用您的应用程序,在使用此策略时,当前会话似乎总是会恢复。

要自己尝试,请使用上面的代码并在您的网页中输出session_id()暂时,因为这是一个安全风险),并查看它是否在关闭和从主屏幕打开web应用程序之间发生变化(也可以尝试在会话期间重新启动设备)。如果输出的会话ID没有改变,它就会工作:它显然被Safari存储在一些(共享的)本地缓存中。

已测试并确认可在iOS 4.2.1、5.1.1、6.0和6.1下运行。

免责声明:苹果的文档明确指出,为了在web应用程序中本地保存数据,需要本地缓存清单,但此解决方案在没有此功能的情况下有效。即,此解决方案可能依赖于Mobile Safari的未记录或错误行为。然而,由于它适用于许多iOS版本,我觉得这是有意的行为(至少对苹果来说是这样),只是记录不清。

我猜你指的是苹果"支持全屏"的元标签"网络应用程序"。它们存在于沙盒中,因此不会维护会话数据。

如果你不想在点击链接时打开safari,只需使用这个git。

https://gist.github.com/kylebarrow/1042026

基本上,只需将文件stay_standalone.js复制到您的项目中,在您的视图中包括以下行:

<script src="stay_standalone.js" type="text/javascript"></script>

如果你不能使用Cookies,你必须在服务器端创建一个会话,但它将持续到用户使用相同的ip地址或为会话配置服务器的时间,这意味着如果用户将3g切换到WiFi,应用程序将检测到不同的ip地址,因此会话将关闭。

最新更新