5

我只想为具有“publish_actions”权限和时间轴的用户启用某些功能。如何检测用户是否启用了时间轴?

4

4 回答 4

4

目前没有 API 方法可以检查用户是否启用了时间线。

您可以尝试结合Facebook JS-SDK Events使用“Add To Timeline (beta)”社交插件(传递publish_actionsas ) 。perms

订阅auth.loginauth.authResponseChange/或auth.statusChange事件并检查传递给事件侦听器status的属性,一旦事件触发并且用户是您可以发布操作,如果成功将用户标记为安装了时间线的用户。responseconnected

然而,这有一些缺点:

  • 最好不要向用户询问publish_actions“添加到时间线”社交插件以外的流程,以确保他们同时获得时间线和权限。
  • 您应该发布操作以确保他们已授予这样做的权限,因为这些事件可以是其他用户操作(如密码更改或 Facebook 用户切换等)。
于 2011-12-20T20:17:20.363 回答
3

1)部分解决方案是检查用户是否有一个名为“封面照片”的相册。虽然除了大多数激活时间线的用户之外,不是所有用户都会拥有这张专辑!

2) 一个可靠的方法是实际检索用户个人资料的 html 内容并检查它是否有时间线!!

于 2011-12-20T19:04:26.407 回答
1

最终(可能在不久的将来)每个人的个人资料都将转移到 Timeline,因此 facebook 似乎没有提供一种可靠的方法来检测启用了时间线的应用程序。

于 2011-12-22T00:43:38.973 回答
1

以下潜在解决方案不需要额外的权限请求。如果您在隐藏的 DIV 中添加 Facebook 时间线插件代码,您可以等到 FB Canvas 完成加载(或网页中的 xfbml)并测试该元素的 CSS 高度。如果用户没有时间轴,它将是 0px。否则,它将是 250 像素(正如我所包含的那样)。这仅适用于 Facebook 应用程序(不适用于 Facebook 集成网页)

如果用户没有通过将元素样式高度设置为 0 来激活时间线,Facebook 会隐藏此插件元素。

将此添加到您的应用页面:

<div id="timeline-hidden" style="display:none">
  <div class="fb-add-to-timeline" data-show-faces="true"></div>
</div>
<div id="timeline-test"></div>

然后,在您的 javascript 中(使用 jQuery,仅供参考):

window.fbAsyncInit = function () {
FB.init({ ... }); // after your FB.init code

    FB.Canvas.setDoneLoading(
  function (result) {

    var str_timeline;
    var tlsrc = $("#timeline-hidden").find("iframe").first().css("height");

    if("0px"==tlsrc)
        str_timeline = '<h2 style="color:red">This user DOES NOT have timeline.<h2>';
    else
        str_timeline = "<h2>This user DOES have timeline.</h2>";

    $("#timeline-test").html(str_timeline + ", timeline plugin css height:" + tlsrc + ", loadtime: " + result.time_delta_ms);
  }
);

};

由于潜在的网络延迟,以下Web 集成的可靠性稍差一些,但可以将概念修改为一些可行的解决方案:

由于在包含 FB 集成的网站上不会调用 FB.Canvas.setDoneLoading,因此修改上面的 FB.Canvas.setDoneLoading 函数以订阅 xfbml.render 操作并设置超时测试:

window.fbAsyncInit = function () { FB.init({ ... }); // 在你的 FB.init 代码之后

$(document).ready(function () {
    FB.Event.subscribe('xfbml.render',
  function () {
    setTimeout( function(){
        var str_timeline;
        var tlsrc = $("#timeline-hidden").find("iframe").first().css("height");

        if("0px"==tlsrc)
            str_timeline = '<strong><span style="color:red">This user DOES NOT have timeline.</span></strong>';
        else
            str_timeline = "<strong>This user DOES have timeline.</strong>";


        $("#timeline-test").html(str_timeline + ", timeline plugin css height:" + tlsrc);
    }, 250);
  }
);

});

};

我在测试中发现将FB.Event.subscribe('xfbml.render',移动到$(document).ready(function() { ... });有助于减少应用程序嵌入时的延迟一个 Facebook 页面(需要更长的时间来加载)。刚开始测试这个,所以它可能会也可能不会经受住进一步的测试。

于 2012-01-09T21:44:08.183 回答