gpt4 book ai didi

javascript - 为什么 fbAsyncinit/fb.Event.subscribe 中的其他情况不起作用?

转载 作者:行者123 更新时间:2023-11-30 05:47:25 26 4
gpt4 key购买 nike

我想知道为什么它看起来像是 response.status === 'not authorized' 的“else if”情况 并且“其他”情况(“未知”,即用户未登录 facebook)未被执行。当我登录到我的应用程序时,在 response.stats ===
'connected'
中相应地调用了 testAPI() .但是,当我在 Chrome 中打开隐身模式时,其他情况下的 testAPI() 函数不会被调用。有人知道为什么吗?

window.fbAsyncInit = function() {

FB.init({
appId : 'appnumberhere', // App ID
channelUrl : '//localhost/appname/channel.php', // Channel File
status : true, // check login status
cookie : true, // enable cookies to allow the server to access the session
xfbml : true // parse XFBML
});

FB.Event.subscribe('auth.authResponseChange', function(response) {

if (response.status === 'connected') {
testAPI(); // works
} else if (response.status === 'not_authorized') {
testAPI(); // not called. Nothing in console.
FB.login();
} else {
testAPI(); // not called. Nothing in console.
FB.login();
}
});


}); // end async init function

testAPI 函数:

 function testAPI() {
console.log('Welcome! Fetching your information.... ');
FB.api('/me', function(response) {
console.log('Good to see you, ' + response.name + '.');
});
}

作为旁注,如果我没有登录,我也没有看到弹出 facebook 登录对话框,这是我认为 fb.login() 应该调用的。

额外的旁注

此外,奇怪的是,我需要 <script src="//connect.facebook.net/en_US/all.js"></script> FB SDK 下方包含 <script>(function(d){ var js,....</script>并在我的 channel 文件中让我的应用程序正常工作。否则,某些部分不会加载。不确定这是否相关,但这很奇怪。

最佳答案

作为this question解释说,当用户未登录时,auth.authResponseChangeauth.statuschange 不会触发。当用户加载页面时,用户开始进入“未知状态” “状态;但是一旦使用 status:true 调用 FB.init,Facebook 就会检查登录状态并确定用户未登录 - 这也称为“未知”状态!从技术上讲,没有状态变化,因此不会调用状态变化回调。 (这似乎是一个主要的 API 设计缺陷,特别是因为他们自己的示例代码不起作用。)

一个解决方案,也是该问题的公认答案,是将 FB.init 中的状态检查设置为 false,然后使用 FB.getLoginStatus() 手动检查状态 这样我们就可以自己响应了。如果用户没有登录,则订阅登录事件。如果用户已经登录,那就太好了。

这是我正在使用的代码。 login()logout() 是我定义的函数,它们为登录和未登录状态呈现部分页面。 logout() 显示登录按钮,而 login() 显示用户特定信息。

FB.init({
appId: '...',
channelUrl: window.location.protocol + '//' + window.location.host + '/channel.html',
status: false,
[... other settings ...]
});

FB.getLoginStatus(function(response) {
if (response.status === 'connected') {
login();
} else {
FB.Event.subscribe('auth.login', function(response) {
window.location.reload();
login();
});
logout();
}
});

请注意 window.location.reload(); 在用户最初未登录然后自己登录的情况下。这是为了避免类似的 Blocked 帧。 .. 您遇到的错误,在我的例子中是 http://https:// 不匹配。看看你的情况是否需要它。如果您仍然遇到 Blocked a frame... 错误,这可能是由于您在 Facebook 中配置应用程序设置的方式所致。尝试将 http://localhost:8080/ 作为“使用 Facebook 登录的网站”下的站点 URL,然后访问该站点以查看您的应用。

关于javascript - 为什么 fbAsyncinit/fb.Event.subscribe 中的其他情况不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17254296/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com