代码之家  ›  专栏  ›  技术社区  ›  boarnoah

Ti.Facebook未在安装FB应用程序的情况下打开授权

  •  4
  • boarnoah  · 技术社区  · 10 年前

    编辑:亲爱的未来人,trey jones通过实施 setLoginBehavior ,FBSDKLoginNative似乎在FB端有问题,而不是模块。

    环境:

    MacOS X 10.10.5
    Ti SDK 5.1.1.GA - 5.1.2.GA
    iOS 9.2
    Ti.Facebook 5.0.0 - 5.0.1
    

    我的项目设置(tiapp.xml)很好(它适用于iOS和Android的所有其他情况)。

    我用来调用登录的代码:

    var fb = require('facebook');
    fb.initialize();
    fb.authorize(); 
    

    如果设备上安装了Facebook应用程序,fb。authorize()无法打开。发生这种情况时,我也没有看到任何iOS系统级别的消息。

    其他人有幸使用fb吗。在安装了应用程序的iOS设备上使用新的sdk进行授权。在系统上没有fb应用程序的情况下,它可以正确打开基于浏览器的视图。

    编辑:基于登录可以与AppC的KitchenSink一起使用这一事实,我已经管理了一个解决方案(这并不漂亮)。

    解决方法是在代码中添加一个Ti.FB loginButton,不管它是否不可见,初始化它将修复导致自定义登录的.authorize()无法工作的任何问题。

    //Workaround button:
    if(OS_IOS){
        var fbHaxBtn = fb.createLoginButton({
            readPermissions: ['email'],
            visible: false
        });
    }
    //It needs to be added to the window/doesn't need to be visible though
    $.login_window.add(fbHaxBtn);
    
    //Then in our custom button's code, we can fire as normal:
    function doLoginClick{
        fb.initialize(); //I was having unexpected issues dropping this line on Android, although the docs say its deprecated.
        fb.authorize();
    }
    

    如果/当这件事得到正式修复时,将保持此问题的更新。

    2 回复  |  直到 10 年前
        1
  •  1
  •   trey-jones    10 年前

    这是我对这个问题的第二个答案。我相信,我最初的答案为对话提供了一些价值,这就是为什么我要离开它,但它仍然没有持续解决facebook授权不起作用的问题。

    一致的解决方案是修改Ti.Facebook的官方模块。我将提交此更改的拉取请求(1行),但现在,您可以在此处获取工作模块:

    Source

    Pre-built

    这始终允许用户通过显式设置登录行为来授权使用浏览器,而不是通过快速应用程序切换来使用本地facebook应用程序。 This is actually the intent of Facebook's developers.

    当我尝试使用本机应用程序登录时,我无法确定是什么原因导致它失败-它应该尝试下一个选项,即浏览器-但这是有效的,也不需要TiFacebookButton。

    我希望它能帮助别人!

        2
  •  1
  •   trey-jones    10 年前

    编辑:这个答案不能解决原来的问题。我把它放在这里,以防在使用Ti.Facebook模块时遇到相关困难。看看我的另一个答案,真正解决这个问题。 结束编辑

    我在上面评论过,但在这样做之后遇到了一些更奇怪的行为,结果是我无法可靠地使用给定的解决方法(fbHaxButton)。我想解释一下在我的案例中发生了什么,并展示我自己的解决方法(这也不好看)。我们两个人的根本原因可能是一样的。

    我还没有考虑过Android,所以这个答案是针对iOS的。

    当我开始这个过程时,我得出的结论是,授权是正确地在safari中打开facebook网站以允许授权,但不是在返回时触发登录事件。为了处理这个问题,我已经实现了以下几点:

    facebook = require('facebook');
    
    Ti.App.addEventListener('resumed', function (e) {
        var launchOptions = Ti.App.getArguments();
        if(!launchOptions.url) {
            return console.warn('Ignoring resume event with no url argument.');
        }
    
        // this lib = https://github.com/garycourt/uri-js
        var URI = require('vendor/uri'),
            uriComponents = URI.parse(launchOptions.url),
            expectedScheme = 'fb',
            expectedHost = 'authorize';
    
        // I would like to be more specific about the uri, but we are limited 
        // in Titanium, and this will allow us to pretty certain 
        // that FB is sending us back to our app
        if(uriComponents.scheme.search(expectedScheme) < 0 || uriComponents.host !== expectedHost) {
            return console.warn('Resume event received, but scheme is incorrect.  Ignoring.');
        }
    
        // synthesize login event
        facebook.fireEvent('myapp:login', {
            success: 1,
            token: facebook.getAccessToken(),
            uid: result.id
        });
    });
    
    facebook.addEventListener('myapp:login', function onFacebookAuth(e) {
        facebook.removeEventListener('myapp:login', onFacebookAuth);
        if(!e.success) {
        // do fail action
        }
        // do success action
    });
    
    facebook.initialize(); 
    facebook.authorize();
    

    所以,最初我正在启动并监听一个名为“登录”的事件,根据文档,facebook模块应该会在授权完成后启动该事件。

    在我的例子中,这个事件是在我的应用程序处于后台时,在调用authorize之后,但在用户真正在facebook中单击“OK”之前被触发的。我的监听器会对这个事件做出响应(日志记录等),但似乎发生在一个单独的线程中,或者以某种方式与我的应用程序断开连接,因为它从未将结果传递给UI。我使用的是Q.js(kriw kowal),我相信这就是断开连接的地方。

    不再听“登录”,只需处理我自己的合成事件就解决了我的问题。

    我觉得这很难解释。如果您对此有反馈,以及我如何才能更清楚地了解我认为正在发生的事情,或者如果您认为我得出了错误或不完整的结论,请告诉我-我会尝试更新此答案,使其更好。