只是想在这里留下一个简单的工作解决方案,不需要用户交互。
正如我在一篇文章中所说:
基本上,您需要做的就是在top.location上加载您的页面,创建会话并将其重定向回Facebook。
将此代码添加到顶部并设置为应用程序最终选项卡/应用程序 URL,您将看到应用程序将毫无问题地工作。index.php
$page_url
<?php
// START SAFARI SESSION FIX
session_start();
$page_url = "http://www.facebook.com/pages/.../...?sk=app_...";
if (isset($_GET["start_session"]))
die(header("Location:" . $page_url));
if (!isset($_GET["sid"]))
die(header("Location:?sid=" . session_id()));
$sid = session_id();
if (empty($sid) || $_GET["sid"] != $sid):
?>
<script>
top.window.location="?start_session=true";
</script>
<?php
endif;
// END SAFARI SESSION FIX
?>
注意:这是为Facebook制作的,但它实际上可以在任何其他类似情况下使用。
编辑 2012 年 12 月 20 日 - 维护已签名的请求:
上面的代码不维护请求发布数据,并且您将失去signed_request,如果您的应用程序依赖于签名请求,请随时尝试以下代码:
注意:这仍在正确测试中,并且可能不如第一个版本稳定。使用风险自负/欢迎反馈。
(感谢CBroe在这里为我指出正确的方向,从而可以改进解决方案)
// Start Session Fix
session_start();
$page_url = "http://www.facebook.com/pages/.../...?sk=app_...";
if (isset($_GET["start_session"]))
die(header("Location:" . $page_url));
$sid = session_id();
if (!isset($_GET["sid"]))
{
if(isset($_POST["signed_request"]))
$_SESSION["signed_request"] = $_POST["signed_request"];
die(header("Location:?sid=" . $sid));
}
if (empty($sid) || $_GET["sid"] != $sid)
die('<script>top.window.location="?start_session=true";</script>');
// End Session Fix