0

私のアプリでFacebookにログインしようとすると、私はいくつかの奇妙な動作が発生しています。iOS Appcelerator Facebookログイン - ログインイベントがデバイスで起動しない

現在のスタック情報:

  1. Appceleratorの6.0.1.GA
  2. AppceleratorのCLI 6.1.0
  3. iOSの10.1
  4. のXcode 8.2.1

奇妙な行動:

  1. loginデバイスのFacebookログインから戻ったときにイベントが発生することはありません。
  2. loginシミュレータのFacebookログインから戻ったときにイベントが発生しないことがあります。
  3. facebook.LOGIN_BEHAVIOR_NATIVEを設定しても、端末でブラウザのログインを使用しようとすると、が時々になります。
  4. 時々、デバイス上では、アプリのスイッチャーはFacebookのログイン用のブラウザを開きます。これは非常に厄介です。

Facebookの立場からその貢献度以降に変更されたようですけれども、私は、実際にモジュールのsetLoginBehavior機能の本来の貢献だ「私たちは、いつもあなたがブラウザを使用したいです。」 "私たちはいつもあなたにネイティブを使うことを願っています"。誰かがある程度の洞察力を持っている場合に備えて、私はこの質問をここに掲載しています。答えを待つ間、私はそのモジュールのソースに戻ります。

私が想像できる唯一の要因は、ほとんどのアプリケーションとは異なる場合があります。これは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; 
}; 

ログイン機能を呼び出す合金コントローラ機能:

// 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); 
    }); 
} 
+0

追加情報:シミュレータでは、コンテンツと設定を消去してからアプリを再構築した後にログインするだけです。その後、アプリケーションを再構築すると、ログインは起動しません。 – threeve

答えて

0

私はチタンモジュールSDKのバグにこれをアップチョークをまいてきたが、具体的にはTi.fireEventです。私の調査はFacebookモジュールで終了しましたが、モジュール内のすべてのイベントは期待どおりに送受信されたようです。 Ti.fireEventが呼び出されたときにのみ、「一部の状況では」JSアプリで受信されませんでした。 facebookモジュール内にはblock retain cycleの可能性が残っていますが、解決できませんでした。

は、ここに私の回避策です:

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も聞いてください。いずれかが最初に起動する場合は、すべてのリスナーをキャンセルし、ログインした状態を確認します。

関連する問題