将Facebook应用从画布页面重定向到粉丝页面

13

我正在创建Facebook应用,作为页面内嵌的应用程序。目前我的问题是:我添加了Facebook请求对话框(http://developers.facebook.com/docs/reference/dialogs/requests),一切都很顺利,除了一个问题:当用户获得通知时,链接会跳转到画布页面而不是粉丝页(我想要去的地方...)

由于我无法说服Facebook添加一些功能(那将是很好的),因此我正在寻找一种自动从应用画布页面重定向到粉丝页的方法,在该粉丝页中已添加此应用程序作为iframe选项卡。

希望有人能理解我想做什么... :)

谢谢,彼得

4个回答

31

我还想确保用户通过Facebook页面选项卡查看我的Facebook应用程序(而不是通过Facebook应用程序页面或直接查看实际网站)。 我已经用这个Javascript在文档的标签中的<script>标签中实现了它(在Mac / PC FF,Chrome,Opera,IE6-8,Safari中测试过)。

<script type="text/javascript">
  function NotInFacebookFrame() {
    return top === self;
  }
  function ReferrerIsFacebookApp() {
    if(document.referrer) {
      return document.referrer.indexOf("apps.facebook.com") != -1;
    }
    return false;
  }
  if (NotInFacebookFrame() || ReferrerIsFacebookApp()) {
    top.location.replace("http://permalink-to-my-facebook-page-tab");
  }
</script>

非常好,正是我所需要的。我只是改用了带有命名空间的函数。 - Thiago Ganzarolli

14

如果我理解正确,你可以这样做:

top.location.href='http://www.facebook.com/YOUR_PAGE_NAME?sk=app_YOUR_APP_ID'

或者您可以使用一个头部来重定向到该网址。这将重定向到您粉丝页面上应用的选项卡。


1
我遇到了同样的问题,想知道你们是如何检测到自己在应用页面而不是画布URL的。你们是如何防止无限重定向循环的? - Michael Copeland
1
@Michael。嗯,通常您会将选项卡 URL 和页面 URL 分开,或者在应用程序设置中添加 GET 参数以了解调用了哪个页面。 - DannyKK
2
@DannyKK。感谢你的提示。我找到了一种不必设置GET变量的替代方法。您还可以检查$_SERVER['HTTP_REFERER']变量,以查看是否存在_apps.facebook.com_。 - Michael Copeland
是的,我也是这样做的。但现在我面临另一个问题:当HTTP_REFERER中有apps.facebook.com时,我会执行以下操作:top.location.href='http://www.facebook.com/YOUR_PAGE_NAME?sk=app_YOUR_APP_ID' - 在Mozzila和Chrome中运行良好,但在Internet Explorer中我得到了“权限被拒绝”的错误。我发现这是跨域脚本的问题,但有什么解决方法吗?有人遇到过同样的问题吗? - Peter
抱歉,我之前使用的是 top.window.location,但当我改为 top.location.href 后它就可以运行了 :) - Peter
你也可以通过解码来自Facebook的signed_request并查看它是否包含page=<your_page_id>来确定你是否在页面选项卡中。 - mtjhax

2
我的应用程序非常动态,我从不知道它添加到哪个页面。因此,当我使用URL 'http://www.facebook.com/YOUR_PAGE_NAME?sk=app_YOUR_APP_ID'时,它只会将我重定向到页面,而不是应用程序选项卡。我所做的是:
1)我从signed_request中获取页面ID(加密的base64url参数,您的应用程序一旦有人访问该页面就会收到,因此您必须对其进行解密并从JSON页面对象中选择id值)
2)然后我从https://graph.facebook.com/PAGE_ID_YOUR_GET获取页面数据。您会在JSON格式的响应中获得一些页面数据的JSON对象。
3)仅在第2点之后,我才从响应中获取页面的“链接”值。就像http://www.facebook.com/pages/Some-Page-Name 4)最后,我将'?sk=app_YOUR_APP_ID'添加到页面链接中。
也许这太复杂了,但这是我期望的唯一工作方式(精确重定向到页面应用程序选项卡)。

1
如果用户直接进入您的应用程序(画布),则此方法将无法正常工作,因为signed_request中不会有页面对象,因此无论如何,您都必须在每个应用程序配置实例中设置页面名称和ID,以便重定向到正确的位置。 - Programista

-2
<script type="text/javascript">
  function NotInFacebookFrame() {
    return top === self;
  }
  function ReferrerIsFacebookApp() {
    if(document.referrer) {
      return document.referrer.indexOf("apps.facebook.com") == -1;
    }
    return false;
  }
  if (NotInFacebookFrame() || ReferrerIsFacebookApp()) {
    top.location.replace("http://permalink-to-my-facebook-page-tab");
  }
</script>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接