2012-04-03 12 views
7

मुझे अपने फेसबुक ऐप को सफारी पर काम करने में समस्या है।सफारी और PHP सत्र फेसबुक में काम नहीं कर रहे हैं iframe

समस्या PHP सत्र चर से संबंधित है।

मुझे पता है कि सफारी क्रॉस डोमेन सत्र के साथ काम कर एक समस्या (एक iframe के भीतर) है हूँ और मैं समाधान के आसपास 2 प्रकार पाया:

  1. P3P शीर्ष लेख की स्थापना: मैं कई P3P शीर्ष लेख पाया की कोशिश की है चारों ओर लेकिन उनमें से कोई भी काम नहीं किया [उदाहरण के लिए: header('P3P: CP="NOI ADM DEV COM NAV OUR STP"');]।
  2. जावास्क्रिप्ट का उपयोग करते हुए आईफ्रेम पर एक पोस्ट भेजना। यह बातचीत करता है और सत्रों को काम करना चाहिए। लेकिन तथ्य यह है कि मैं आईफ्रेम कंटेनर को नियंत्रित नहीं करता, क्योंकि वह फेसबुक है।

क्या कोई वैकल्पिक समाधान जानता है?

धन्यवाद!

+0

मेरे पास एक ही समस्या थी और [मेरे लिए उपयुक्त एक वर्कअराउंड बनाया गया] [http://stackoverflow.com/a/10833632/770984)। उम्मीद है की यह मदद करेगा। –

उत्तर

3

संपादित करें: पुष्टि की गई, यह कामकाज अब मैक पर सफारी 5.1 पर काम नहीं करता है। यहां चर्चा की गई: Safari 3rd party cookie iframe trick no longer working?

मुझे नहीं पता कि आपका उपयोग केस क्या है लेकिन हमारे ऐप में हमारे पास 'एक्सेस एक्सेस' बटन के साथ एक स्वागत स्क्रीन है जो अनुमति संवाद खोलती है। जब उपयोगकर्ता 'एक्सेस एक्सेस' पर क्लिक करता है, तो मैं उस नई विंडो को खोलने के लिए उपयोग करता हूं जो सत्र सेट करता है और तुरंत बंद हो जाता है (यह उपरोक्त प्रश्न में प्रस्तावित किया गया था)। उपयोगकर्ता ने एक्सेस की अनुमति देने के बाद आप पेज को फिर से लोड कर सकते हैं? हमारे मामले में यह आवश्यक नहीं है क्योंकि सर्वर के सभी संचार AJAX के साथ है।


मैं दूसरा समाधान का उपयोग कर रहा है और इसके साथ कोई समस्या नहीं है, यहाँ मेरी कोड (jQuery का उपयोग) है:

/** 
* Hack for Safari cross-domain cookies. See: 
* http://anantgarg.com/2010/02/18/cross-domain-cookies-in-safari/ 
*/ 

$(document).ready(function() { 

    var isSafari = (/Safari/.test(navigator.userAgent)); 

    if (isSafari) { 
     var iframe = $("<iframe />"); 
     iframe.attr("id", "cookieframe"); 
     iframe.attr("name", "cookieframe"); 
     iframe.hide(); 

     var form = $("<form />"); 
     form.attr("id", "cookieform"); 
     form.attr("target", "cookieframe"); 
     form.attr("enctype", "application/x-www-form-urlencoded"); 
     form.attr("action", "startsession.php"); 
     form.attr("method", "post"); 

     $("body").append(iframe); 
     $("body").append(form); 
     form.submit(); 
    } 

}); 

startsession.php में मैं सिर्फ सत्र प्रारंभ हूँ:

<?php session_start(); 
+1

यह समाधान मेरे लिए काम नहीं करता है। मैंने किसी भी HTML आउटपुट से पहले सत्र चर सेट अप किया है, इसलिए मैं पोस्ट भेजने के लिए इस जावास्क्रिप्ट का उपयोग करने में सक्षम नहीं हूं। उस पल में, मुझे पहले से ही जेनरेट किए गए सत्रों को पढ़ने की जरूरत है। – user1310165

+0

बर्फबारी पर सफारी पर काम नहीं करता –

+0

यह काम नहीं करता है। जमा करने पर रखता है। – Steve

3

मैं यह करने के लिए देर से कर रहा हूँ, लेकिन यह अच्छी तरह से मदद मिल सकती है किसी और को इस समस्या को देख। फिर वापस अनुप्रेषित -

एकमात्र तरीका मैं काम कर सकता है मेरी iframe के भीतर से सफारी का पता लगाने और एक अन्य पेज क्षण भर के, जहां मैं अपने सत्र कुकी सेट कर सकते हैं पर पुन: निर्देशित किया गया था।

<?php 
// sort out ie with the below header 
header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"'); 
session_start(); 
$_SESSION = array(); 

// if Safari and no cookies have been set yet, take me to another page to set a session cookie 
if (strpos($_SERVER['HTTP_USER_AGENT'], 'Safari') && !strpos($_SERVER['HTTP_USER_AGENT'], 'Chrome')) { 
    if (count($_COOKIE) === 0) { 
    echo '<script> 
    top.location = "http://www.domain.com/setcookie.php"; 
    </script>'; 
    } 
} 
?> 

फिर setcookie.php

<?php 
//inside setcookie.php 
header('P3P: CP="CAO PSA OUR"'); 
session_start(); 
$_SESSION = array(); 

echo 
'<script> 
top.location = "http://www.backtooriginaldomain.com"; 
</script>'; 
?> 

से थोड़ा लंगड़ा लेकिन काम करता है और अन्य ब्राउज़रों के साथ हस्तक्षेप नहीं करता है। अन्य विधि एक पॉपअप विंडो का उपयोग करने हालांकि मेरी सफारी यह डिफ़ॉल्ट रूप से अवरुद्ध कर दिया है।

+0

दिलचस्प। मैं PHP में एक नौसिखिया हूं और एक ही मुद्दे को हल करने की कोशिश कर रहा हूं लेकिन रेल के लिए। क्या आप समझा सकते हैं कि यह समाधान क्यों काम करता है? – colllin

0

अब तक का सबसे अच्छा समाधान नहीं है लेकिन आपको किसी भी अतिरिक्त पेज की आवश्यकता नहीं है अपने पृष्ठ पर पहली स्थिति पर समाधान डालें ताकि आप केवल कुछ सफेद झिलमिलाहट देख सकें।

<?php 
if (isset($_GET['safarifix'])) { 
    session_start(); 
    echo '<script type="text/javascript">top.location = \''.$_GET['safarifix'].'\'</script>'; 
    exit(); 
} 

if (!isset($_COOKIE, $_COOKIE['PHPSESSID'])) { 
    header('P3P: CP="CAO PSA OUR"'); 
    echo '<script type="text/javascript">top.location = document.URL + "?safarifix=" + encodeURIComponent(document.referrer)</script>'; 
    exit(); 
} 
?> 

उस पृष्ठ पर अपना रेफरिंग यूआरएल भेजें जहां आप वास्तव में अपनी सामग्री करते हैं। कुछ भी अतिरिक्त आवश्यकता नहीं है। फिर वापस पेज आप पहली जगह में किया गया है reffer।

संबंधित मुद्दे