2013-07-29 156 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