【发布时间】:2011-12-17 05:46:18
【问题描述】:
我只想为具有“publish_actions”权限和时间轴的用户启用某些功能。如何检测用户是否启用了时间轴?
【问题讨论】:
标签: facebook facebook-graph-api facebook-timeline
我只想为具有“publish_actions”权限和时间轴的用户启用某些功能。如何检测用户是否启用了时间轴?
【问题讨论】:
标签: facebook facebook-graph-api facebook-timeline
目前没有 API 方法可以检查用户是否启用了时间线。
您可以尝试将"Add To Timeline (beta)" social plugin(将publish_actions 传递为perms)与Facebook JS-SDK Events 结合使用。
订阅auth.login、auth.authResponseChange 和/或auth.statusChange 事件并检查status 传递给事件侦听器的属性,一旦事件触发并且用户是connected,您可以publish action 并且如果成功将用户标记为安装了时间线的用户。
然而,这有一些缺点:
publish_actions,以确保他们已获得时间线和权限。【讨论】:
1) 部分解决方案是检查用户是否拥有名为“封面照片”的相册。尽管除了大多数激活时间线的用户之外,并非所有用户都会拥有这张专辑!
2) 一个可靠的方法是实际检索用户个人资料的 html 内容并检查它是否有时间线!!
【讨论】:
最终(可能在不久的将来)每个人的个人资料都将转移到 Timeline,因此 facebook 似乎没有提供可靠的方法来检测启用了时间轴的应用程序。
【讨论】:
以下潜在解决方案不需要额外的权限请求。如果您在隐藏的 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 页面时减少延迟(加载时间稍长)。刚刚开始对此进行测试,因此它可能会或可能不会经受住进一步的测试。
【讨论】: