2012-01-20 19 views
5

estoy tratando de abrir un diálogo con el método de alimentación FB.ui del SDK JS y tenerlo cerca después de las acciones de los usuarios. Mi problema es que el diálogo de alimentación requiere un redirect_uri aunque la documentación dice que no tiene que definirse, y la ventana emergente redirige allí y no se cierra como dice la función de devolución de llamada.de diálogo alimentación FB.ui requiere redirect_uri, de diálogo no cerrar

Aquí está mi código, que se adjunta al evento haga clic en enviar:

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(); 
     } 
    ); 

Si dejo fuera redirect_uri, la ventana emergente se abre, pero simplemente dice que la aplicación FB tiene un error y vuelve a intentarlo.

Respuesta

2

Parece que este es un cambio conocido en JavaScript SDK de Facebook: http://developers.facebook.com/bugs/302946973066993

Al utilizar la API de Facebook JavaScript, invocando FB.ui fallará a menos que una propiedad '' redirect_uri se suministra en el objeto params - Este comportamiento es inesperado porque:

1.) La documentación indica que el 'redirect_uri' se agregará automáticamente por la mayoría de los SDK [1]. Anteriormente, el JavaScript SDK proporcionaba uno que cerraba el iFrame de Lightbox. 2.) Agregar un redirect_uri param da como resultado el redireccionamiento de Facebook Lightbox iFrame que impide que el usuario pueda cerrarlo. 3.) El parametro redirect_uri no fue requerido previamente.

Este es el comportamiento al que estoy acostumbrado y he tratado de duplicar. Un desarrollador de FB informa que esto ahora es "por diseño".

+0

entonces, ¿no puedes evitar ser redireccionado, realmente? – geekazoid

0

Hmmm, los documentos que veo dice que es necesario y debe ser definido ....

redirect_uri

La URL para redireccionar después el usuario hace clic en un botón en el cuadro de diálogo. Requerido, pero especificado automáticamente por la mayoría de los SDK.

+1

Entonces me pregunto por qué FB en sí mismo no usa redirect_uri en i ts muestras de código de FB.ui y el diálogo de alimentación. –

+1

Al igual que nosotros, los desarrolladores de Facebook son humanos. ¿Cuántos desarrolladores conoce que mantienen su documentación al 100% actualizada?) Pregunta retórica, porque todos sabemos que la respuesta es 0.000001% de los desarrolladores. – DMCS

+1

Parece una gran omisión por parte de los desarrolladores. En cualquier caso, no me importa mantener redirect_uri en su lugar si la ventana se cierra después de compartir. –

1

Después de pasar toda una jornada de trabajo sobre este problema, tengo una muy buena solución que me gustaría compartir. En lugar de usar el SDK con FB.ui(), descubrí que puedo evitarlo completamente abriendo manualmente mi ventana emergente al https://www.facebook.com/dialog/feed. Al hacerlo de esta manera, redirect_uri funciona como se esperaba, y puede redirigir a un archivo HTML que cierra la ventana emergente. Si el usuario hace clic en compartir o cancelar, la ventana emergente se cerrará como se esperaba.

no creo que hay ningún compromiso con este código y, en todo caso, es mucho más fácil de usar que el SDK real.

código Javascript Mi (que se puede guardar como FacebookFeedDialog.js) tiene el siguiente aspecto:

/* 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'); 
} 

Aquí hay un ejemplo de archivo HTML que utiliza el código Javascript arriba:

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

Su CloseWindow html el archivo puede verse así:

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

Vine con una solución similar aquí: http://stackoverflow.com/questions/8497217/fb-ui-popup-window-doesnt-close/9025219#9025219 Tenga en cuenta que el cuadro de diálogo de alimentación se desaconseja ahora a favor del cuadro de diálogo Compartir: pensé que sería obsoleto, pero ya no dice eso en la página del diálogo. Prefiero FD a SD ya que tiene más opciones de personalización. –

Cuestiones relacionadas