2015-11-08 91 views
8

我有一个同时拥有网页和指定移动页面的canvas facebook应用程序。 网页工作正常,并且当模拟浏览器移动与控制台时,一切正常。Facebook画布,无法从移动设备上的Facebook登录

但是,当我尝试从Facebook移动应用程序运行应用程序画布应用程序加载(这是正确的),但它不会登录。

我正在使用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登录,网页的OAuth登录,嵌入式浏览器的OAuth登录,有效的OAuth重定向URI和登录从设备填写正确。

但仍然从facebook移动应用程序的画布应用程序不会执行登录。

我一直试图让这个工作整天。 我无法在任何地方找到解决方案。 我也无法调试手机Facebook应用程序。

任何想法如何解决这个问题?

编辑

又看了看我的节点服务器日志,我看到的FB.login甚至没有叫。

EDIT 2

我结束了与更换其中getLoginStatus不会产生问题对我来说,因为它的一个Facebook画布应用的登录......但问题仍然是如何做到的登录。

编辑3 2015年11月26日

舒服,所以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画布进行更改,如果getLoginStatus不返回连接,则显示一个登录按钮,它将执行登录...其余的保持不变。 我所做的移动类似于接受的答案只适合我的需要...

我希望这可以帮助别人,除了我......

+0

您是否从FB.Login方法获得响应?尝试Chrome远程调试,https://www.youtube.com/watch?v=HEqwnpLYnI0&feature=youtu.be。 –

+0

什么是'getLoginStatus'的反应? – Rayon

+0

我得到了用户ID和的accessToken这正是我需要的。 –

回答

1

确保你调用FB。login()与用户触发的事件(如按钮上的onclick)相关联,因为浏览器可以阻止直接调用的潜在不安全/危险的JavaScript。这是最终用户的额外安全层。有2种方式来创建一个登录按钮:

  1. 生成登录按钮与Facebook的登录按钮生成: https://developers.facebook.com/docs/facebook-login/web/login-button

生成的登录按钮将类似于此:

<fb:login-button scope="public_profile,email" onlogin="checkLoginState();"> 
</fb:login-button> 
  • 创建自己的HTML和使用onclic从Facebook开发网站
    <button onclick="FB.init()">Login</button> 
    
  • 注::K事件来调用FB.init()

    如在参考文档此功能所指出的,它导致 弹出窗口示出登录对话框,因此只应 援引作为用户在点击一个HTML按钮(使得 弹出不被阻挡由浏览器)的结果。

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

    此外,FB.getLoginStatus是登录检查您的用户是否登录到Facebook和您的应用正确的第一步。

    还有,你将需要按照 Facebook登入服务集成到您的Web应用程序,其中大部分在此页面的顶部都包含在快速入门例子 几步之遥。在高级 这些是:

    1. 检查登录状态,看看有人已经登录到您的应用程序。在此步骤中,您也应该检查,看看是否有人 此前已经登录到您的应用程序,但目前尚未登录。
    2. 如果他们没有登录,调用登录对话框,并要求一组数据的权限。
    3. 验证他们的身份。
    4. 存储生成的访问令牌。
    5. 进行API调用。
    6. 注销。

    我发现你的游戏不再需要登录,但也许其他人会发现这个答案有用。 :)

    +0

    我已经解决了我所有的问题......您的答案对于移动设备是正确的FB.login()不会在没有点击的情况下触发,我的解决方案并没有包含用于Web画布的按钮和用于移动画布的按钮。将更新我的问题。会接受这个答案。 –