1

codeigniter を使用して、簡単な yes または no クイズ アプリを作成しました。これは 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 になります。1 つも正しくない場合、最終結果は 0 になります。

4

4 に答える 4

3

残念ながら、Safary はサード パーティの Cookie をブロックしており、これは Facebook アプリの開発者にとって大きな問題です。サファリの新しいアップデートがあっても確実に機能する唯一の解決策は、上で説明したものです。

あなたのアプリがどのように設計されているかはわかりませんが、私が行っているすべてのアプリには、ユーザーがページに入るボタンのあるランディング ページがあります。

このボタンには 2 つの主な目的があります。最初の目的は、ユーザーがまだ許可していない場合に許可を要求することであり、もう 1 つは、アプリが配置されている URL で新しいウィンドウを開くことです。ユーザーは iframe 外のドメインにアクセスしているため、セッションを作成できます。基本的に、この新しいウィンドウが私の URL にアクセスするとセッションが作成され、自動的に閉じます。

これについては、上記の質問で詳しく読むことができます。ほとんどの回答は時代遅れですが、何が機能し、何が機能しないかがわかります

Safari サードパーティ 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

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 に答える
0

あなたの構成設定を変更してみてください/application/config/config.php

$config['sess_match_useragent'] = FALSE;

アプリを IFRAME に配置すると、CI セッションのデフォルト設定で実行されるユーザー エージェント チェックの結果が台無しになる可能性があります。

それ以外の場合は、セッションが「失われた」場所を確認するために、CI からの適切なデバッグ ログが適切です。

于 2013-03-05T14:03:14.163 に答える