我正在开发一个facebook iFrame应用程序,它将嵌入到facebook页面中。我已选择iFrame,因为Facebook已弃用FBML。
我的申请已准备好,但我面临一个小问题
调用FB.login时,会出现一个弹出窗口。我的应用程序要求是,无论何时加载,都应该检查用户是否被授权,如果没有,则显示一个要求扩展权限/登录的Dialog
问题: 弹出窗口是一个新窗口的形式,Safari默认阻止,因为窗口是通过javascript打开而不是通过点击,我希望它显示为facebook通常为fbml应用程序显示的灯箱/阴影
我在http://developers.facebook.com/blog/post/312看了
块引用 为了在连接帐户时提供更一致和安全的用户体验,当用户已经登录到Facebook时,当用户连接您的站点和Facebook之间的帐户时,我们会更改对话框的行为。以前,Connect with Facebook对话框出现在浏览器窗口的IFrame“lightbox”中。在明天的每周代码推送之后,对话框将弹出一个单独的浏览器窗口,其中包含一个地址栏,当用户未登录到Facebook并尝试将帐户与您的站点连接时,该地址栏与用户登录流程相匹配。这也将使用户更容易识别URL是否值得信赖且来自Facebook。 块引用
但是这个新功能显然无法帮助我。
对此有何解决方法?
我的代码:
<script src="http://connect.facebook.net/en_US/all.js"></script>
<script type="text/javascript">
FB.init({ appId : '161077430577043', status : true, cookie : true, xfbml : true });
FB.getLoginStatus(function(response) {
// alert("response: " + response.session);
if (response.session) {
// alert("response of getlogin status, permissions: " + response.perms);
login();
}
else{
document.getElementById('loginStatus').innerHTML = "Login and Grant Permission";
logMeIn();
}
});
function logMeIn(){
FB.login(function(response) {
// alert("login!");
if (response.session) {
// alert("Granted permissions: " + response.perms);
login();
} else {
// alert("not logged in");
}
}, {perms:'read_stream,publish_stream,offline_access,friends_birthday,email'});
}
function login(){
FB.api('/me', function(response) {
document.getElementById('login').innerHTML="Welcome " + response.name;
});
getFriendsData();
}
function getFriendsData(){
// fetches data from Graph API
}
</script>
答案 0 :(得分:1)
我想出了如何解决这个问题。 现在我使用通过PHP生成的FBML提示和signed_request获取权限。
我错过了一个重要的观点,即一旦授予了权限,无论使用何种sdk,它们都将可用。即从fbml获得许可并使用它们与php
答案 1 :(得分:0)
我认为出于安全原因,他们不允许登录流程进入iframe。唯一的方法是将用户重定向到登录页面(替换当前页面)。这可以在服务器端或客户端完成。
答案 2 :(得分:0)
如果您从FB.login()
事件中发起click
来电,则浏览器不应阻止新窗口。
类似的东西:
<button onclick="logMeIn();">Log in with Facebook</button>
脚本:
function logMeIn() {
FB.login(...);
}
来自Facebook文档(link):
如此函数的参考文档中所述,它会生成一个显示“登录”对话框的弹出窗口,因此只应在有人单击HTML按钮时调用(以便浏览器不会阻止弹出窗口) )。