如何从Facebook弹出一个对话框,要求用户“允许”打开图表?

时间:2012-04-06 06:46:42

标签: facebook facebook-graph-api

在我的Facebook应用程序中,我正在申请3个范围:email,publish_stream,publish_action

我正在使用FB.login函数。弹出这两个步骤。

当用户在第一步中单击“取消”时,FB.login将显示“status:unknown”作为响应对象。

但是,当用户在第二步中单击取消时,FB.login将其显示为“status:connected”并将其视为用户接受所有内容。

我最近了解到,您可以使用

检查用户是否允许第二步
FB.api('/me/permissions', function (response) {
    console.log(response);
} );

我的问题是......知道用户拒绝了开放图表步骤,我该如何再次弹出该对话框?

enter image description here enter image description here

1 个答案:

答案 0 :(得分:1)

你是对的,Auth Dialog的第二阶段是可选的,用户不必接受你要求的所有扩展权限,或者其中任何一个,如Permissions中所述。验证对话框文档的部分:

  

用户可以删除任何这些权限,也可以跳过此权限   阶段完全,这会导致拒绝每个扩展权限   你已经要求了。您的应用应该能够处理任何撤销   已安装用户的扩展权限子集。

我认为最好的方法是让您的应用管理用户接受的内容,但如果 HAVE 拥有可选阶段(扩展权限)的权限,那么这就是你可以这样做:

FB.init({
    ....
});

var requiredPermissions = ["email", "publish_stream", "publish_action"];

function checkPermissions(response) {
    var ok = true;

    if (!response.data || response.data.length != 1)
        ok = false;
    else for (var perm in requiredPermissions) {
        if (!(perm in response.data[0])) {
            ok = false;
            break;
        }
    }

    if (!ok)
        login();
    else
        console.log("Hey there user who granted all the required permissions");
}

function loginCallback(response) {
    if (response.authResponse) {
        FB.api("/me/permissions", checkPermissions);
    }
    else {
        console.log("User cancelled login or did not fully authorize.");
    }
}

functoin login() {
    FB.login(loginCallback, { scope: requiredPermissions.join(",") });
}

我还没有测试过这段代码,但它正朝着正确的方向努力。 此外,此代码将一直持续到用户接受所有权限或只是放弃,您应该以某种方式告诉他您需要这些权限并将再次发送给auth对话框。


修改

我一直忘记把这个包含在我的答案中: 调用 FB.login 会打开一个新的弹出窗口,浏览器通常会阻止它,除非它是用户操作的结果,正如文档中所述:

  

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

它也说:

  

如果您需要从已经拥有的用户那里收集更多权限   通过您的应用程序进行身份验证,再次使用。再次调用FB.login   您希望用户授予的权限。在身份验证对话框中   只会向用户询问他们尚未拥有的权限   理所当然的。

这意味着它是一种做你想要的方式,弹出窗口可能没有打开,因为它被浏览器阻止了。 你需要修改我给你的代码,这样每次你调用 login 函数时,都是在用户与你的页面交互之后,即:显示一条消息“应用程序需要这个和那个权限,请单击此按钮继续“然后将调用登录功能。