2013-07-29 93 views
0

我的用户第一次访问应用时,一切正常。用户得到一个弹出式的问题来授权我的应用程序。但是,接下来的会话(例如刷新),他会得到一个空的弹出窗口,立即关闭它。登录后弹出的Facebook会弹出

我相信这是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,而不是FB.getLoginStatus,它是登录对话框的包装。这就是为什么你总是得到弹出窗口。

取而代之,首先调用getLoginStatus,并且只有在失败时,才会显示一个触发login的按钮。

+0

我不完全明白。当它失败(没有身份验证或脱机)我做一个FB.login。我没有看到用按钮触发或直接调用该函数的区别。当我连接时,我总是必须使用示波器进行额外的登录才能获取我的访问令牌。 或者你的意思是创建1个大FB.login函数并在FB.Event.subscribe中引用它(3x连接以获取访问令牌,无验证,脱机)会更好吗? – Shouse