2013-03-05 131 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; 

}