Facebook画布,在移动设备上无法通过Facebook登录

5
我有一个Canvas Facebook应用程序,它既有网页版又有专门的移动版页面。网页版可以正常运行,在控制台中模拟移动浏览器也没有问题。
但是,当我尝试从Facebook移动应用程序运行应用时,Canvas应用程序会加载(这是正确的),但不会登录。
我正在使用FB.login函数。
login: function () {
        var deferred = $q.defer();
        FB.login(function (response) {
            if (!response || response.error) {
                deferred.reject('Error occured');
            } else {
                deferred.resolve(response);
            }
        }, {
            scope: 'email, user_friends'
        });
        return deferred.promise;
    },

在设置中 > 高级选项中,我已经填好了:客户端OAuth登录、Web OAuth登录、嵌入式浏览器OAuth登录、有效的OAuth重定向URI和设备登录。

但是,即使如此,在Facebook移动应用程序中,画布应用程序仍然无法执行登录。

我一直在努力让它工作,但整天都找不到解决方案。我也无法调试Facebook移动应用程序。

有什么想法来解决这个问题吗?

编辑

还查看了我的Node服务器日志,发现FB.login甚至没有被调用。

编辑2

最终,我用getLoginStatus替换了登录,对于我来说这没有问题,因为它是一个Facebook画布应用程序......但问题仍然是如何进行登录。

编辑3 11/26/2015

那么,getLoginStatus并没有完全解决我的问题,因为它实际上并没有将用户登录,所以对于画布游戏,如果您需要权限,您可能需要在第一次进入时登录......我的解决方案是,如果getLoginStatus返回not_autorized,则添加登录,如下所示:

        /**
     * [getLoginStatus get the FB login status]
     * @return {[type]} [description]
     */
    getLoginStatus: function () {
        var deferred = $q.defer();
        FB.getLoginStatus(function (response) {
            if (response.status === 'connected') {
                deferred.resolve(response);
            } else if (response.status === 'not_authorized') {
                _fbFactory.login().then(function (fbLoginResponse) {
                    deferred.resolve(fbLoginResponse);
                });
            } else {
                deferred.reject('Error occured');
            }
        });
        return deferred.promise;
    },

但是,请等一下……在移动画布游戏上,FB.login函数的效果不佳(不确定是不触发还是浏览器阻止弹出窗口或两者都有)。无论如何,你需要通过按钮积极调用它……因此对于移动画布游戏,我必须添加一个开始游戏的按钮,然后登录才能正常工作。

编辑4(最终版)

最终我注意到,除非是外部事件触发,否则FB.login()不会被触发,因此我对Mobile canvas进行了更改,如果getLoginStatus没有返回连接,则显示一个登录按钮,该按钮进行登录……其余保持不变。 我为移动设备所做的与已接受的答案类似,只是适合我的需求……

我希望这可以帮助除我之外的其他人……


你从FB.Login方法中得到了响应吗?试试Chrome远程调试,https://www.youtube.com/watch?v=HEqwnpLYnI0&feature=youtu.be。 - Shuto Mbofana
getLoginStatus 的响应是什么? - Rayon
我已经获得了用户ID和访问令牌,这正是我所需要的。 - Jony-Y
@Jony-Y - 你解决了你的问题吗? - The1Fitz
@The1Fitz 我最终使用了getLoginStatus...所以我解决了我的问题,但是我仍然无法解决登录问题,尽管现在没有必要了。 - Jony-Y
1个回答

1
请确保您使用用户触发的事件(例如按钮上的onclick)调用FB.login(),因为浏览器可能会阻止直接调用的潜在不安全/危险javascript。这对终端用户来说是额外的安全层。有两种方法可以创建登录按钮:
  1. 使用Facebook的登录按钮生成器生成登录按钮:https://developers.facebook.com/docs/facebook-login/web/login-button
生成的登录按钮将类似于此图像:
<fb:login-button scope="public_profile,email" onlogin="checkLoginState();">
</fb:login-button>
  1. Create your own html and use an onclick event to call FB.init():
    <button onclick="FB.init()">Login</button>
    

来自Facebook开发者网站的笔记:

如此函数的参考文档中所述,它会导致弹出窗口显示登录对话框,因此应仅在某人点击HTML按钮后调用(以便弹出窗口不被浏览器阻止)。

https://developers.facebook.com/docs/facebook-login/web

此外,FB.getLoginStatus是登录的正确第一步,用于检查用户是否已经登录到Facebook和您的应用程序中。
引用: 有几个步骤需要遵循才能将Facebook登录集成到您的Web应用程序中,其中大部分包含在本页面顶部的快速入门示例中。在高层次上,这些步骤包括:
1. 检查登录状态以查看某人是否已经登录到您的应用程序。在此步骤中,您还应检查某人是否曾经登录过您的应用程序,但目前未登录。 2. 如果他们没有登录,请调用登录对话框并请求一组数据权限。 3. 验证他们的身份。 4. 存储生成的访问令牌。 5. 进行API调用。 6. 登出。
我看到您的游戏不再需要登录,但其他人可能会发现这个答案有用。 :)

我已经解决了所有问题......你的答案对于移动设备是正确的,因为在没有点击的情况下FB.login()不会被触发,我的解决方案在Web画布中没有按钮,在移动画布中有一个按钮。我会更新我的问题,并接受这个答案。 - Jony-Y

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接