titanium のfacebooke module のloginイベントの謎挙動
動作が期待通りでないので、記録
検証環境
環境は、Ti SDK 3.2.2 でiOS7シミュレータ
試した、サンプルコードは以下。classicのsingle window applicationのFirstView.jsにfacebookのmodule追加しただけのコード
//FirstView Component Constructor
function FirstView() {
//create object instance, a parasitic subclass of Observable
var self = Ti.UI.createView();
//label using localization-ready strings from /i18n/en/strings.xml
var label = Ti.UI.createLabel({
color:'#000000',
text:String.format(L('welcome'),'Titanium'),
height:'auto',
width:'auto'
});
self.add(label);
//Add behavior for UI
label.addEventListener('click', function(e) {
alert(e.source.text);
fb.authorize();
});
var fb = require('facebook');
fb.appid = {FACEBOOK_APP_ID};
var loginFacebook = function(e){
alert('loginFacebook');
}
fb.addEventListener("login",loginFacebook);
return self;
}
module.exports = FirstView;
labelをクリックしたら、fb.authorize()が走って認証。1回目の動作は期待通りだが、問題は認証後の挙動
何故か発火するloginイベント
認証後、アプリを再びビルドすると、アプリが起動した直後に表示されるloginFacebookアラート。何故か以下の
var loginFacebook = function(e){
alert('loginFacebook');
}
fb.addEventListener("login",loginFacebook);
loginイベントが発火してる模様。labelをクリックしてないのに。アプリが起動しただけで発火。謎。試しに一度、logout()してみる.
label.addEventListener('click', function(e) {
alert(e.source.text);
// fb.authorize();
fb.logout();
});
labelをクリックして一旦logout処理を走らせる。その後再度ビルドすると、今度は、期待通りloginイベントは発火しない。
分かったこと
facebook module は、どうも認証するとモジュール内部で認証状態を保持。
認証状態が保持された状態で、addEventListener(‘login’,function(){}); を呼ぶと、loginイベント発火しちゃう。
取り急ぎの対策
loginイベントが発火しないよう、用が済んだらとりあえずlogout()しておく。