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 и браузер для входа. Это довольно досадно.

Я на самом деле оригинальный вклад в setLoginBehavior функциональности модуля, хотя позиция Facebook, кажется, изменилось с того вклада «Мы всегда хотим, чтобы использовать браузер.» «Мы всегда хотим, чтобы вы использовали Native». Я размещаю этот вопрос здесь, если у кого-то есть понимание - пока я жду ответа, я вернусь к источнику для этого модуля.

Единственный фактор, который я могу себе представить, может отличаться от большинства приложений, так это то, что я использую 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

Я записала это до ошибки в модуле Titanium 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. Какой бы ни был пожар первым, отмените все прослушиватели и проверьте статус входа в систему.

 Смежные вопросы

  • Нет связанных вопросов^_^