FB.Login对话框弹出窗口在关闭时不回调

时间:2014-01-08 10:54:56

标签: facebook facebook-javascript-sdk facebook-apps facebook-login

FB.Login Popup Dialog http://s17.postimg.org/47zhfnt0d/8_1_2014_6_33_34_PM.jpg

  • FB.Login有3个可点击按钮:
    1. 取消
    2. 右上角的
    3. “关闭”按钮(关闭弹出窗口)

当用户同时点击取消& 好的按钮,使用 authResponse 触发回调,这样我就可以处理用户是否授权该应用。

但如果用户点击“关闭”关闭弹出窗口,我只会收到 authResponse 一次。第二次弹出用户关闭FB.Login对话框时,不会触发回调函数。

这是我的代码:

FB.login(facebook_login, { scope: 'email, publish_actions, user_birthday' });

function facebook_login(response) {
    console.log('facebook_login');    //update
    console.log(response);            //update
    if (response.status === 'connected') {
        console.log('connected');
    }
    else if (response.status === 'not_authorized') {
        FB.login(facebook_login, { scope: 'email, publish_actions, user_birthday' });
    }
    else {
        // the user isn't logged in to Facebook.
        FB.login(facebook_login, { scope: 'email, publish_actions, user_birthday' });
    }
}

我打算提示用户3次授权该应用。

###更新###

我实际上记录了我的回调函数收到的每个响应。请参阅上面的更新,但关闭对话框弹出窗口仅返回响应一次,“status = not_authorized”。 单击取消将返回相同的状态,但会再次显示登录弹出窗口。

我的控制台日志:

Callback response log http://jan.imghost.us/16Np.jpg

3 个答案:

答案 0 :(得分:1)

很抱歉这么说,但如果用户取消了 尝试再次执行身份验证 - 如果您尝试在回拨{{1}时再次呼叫FB.login然后用户的弹出窗口阻止程序将触发,对话框将失败。例如,在Chrome中,他们会看到如下内容:

enter image description here

相反,您应该向用户显示一条消息,告诉他们为什么需要进行身份验证,并使用下面的按钮或链接,以便他们在改变主意时再试一次。

如果您在回调中调用FB.login,这是一个异步事件,大多数浏览器会阻止弹出窗口出现在这种情况下。来自Facebook FB.login docs

  

调用FB.login会导致JS SDK尝试打开弹出窗口   窗口。 因此,只应在用户点击后调用此方法   事件,否则大多数浏览器都会阻止弹出窗口。

答案 1 :(得分:0)

当您点击关闭按钮时,您将获得reponse.status='unknown'。所以你必须在你的代码中检查这一点。使用此代码

FB.login(facebook_login, { scope: 'email, publish_actions, user_birthday' });

function facebook_login(response) {
    if (response.status === 'connected') {
        console.log('connected');
    }
    else if (response.status === 'not_authorized'  || response.status=='unknown') {
        FB.login(facebook_login, { scope: 'email, publish_actions, user_birthday' });
    }
    else {
        // the user isn't logged in to Facebook.
        FB.login(facebook_login, { scope: 'email, publish_actions, user_birthday' });
    }
}

注意您必须允许弹出窗口,因为浏览器的弹出窗口阻止程序不允许这样做。所以请检查一下。

答案 2 :(得分:0)

只有在浏览应用程序URL打开应用程序时才会出现此问题。如果在Facebook中查看应用程序(例如:点击Facebook主页左侧边栏上的应用程序链接),FB.Login弹出对话框甚至不会有“关闭”按钮。

此外,如果应用程序在Facebook中运行,则不允许在用户单击取消后重新提示授权。如果用户在用户点击取消后尝试再次请求授权,用户将被重定向到帮助页面,如下所示。

Facebook Help Page if Re-authorization

类似的东西要实现这个

提示用户仅授权应用程序ONCE,然后将其重定向回粉丝页面,或向用户显示类似“请授权应用程序继续”的消息。用一个重新提示按钮。

function facebook_login(response) {
    console.log('facebook_login');    //update
    console.log(response);            //update
    if (response.status === 'connected') {
        console.log('connected');
    }
    else {
        var dialog = $('<div>').attr({'class':'login-prompt', 'style':'text-align:center'});
        var dialog_content = 'Please authorize the app to continue.<br/><input type="button" onclick="$(\'.login-prompt\').dialog(\'close\');FB.login(facebook_login, { scope: \'email, publish_actions, user_birthday\' });" value="OK" />'

        dialog.html(dialog_content);
        dialog.appendTo('.contentwrapper');

        //initialize and show dialog
        $('.login-prompt').dialog({ modal: true }).dialog('open');
    }
}

因此用户点击取消后会看到类似下面的内容 Re-prompt dialog http://jan.imghost.us/16ts.jpg

注意:如果在Facebook中打开应用,这种重新提示授权方式也只允许两次