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

时间:2012-04-03 18:09:26

标签: jquery iphone web-applications jquery-mobile safari

我有一个jquery移动网络应用程序。在我的iPhone上,当我在网络应用程序上时,我有一个登录和会话变量。如果我让应用程序转到手机上的其他位置然后返回到Web应用程序,我必须再次登录。似乎会话没有得到维护。此外,如果我有一个外部链接,并打开该链接的safari,相同的会话不会转移到safari窗口。有没有办法维持会话?

4 个答案:

答案 0 :(得分:18)

这个问题的接受答案是错误的,这很容易做到。

诀窍是这样做:

// 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模拟器/ iPad 2(都是iOS 6.0)上进行了测试,即使在会话期间关闭并重新启动设备/模拟器也能正常工作。

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

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

经测试并确认可在iOS 4.2.1,5.1.1,6.0和6.1下工作。

免责声明: Apple的文档明确指出需要本地缓存清单才能在Web应用程序中本地保存数据,但此解决方案无需此解决方案。即,此解决方案可能依赖于Mobile Safari的无证或错误行为。但是,由于它适用于如此多的iOS版本,我认为这是预期的行为(至少在Apple的部分),只是不清楚地记录。

答案 1 :(得分:2)

我猜你是指苹果“全屏功能”元标记“网络应用”。它们存在于沙箱中,因此不会保留会话数据。

答案 2 :(得分:1)

如果您不想在点击链接时打开safari,请使用此git。

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

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

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

答案 3 :(得分:-5)

如果您无法使用Cookie,则必须在服务器端创建会话,但它将持续到用户使用相同的IP地址或服务器为会话配置的时间,这意味着用户是否切换3g用于WiFi,应用程序将检测到不同的IP地址,因此会话将被关闭。