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

Posted

技术标签:

【中文标题】在 iPhone 上的 Web 应用程序中维护 PHP 会话【英文标题】:Maintain PHP Session in web app on iPhone 【发布时间】:2012-04-17 10:33:18 【问题描述】:

我有一个 jquery 移动网络应用程序。在我的 iPhone 上,当我使用网络应用程序时,我有一个登录和会话变量。如果我离开应用程序转到手机上的另一个位置,然后返回网络应用程序,我必须重新登录。似乎没有维护会话。此外,如果我有一个外部链接并且它为该链接打开了 safari,则同一会话不会转移到 safari 窗口。有没有办法维持会话?

【问题讨论】:

这个问题的公认答案是错误的。请参阅下面的答案,了解如何维护会话,即使在设备重新启动之间也是如此。 【参考方案1】:

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

诀窍是这样做:

// 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()暂时,因为它存在安全风险)并查看它是否在从主屏幕(尝试在会话期间重新启动您的设备)。如果输出的会话 ID 没有改变,它就可以工作:它显然被 Safari 存储在一些(共享的)本地缓存中。

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

免责声明:Apple 的文档明确指出需要本地缓存清单以便在 Web 应用程序中本地保存数据,但此解决方案没有此功能。即,此解决方案可能依赖于 Mobile Safari 的未记录或错误行为。但是,由于它适用于许多 iOS 版本,我的印象是这是有意的行为(至少在 Apple 方面),只是没有明确记录。

【讨论】:

这绝对有效且有意义,就好像您认为应用程序中的会话 cookie 在应用程序模式下对页面的不同访问之间被删除,这符合 cookie 规范,除非最大年龄或expire 设置在 cookie 上。 非常感谢您的回答!它完美地工作@WilboBaggins【参考方案2】:

我猜你指的是 Apple“全屏”元标记“网络应用程序”。它们存在于沙盒中,因此不会保留会话数据。

【讨论】:

有趣。没有为这些维护 Cookie 数据? 不是从 web 应用容器到 Safari。它们完全独立地存在于手机中。 我担心会是这样。 您或许可以通过 URL 参数传递会话 ID 并将该会话加载到 Safari 的实例中。 您也可以使用原生 php 方式:php.net/manual/en/session.idpassing.php【参考方案3】:

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

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

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

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

【讨论】:

【参考方案4】:

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

【讨论】:

这是一个非常糟糕的主意。在很多情况下,成千上万的用户可能在同一个 IP 后面。

以上是关于在 iPhone 上的 Web 应用程序中维护 PHP 会话的主要内容,如果未能解决你的问题,请参考以下文章

从 iPhone 上的 Web 服务器请求数据会造成过多的延迟

在 Iphone 上禁用 Progressive Web App 上的后退按钮

将 UITabBarController 从单独的 XIB 加载到 iPhone 上的 Window 应用程序中

带有黑色半透明状态栏的 iPhone 上的 Web 应用程序:视口高度似乎是错误的

在 iPhone 6 上的 Meteor Cordova 应用程序中进行缩放

如何在 iphone 应用程序中的 web 服务上发布图像