Ti.Facebook没有安装FB应用程序打开授权

时间:2016-02-03 19:33:55

标签: ios facebook titanium titanium-modules

编辑:来自未来的亲人,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();
}

如果/当这个东西得到正式修复时,将保持更新此票证。

2 个答案:

答案 0 :(得分:1)

编辑:这个答案并没有解决原来的问题。我把它留在这里,以防它使用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中的“确定”之前,此事件被触发了。我的监听器将响应此事件(日志记录等),但似乎发生在一个单独的线程中,或者以某种方式与我的应用程序断开连接,因为它从未将其结果传递给UI。我正在使用Q.js(kriw-kowal),我相信这是断开连接的地方。

停止收听'登录',只是处理我自己的综合事件已经解决了我的问题。

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

答案 1 :(得分:1)

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

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

Source

Pre-built

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

我无法确定在尝试使用本机应用程序登录时导致它失败的原因 - 它应该尝试下一个选项,即浏览器 - 但这样做,但也不需要TiFacebookButton。< / p>

我希望它可以帮助别人!