Диалог канала FB.ui требует redirect_uri, диалог не закрывается - PullRequest
5 голосов
/ 21 января 2012

Я пытаюсь открыть диалоговое окно канала с помощью метода FB.ui в JS SDK и закрыть его после публикации пользователем. Моя проблема в том, что диалоговое окно подачи требует redirect_uri, хотя в документации сказано, что его не нужно определять, и всплывающее окно перенаправляется туда и не закрывается, как говорит функция обратного вызова.

Вот мой код, прикрепленный к событию отправки клика:

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

Если я отключу redirect_uri, откроется всплывающее окно, но в нем просто говорится, что в приложении FB произошла ошибка, и повторите попытку.

Ответы [ 3 ]

2 голосов
/ 23 января 2012

Похоже, это известное изменение в JavaScript SDK Facebook: http://developers.facebook.com/bugs/302946973066993

При использовании JavaScript API Facebook, вызов FB.ui завершится неудачей, если в объекте params не указано свойство 'redirect_uri' - это поведение неожиданно, потому что:

1.) В документации говорится, что 'redirect_uri' будет автоматически добавляться большинством SDK [1] - ранее JavaScript SDK предоставлял тот, который закрывал Lightbox iFrame. 2.) Добавление параметра redirect_uri приводит к перенаправлению Facebook Lightbox iFrame, которое лишает пользователя возможности его закрыть. 3.) Параметр redirect_uri ранее не требовался.

Это поведение, к которому я привык и пытаюсь его воспроизвести. Разработчик FB сообщает, что теперь это «по замыслу».

1 голос
/ 13 февраля 2015

После целого дня работы над этой проблемой у меня есть очень хорошее решение, которым я хотел бы поделиться. Вместо того, чтобы использовать SDK с FB.ui (), я обнаружил, что могу полностью избежать этого, открыв собственное всплывающее окно вручную до https://www.facebook.com/dialog/feed. При этом способе redirect_uri работает, как и ожидалось, и вы можете просто перенаправить в HTML-файл, который закрывает всплывающее окно. Независимо от того, нажмет ли пользователь на кнопку «Поделиться» или «Отмена», всплывающее окно закроется, как ожидается.

Я не верю, что с этим кодом есть какие-либо компромиссы, и в любом случае его гораздо проще использовать, чем сам SDK.

Мой код Javascript (который вы можете сохранить как FacebookFeedDialog.js) выглядит следующим образом:

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

Вот пример HTML-файла, который использует приведенный выше код 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>

Ваш HTML-файл closeWindow может выглядеть следующим образом:

<SCRIPT>
window.close();
</SCRIPT>
0 голосов
/ 21 января 2012

Хммм, документы, которые я вижу, говорят, что это требуется и должно быть определено ....

redirect_uri

URL-адрес для перенаправления после нажатия пользователем кнопки в диалоговом окне. Требуется, но автоматически указывается большинством SDK.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...