titanium のfacebooke module のloginイベントの謎挙動

2014/04/08

動作が期待通りでないので、記録

検証環境

環境は、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()しておく。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です