环境:
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();
}
如果/当这个东西得到正式修复时,将保持更新此票证。
答案 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行),但是现在,您可以在此处获取工作模块:
这始终允许用户通过显式设置登录行为来使用浏览器进行授权,而不是通过快速应用切换来使用本机Facebook应用。 This is actually the intent of Facebook's developers.
我无法确定在尝试使用本机应用程序登录时导致它失败的原因 - 它应该尝试下一个选项,即浏览器 - 但这样做,但也不需要TiFacebookButton。< / p>
我希望它可以帮助别人!