簡體   English   中英

iOS Appcelerator Facebook登錄-登錄事件未在設備上觸發

[英]iOS Appcelerator Facebook Login - Login Event Doesn't Fire on Device

嘗試在我的應用程序中登錄Facebook時,我遇到一些奇怪的行為。

當前堆棧信息:

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

奇怪的行為:

  1. 從設備上的Facebook登錄返回時, login事件永遠不會觸發。
  2. 從模擬器上的Facebook登錄返回時, login事件有時不會觸發。
  3. 設置facebook.LOGIN_BEHAVIOR_NATIVE 有時仍嘗試在設備上使用瀏覽器登錄。
  4. 有時在設備上,應用程序切換器會打開Facebook應用程序瀏覽器進行登錄。 這真是令人討厭。

我實際上是該模塊的setLoginBehavior功能的原始貢獻者,盡管自“我們一直希望您使用瀏覽器”的貢獻以來,Facebook的立場似乎已經改變。 “我們一直希望您使用本機”。 如果有人有所了解,我將在此處發布此問題-在等待答案的同時,我將返回該模塊的源代碼。

我可以想象的唯一可能與大多數應用程序不同的因素是我使用的是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;
};

調用登錄功能的Alloy控制器功能:

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

我將其Ti.fireEvent於Titanium模塊SDK中的一個錯誤,特別是Ti.fireEvent 我的調查以Facebook模塊結束,但是該模塊中的所有事件似乎都已按預期發送和接收。 僅在Ti.fireEvent時,“在某些情況下”未在JS應用程序中接收到它。 在facebook模塊內仍然存在一個塊保留周期的可能性,但是我無法解決。

這是我的解決方法:

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 以先觸發者為准,取消所有偵聽器,然后檢查登錄狀態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM