Ti.Facebook 未打开已安装 FB 应用程序的授权

Ti.Facebook doesn't open authorize with FB app installed

编辑:来自未来的亲爱的人们,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 系统级消息。

有没有其他人在 iOS 台安装了应用程序的设备上使用 fb.authorize 和新的 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();
}

将保持此票证更新if/when这件事得到正式修复。

编辑:这个答案没有解决原来的问题。我把它留在这里,以防它有助于解决使用 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();

所以,最初我正在触发并监听一个名为 'login' 的事件,据说 facebook 模块(根据文档)将在授权完成后触发。

在我的例子中,这个事件是在我的应用程序在后台时触发的,在调用授权之后,但在用户实际点击 facebook 中的 'OK' 之前。我的监听器会响应此事件(日志记录等),但似乎发生在一个单独的线程中,或者以其他方式与我的应用程序断开连接,因为它从未将其结果传递给 UI。我正在使用 Q.js (kriw-kowal),我相信这是断开连接的地方。

停止收听 'login',只需处理我自己的合成事件就解决了我的问题。

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

这是我对这个问题的第二个回答。我相信我原来的回答对谈话有一定的价值,这就是我离开它的原因,但它仍然没有始终如一地解决 facebook 授权不起作用的问题。

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

Source

Pre-built

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

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

希望对其他人有所帮助!