【问题标题】:How can I check to see if the user has Facebook Timeline?如何查看用户是否拥有 Facebook 时间线?
【发布时间】:2011-12-17 05:46:18
【问题描述】:

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

【问题讨论】:

    标签: facebook facebook-graph-api facebook-timeline


    【解决方案1】:

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

    您可以尝试将"Add To Timeline (beta)" social plugin(将publish_actions 传递为perms)与Facebook JS-SDK Events 结合使用。

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

    然而,这有一些缺点:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

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

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

          <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 Integration 的以下内容不太可靠,但可以将概念修改为一些可行的解决方案:

          由于在包含 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 页面时减少延迟(加载时间稍长)。刚刚开始对此进行测试,因此它可能会或可能不会经受住进一步的测试。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-09-03
            • 1970-01-01
            • 1970-01-01
            • 2018-08-06
            • 1970-01-01
            • 1970-01-01
            • 2013-05-16
            • 2015-01-22
            相关资源
            最近更新 更多