1

我使用 codeigniter 构建了一个简单的是或否测验应用程序。它是一个 facebook 页面选项卡,因此可以在 iframe 中访问。

随着用户通过测验的进展,他们的分数对于每个正确答案都会增加 +1,并使用会话类存储。

它在 Chrome 中很好用,但在 safari 中由于某种原因无法存储分数。

//if the user answered correctly add one correct answer

$correct_answers = $this->session->userdata('correct_answers');
$correct_answers += 1;
$this->session->set_userdata('correct_answers', $correct_answers);

编辑:

我已将会话数据打印到应用程序上,我可以看到存储了第一个正确答案,但是如果您回答不正确,它不会显示任何“正确答案”。它也不会增加。如果您要正确回答所有问题,则最终结果为 1。如果没有正确答案,则最终结果为 0。

4

4 回答 4

3

不幸的是,Safary 阻止了 3rd 方 cookie,这对我们 Facebook 应用程序开发人员来说是一个大问题。即使对 safari 有新的更新,唯一可以肯定工作的解决方案是我将在上面描述的解决方案。

我不知道您的应用程序是如何设计的,但我所做的每个应用程序都有一个带有按钮的登录页面,供用户进入该页面。

这个按钮有两个主要用途,第一个是在用户尚未授予的情况下请求权限,另一个是打开一个新窗口,其中包含我的应用所在的 url。因为用户在 iframe 之外访问您的域,您可以创建一个会话,所以基本上这个新窗口访问我的 url 创建一个会话,然后自行关闭。

您可以在上面的问题中阅读更多相关信息。尽管大多数答案都已过时,但您会了解哪些有效,哪些无效

Safari 3rd 方 cookie iframe 技巧不再有效?

编辑

我所做的是在用户按下按钮后,应用程序转到下一页,然后我打开一个带有一些 javascript 的新窗口(如弹出窗口)。

因此,在登录页面上,您只需在按钮上放置一个侦听器(注意我使用的是 jquery)

$(document).on("click", ".bt-landing", function(){
window.open('<?=site_url("app/create_session")?>', '_blank', 'toolbar=0,location=0,menubar=0');
});

这是控制器方法“create_session”的代码

public function create_session(){
        setcookie("safari_test", "1");
        $this->load->view('create_session');
    }

加载的视图是这个:

<html>
    <head>
        <meta charset="utf-8">
        <title>App title</title>
        <script type="text/javascript" src="<?=base_url('public/js/jquery-1.9.1.min.js')?>"></script>
    </head>
    <body>
    <script type="text/javascript">
    $(document).ready(function(){
       setTimeout(function(){window.close()},1000);
    })
    </script>
    </body>
</html>
于 2013-03-05T14:51:34.983 回答
1

如果您使用 IE,则必须使用 P3P 隐私政策。如果你没有,cookie 不能在 facebook 上的 iframe 下工作:

生成 P3P 隐私政策:

http://www.p3pwiz.com/begin.php

你可以试试这个,一些用户说也很有用:

http://viralpatel.net/blogs/how-to-set-third-party-cookies-with-iframe/

信息:

http://en.wikipedia.org/wiki/P3P

于 2013-03-05T14:33:35.447 回答
0

尝试更改您的配置设置/application/config/config.php

$config['sess_match_useragent'] = FALSE;

将应用程序放在 IFRAME 中可能会弄乱由 CI 会话的默认设置执行的用户代理检查的结果。

否则,来自 CI 的正确调试日志会很好,以便查看会话“丢失”的位置。

于 2013-03-05T14:03:14.163 回答
0

与 Fabio 的最佳答案相关,这里有一种检查 Safari 的方法:

function isSafari() {

    var ua = navigator.userAgent.toLowerCase();
    if (ua.indexOf('safari') != -1) {
        if(ua.indexOf('chrome')  > -1) {
            return false;
        } else {
            return true;
        }
    }

    return false;

}
于 2013-07-16T14:29:04.587 回答