[英]iOS Appcelerator Facebook Login - Login Event Doesn't Fire on Device
嘗試在我的應用程序中登錄Facebook時,我遇到一些奇怪的行為。
當前堆棧信息:
奇怪的行為:
login
事件永遠不會觸發。 login
事件有時不會觸發。 我實際上是該模塊的setLoginBehavior
功能的原始貢獻者,盡管自“我們一直希望您使用瀏覽器”的貢獻以來,Facebook的立場似乎已經改變。 “我們一直希望您使用本機”。 如果有人有所了解,我將在此處發布此問題-在等待答案的同時,我將返回該模塊的源代碼。
我可以想象的唯一可能與大多數應用程序不同的因素是我使用的是Kris Kowals Q。 下面是代碼,幾乎完全來自我的應用程序。
進行登錄的實際功能:
// linkingmodule.js
exports.linkFacebook = function() {
var Q = require('vendor/q'),
response = Q.defer(),
facebook = require('facebook'),
permissions = ['public_profile', 'user_friends', 'user_likes'];
facebook.initialize();
facebook.setLoginBehavior(facebook.LOGIN_BEHAVIOR_NATIVE);
facebook.permissions = permissions;
facebook.addEventListener('login', function fireLogin(e) {
if(!e.success || !facebook.loggedIn) {
return response.reject({
status: e.code,
error: e.error
});
}
response.resolve({
uid: e.uid,
data: e.data,
token: facebook.getAccessToken()
});
});
facebook.authorize();
return response.promise;
};
調用登錄功能的Alloy控制器功能:
// login.js
function facebookLogin() {
var remote = require('linkingmodule');
remote.linkFacebook().
then(function(r) {
// do some things
}).
fail(function(e) {
console.error(e);
throw 'Unable to login with Facebook.';
});
}).
fail(function(e) {
console.error('Facebook login failed');
console.error(e);
});
}
我將其Ti.fireEvent
於Titanium模塊SDK中的一個錯誤,特別是Ti.fireEvent
。 我的調查以Facebook模塊結束,但是該模塊中的所有事件似乎都已按預期發送和接收。 僅在Ti.fireEvent
時,“在某些情況下”未在JS應用程序中接收到它。 在facebook模塊內仍然存在一個塊保留周期的可能性,但是我無法解決。
這是我的解決方法:
function facebookLogin() {
var Q = require('vendor/q'),
response = Q.defer(),
fb = require('facebook'),
permissions = ['public_profile', 'user_friends', 'user_likes'];
var checkLoginStatus, fireLogin;
checkLoginStatus = function(e) {
Ti.App.removeEventListener('resumed', checkLoginStatus);
fb.removeEventListener('login', fireLogin);
// login often doesn't fire, so let's check on resumed as well
if(fb.loggedIn) {
return response.resolve({
uid: fb.uid,
data: null,
token: fb.getAccessToken()
});
}
console.log('resumed and found that are NOT logged in');
return response.reject({
status: -1,
error: 'Did not work.'
});
};
fireLogin = function(e) {
fb.removeEventListener('login', fireLogin);
Ti.App.removeEventListener('resumed', checkLoginStatus);
if(!e.success || !fb.loggedIn) {
return response.reject({
status: e.code,
error: e.error
});
}
response.resolve({
uid: e.uid,
data: e.data,
token:fb.getAccessToken()
});
};
Ti.App.addEventListener('resumed', checkLoginStatus);
fb.addEventListener('login', fireLogin);
fb.initialize();
fb.setLoginBehavior(fb.LOGIN_BEHAVIOR_NATIVE);
fb.permissions = permissions;
fb.authorize();
return response.promise;
}
因此,基本上,繼續監聽login
事件-在“某些情況下”它會正確觸發。 而且還要聽App.resumed
。 以先觸發者為准,取消所有偵聽器,然后檢查登錄狀態。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.