動作が期待通りでないので、記録
検証環境
環境は、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 <app dir>/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()しておく。