2012-01-20 19 views
5

Sto tentando di aprire una finestra di dialogo del feed utilizzando il metodo FB.ui di JS SDK e di chiuderla dopo la condivisione dell'utente. Il mio problema è che la finestra di dialogo dei feed richiede un redirect_uri anche se la documentazione dice che non è necessario definirla, e la finestra popup reindirizza lì e non si chiuderà come dice la funzione di callback.La finestra di dialogo Feed FB.ui richiede redirect_uri, la finestra di dialogo non viene chiusa

Ecco il mio codice, collegato all'evento inviare clicca:

FB.ui (
     { 
      method: 'feed', 
      name: 'xxx!', 
      link: 'link to FB tab', 
      picture: 'jpg', 
      caption: 'xxx', 
      actions: {name:'xxx',link:'url'}, 
      ref: 'xxx', 
      redirect_uri: 'link to FB tab' 
     }, 
     function(response) { 
      self.close(); 
     } 
    ); 

Se lascio fuori redirect_uri, il popup si apre, ma si dice solo l'applicazione FB ha un errore e riprova.

risposta

2

Sembra questo è un cambiamento conosciuto in di JavaScript SDK: http://developers.facebook.com/bugs/302946973066993

Quando si utilizza l'API JavaScript, invocando FB.ui fallirà a meno che una proprietà 'redirect_uri' è fornito nell'oggetto params - questo comportamento è inaspettato perché:

1.) La documentazione afferma che il 'redirect_uri' verrà automaticamente aggiunto dalla maggior parte degli SDK [1] - in precedenza l'SDK di JavaScript ne forniva uno che chiudeva il Lightbox iFrame. 2.) L'aggiunta di un parametro redirect_uri risulta nel reindirizzamento iFrame di Facebook, che impedisce all'utente di chiuderlo. 3.) Il parametro redirect_uri non era richiesto in precedenza.

Questo è il comportamento a cui sono abituato e che ho provato a duplicare. Un deviatore FB segnala che questo è ora "in base alla progettazione".

+0

quindi, non puoi proprio evitare di essere reindirizzato, davvero? – geekazoid

0

Hmmm, la documentazione vedo dice che è obbligatorio e deve essere definito ....

redirect_uri

L'URL per reindirizzare a dopo che l'utente fa clic su un pulsante nella finestra di dialogo. Obbligatorio, ma specificato automaticamente dalla maggior parte degli SDK.

+1

Quindi mi chiedo perché FB non usa redirect_uri in i campioni di codice t di FB.ui e la finestra di dialogo del feed. –

+1

Come noi, gli sviluppatori di Facebook sono umani. Quanti sviluppatori conosci che mantengono aggiornata la loro documentazione al 100%;) Domanda retorica, perché sappiamo tutti che la risposta è lo 0,000001% degli sviluppatori. – DMCS

+1

Sembra una grave omissione da parte degli sviluppatori. In ogni caso, non mi interessa mantenere redirect_uri sul posto se la finestra si chiude dopo la condivisione. –

1

Dopo aver trascorso un'intera giornata a lavorare su questo problema, ho un'ottima soluzione che mi piacerebbe condividere. Invece di usare l'SDK con FB.ui(), ho scoperto che posso evitarlo completamente aprendo manualmente il mio popup a https://www.facebook.com/dialog/feed. Quando lo fai in questo modo, redirect_uri funziona come previsto, e puoi semplicemente reindirizzare a un file HTML che chiude la finestra popup. Se l'utente fa clic su share o cancel, il popup si chiuderà come previsto.

Non credo che ci siano compromessi con questo codice e, semmai, è molto più facile da usare rispetto all'SDK attuale.

codice mio Javascript (che si può salvare come FacebookFeedDialog.js) si presenta così:

/* by Steven Yang, Feb 2015, originally for www.mathscore.com. This code is free for anybody to use as long as you include this comment. */ 
function FacebookFeedDialog(appID, linkTarget, redirectTarget) { 
    this.mParams = { 
    app_id: appID, 
    link: linkTarget, 
    redirect_uri: redirectTarget, 
    display: "popup" 
    } 
}; 

/* Common params include: 
    name - the title that appears in bold font 
    description - the text that appears below the title 
    picture - complete URL path to the image on the left of the dialog 
    caption - replaces the link text 
*/ 
FacebookFeedDialog.prototype.addParam = function(key, value) { 
    this.mParams[key] = value; 
}; 

FacebookFeedDialog.prototype.open = function() { 

    var url = 'https://www.facebook.com/dialog/feed?' + encodeCGIArgs(this.mParams); 
    popup(url, 'feedDialog', 700, 400); 
}; 

/* Takes a param object like this: 
    { arg1: "value1", arg2: "value2" } 
    and converts into CGI args like this: 
    arg1=value1&arg2=value2 

    The values and args will be properly URI encoded 
*/ 
function encodeCGIArgs(paramObject) { 

    var result = ''; 

    for (var key in paramObject) { 
    if (result) 
     result += '&'; 
    result += encodeURIComponent(key) + '=' + encodeURIComponent(paramObject[key]); 
    } 

    return result; 
} 

function popup(mylink,windowname,width,height) { 
    if (!window.focus) return; 
    var href; 
    if (typeof(mylink) == 'string') 
    href=mylink; 
    else 
    href=mylink.href; 
    if (!windowname) 
    windowname='mywindow'; 
    if (!width) 
    width=600; 
    if (!height) 
    height=350; 
    window.open(href, windowname, 'resizable=yes,width='+width+',height='+height+',scrollbars=yes'); 
} 

Ecco un esempio di file HTML che utilizza il codice Javascript di cui sopra:

<HTML> 
<BODY> 
<SCRIPT type="text/javascript" src="FacebookFeedDialog.js"></SCRIPT> 
<SCRIPT> 
var dialog = new FacebookFeedDialog(yourAppIDGoesHere,yourDestinationURLGoesHere,yourCloseWindowURLGoesHere); 
dialog.addParam('name','This is my title'); 
dialog.addParam('description','This is the description'); 
dialog.addParam('picture',yourImageURLGoesHere); 
dialog.addParam('caption','This is the caption'); 
</SCRIPT> 

<A href="javascript:dialog.open()">Open facebook dialog</A> 
</BODY> 
</HTML> 

tuo CloseWindow html il file può avere il seguente aspetto:

<SCRIPT> 
window.close(); 
</SCRIPT> 
+0

Ho trovato una soluzione simile qui: http://stackoverflow.com/questions/8497217/fb-ui-popup-window-doesnt-close/9025219#9025219 Si noti che la finestra di dialogo Feed si sta scoraggiando ora a favore del Dialogo Condividi: pensavo che fosse deprecato ma non lo dice più nella pagina del dialogo. Preferisco FD a SD poiché ha più opzioni di personalizzazione. –

Problemi correlati