2013-07-29 3 views
0

В первый раз, когда мои пользователи обращаются к приложению, все работает нормально. Пользователь получает всплывающее окно с вопросом для авторизации моего приложения. Но затем, следующая сессия (например, обновление), он получает пустое всплывающее окно, которое закрывается в одно мгновение.Пустые Facebook popup после входа в систему

Я считаю, что Facebook просит ввести токен доступа, но проблема в том, что я не считаю его удобным. Когда всплывающее окно открывается и закрывается так быстро, пользователь думает, что что-то не так, или что он что-то пропустил.

enter image description here Вот код:

window.fbAsyncInit = function() { 
    FB.init({ 

    appId  : '', // App ID 
    channelUrl : '', // Channel File 
    status  : true, // check login status 
    cookie  : true, // enable cookies to allow the server to access the session 
    xfbml  : true // parse XFBML 
    }); 

    // Here we subscribe to the auth.authResponseChange JavaScript event. This event is fired 
    // for any authentication related change, such as login, logout or session refresh. This means that 
    // whenever someone who was previously logged out tries to log in again, the correct case below 
    // will be handled. 

    FB.Event.subscribe('auth.authResponseChange', function(response) { 
    // Here we specify what we do with the response anytime this event occurs. 
    if (response.status === 'connected') { 
     // The response object is returned with a status field that lets the app know the current 
     // login status of the person. In this case, we're handling the situation where they 
     // have logged in to the app. 

     if(accessToken) 
     { 
     //console.log("Connected WITH accesToken"); 
     testAPI(); 

     } 
     else{ 
      // console.log("Connected WITHOUTaccesToken"); 
    FB.login(function(response) { 
      // handle the response 
      uid = response.authResponse.userID; 
    accessToken = response.authResponse.accessToken; 
    //console.log(uid); 
    //console.log(accessToken); 
     }, {scope: 'friends_location, user_location, user_relationships'}); 

    } 


    } else if (response.status === 'not_authorized') { 
     // In this case, the person is logged into Facebook, but not into the app, so we call 
     // FB.login() to prompt them to do so. 
     // In real-life usage, you wouldn't want to immediately prompt someone to login 
     // like this, for two reasons: 
     // (1) JavaScript created popup windows are blocked by most browsers unless they 
     // result from direct interaction from people using the app (such as a mouse click) 
     // (2) it is a bad experience to be continually prompted to login upon page load. 

    //alert("You're logged in on FB but not on the APP"); 
     FB.login(); 

    } else { 
     // In this case, the person is not logged into Facebook, so we call the login() 
     // function to prompt them to do so. Note that at this stage there is no indication 
     // of whether they are logged into the app. If they aren't then they'll see the Login 
     // dialog right after they log in to Facebook. 
     // The same caveats as above apply to the FB.login() call here. 

// FB.login(); 
     //alert("You're offline on FB"); 
      FB.login(); 
    } 
    }); 




    }; 

    // Load the SDK asynchronously 

    (function(d){ 
    var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0]; 
    if (d.getElementById(id)) {return;} 
    js = d.createElement('script'); js.id = id; js.async = true; 
    js.src = "//connect.facebook.net/en_US/all.js"; 
    ref.parentNode.insertBefore(js, ref); 
    }(document)); 


    // Here we run a very simple test of the Graph API after login is successful. 
    // This testAPI() function is only called in those cases. 
    function testAPI() { 

    FB.api('/'+uid+'/friends?fields=name,location,picture&accesstoken='+accessToken, function(response) { 

    } 


     //<img border="0" src="console.log(response.data[0].picture.data.url)"> 
     } 

    }); 

    } 

    //Logout 
    function fbLogout() { 
     //FB.init(); 
     FB.logout(function (response) { 
      //Do what ever you want here when logged out like reloading the page 
      //window.location.reload(); 
     }); 
    } 

Как я могу предотвратить это пустое всплывающее окно?

ответ

0

Вы явно вызываете FB.login, vs FB.getLoginStatus, который является оберткой вокруг диалогового окна входа. Вот почему вы всегда получаете всплывающее окно.

Вместо этого сначала вызовите getLoginStatus, и только если это не удается, вы представляете кнопку, которая вызывает login.

+0

Я не совсем понимаю. Когда он терпит неудачу (нет auth или offline), я делаю FB.login. Я не вижу разницы между запуском с помощью кнопки или прямым вызовом функции. И когда я подключен, мне всегда нужно сделать дополнительный логин с областями, чтобы получить токен доступа. Или вы имеете в виду, что лучше создать 1 большую функцию FB.login и обратиться к ней в FB.Event.subscribe (3x подключен, чтобы получить токен доступа, без авторизации, офлайн)? – Shouse