2012-01-20 14 views
5

Próbuję otworzyć okno dialogowe pliku danych za pomocą metody FB.ui zestawu JS SDK i zamknąć je po udostępnieniu użytkownika. Mój problem polega na tym, że okno dialogowe kanału wymaga rubryki redirect_uri, chociaż dokumentacja mówi, że nie musi być zdefiniowana, a okno popup przekierowuje tam i nie zamyka się tak jak mówi funkcja wywołania zwrotnego.Okno dialogowe kanału FB.ui wymaga polecenia redirect_uri, okno dialogowe nie zamyka się

Oto mój kod dołączony do złożenia kliknij imprezy:

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

Jeśli wyjadę poza redirect_uri, popup otwiera, ale po prostu mówi aplikacji FB ma błąd i spróbuj ponownie.

Odpowiedz

2

Wydaje się, że jest to znany zmiana Facebooka JavaScript SDK: http://developers.facebook.com/bugs/302946973066993

W przypadku korzystania z interfejsu API Facebook JavaScript, powołując FB.ui nie powiedzie, chyba że właściwość 'redirect_uri' jest dostarczany w obiekcie params - takie zachowanie jest nieoczekiwane, ponieważ:

1.) Dokumentacja stwierdza, że ​​"redirect_uri" będzie automatycznie dołączany przez większość SDK [1] - wcześniej SDK JavaScript zapewniał taki, który zamknął Lightbox iFrame. 2.) Dodanie parametru redirect_uri powoduje przekierowanie do iFrame Facebook Lightbox, co uniemożliwia użytkownikowi zamknięcie go. 3.) Parametr redirect_uri nie był wcześniej wymagany.

Jest to zachowanie, do którego jestem przyzwyczajony i próbowałem go skopiować. Deweloper FB informuje, że jest to teraz "z założenia".

+0

, więc po prostu nie możesz uniknąć przekierowania, naprawdę? – geekazoid

0

Hmmm, widzę docs mówi, że jest wymagana i musi być zdefiniowana ....

redirect_uri

URL przekierować do gdy użytkownik kliknie przycisk w oknie dialogowym. Wymagane, ale automatycznie określone przez większość pakietów SDK.

+1

Następnie zastanawiam się, dlaczego sam FB nie używa redirect_uri in i próbki kodu Ts z FB.ui i okno dialogowe kanału. –

+1

Podobnie jak my, twórcy Facebooka są ludźmi. Ilu deweloperów wiesz, że ich dokumentacja jest w 100% aktualna;) Pytanie retoryczne, ponieważ wszyscy wiemy, że odpowiedź to 0,000001% deweloperów. – DMCS

+1

Wygląda na poważne pominięcie przez twórców. W każdym razie nie mam nic przeciwko utrzymywaniu redirect_uri w miejscu, jeśli okno zamyka się po udostępnieniu. –

1

Po całym dniu pracy nad tym problemem, mam bardzo dobre rozwiązanie, które chciałbym udostępnić. Zamiast używać SDK z FB.ui(), odkryłem, że mogę tego uniknąć całkowicie, ręcznie otwierając moje własne popup do https://www.facebook.com/dialog/feed. Robiąc to w ten sposób, redirect_uri działa zgodnie z oczekiwaniami i możesz po prostu przekierować do pliku HTML, który zamyka okno wyskakujące. Niezależnie od tego, czy użytkownik kliknie opcję udostępniania lub anulowania, okienko wyskakujące zostanie zamknięte zgodnie z oczekiwaniami.

Nie sądzę, że istnieje jakikolwiek kompromis z tym kodem, a jeśli cokolwiek, jest o wiele łatwiejszy w użyciu niż rzeczywisty pakiet SDK.

kod Mój JavaScript (które można zapisać jako FacebookFeedDialog.js) wygląda następująco:

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

Oto przykładowy plik HTML, który używa powyższy kod javascript:

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

Twój closeWindow html plik może wyglądać tak:

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

Tutaj znalazłem podobne rozwiązanie: http://stackoverflowflow.com/questions/8497217/fb-ui-popup-window-doesnt-close/9025219#9025219 Pamiętaj, że dialog Feed jest zniechęcany teraz na korzyść z okna dialogowego udostępniania - myślałem, że ma być przestarzałe, ale nie mówi tego już na stronie okna dialogowego. Preferuję FD do SD, ponieważ ma więcej opcji dostosowywania. –