2013-03-05 135 views
1

我使用codeigniter构建了一个简单的是或否测验应用程序。这是一个Facebook页面标签,因此可以在iframe中访问。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); 

编辑:

我已经打印出来的会话数据到应用程序,我可以看到,第一个正确的答案被存储,但这时如果你回答不正确不显示“correct_answer的东西。它也不增加。如果你回答所有的问题纠正最终的结果是1,如果没有正确的最终结果是0

+0

什么值可以返回?或者哪个错误返回? – 2013-03-05 13:39:57

+0

它不会返回错误,它只是不设置cookie – 2013-03-05 13:40:20

回答

3

不幸的是Safary阻止第三方的cookies,这是对我们的Facebook应用程序开发者的一个大问题。唯一能够正常工作的解决方案,即使在safari上有新的更新也是我在上面描述的那个。

我不知道你的应用程序设计得怎么样,但我做的每个应用程序都有一个登录页面,其中包含用于用户输入页面的按钮。

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

您可以在上面的问题中阅读更多关于此的内容。虽然大部分的答案是过时的,你会得到一个什么样的工作的想法,什么不

Safari 3rd party cookie iframe trick no longer working?

编辑

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

所以在着陆页上你只要把一个监听器,你的按钮(注意:我使用jQuery)

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

这是控制器方法“建立事务”

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> 
+0

好的。我的应用程序基本上更新了正确答案的每一次击中的cookie,然后加载下一个屏幕。第一次点击一个正确答案时,它确实如此设置: '[user_agent] => Mozilla/5.0(Macintosh; Intel Mac OS X 10_7_5)AppleWebKit/534.57.7(KHTML,如Gecko)Version/5.1。 7 Safari/534.57.7 [last_activity] => 1362495599 [user_data] => [correct_answers] => 1' – 2013-03-05 14:55:44

+0

你可以做到这一点,但不是没有用户第一次访问你的域名,这就是为什么你的应用程序在safari上工作正常外部iframe – 2013-03-05 14:57:19

+0

好的,用户会注意到他们离开了吗?我将如何实现这一点? – 2013-03-05 14:57:56

0

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

$config['sess_match_useragent'] = FALSE; 

有,有一个可能性IFRAME中的应用程序混淆了默认设置CI会话时执行的用户代理检查的结果。

否则从CI的适当的调试日志将是很好的,以便查看会话“丢失”的位置。

+0

我已经编辑了我的问题。用户是否第一次回答正确的答案。 – 2013-03-05 14:43:58

+0

但是,如果我在iframe之外的Safari浏览器中访问网站,它确实工作得很好。 – 2013-03-05 14:46:36

0

与法比奥的伟大的答案,这里有一个方法来检查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; 

}