2011-05-03 91 views
2

我們正在開發一個與Facebook大量集成的Flash網站。Facebook的AS3 - 爲什麼我的登錄回調沒有被調用?

我們已經注意到一個錯誤,如果用戶沒有登錄到Facebook,並且我們嘗試通過Facebook提供的AS3類中的Facebook.login登錄它們,則調用回調,但參數結果爲:對象和失敗:對象都是空的。如果我們的用戶然後再次嘗試登錄,則一切正常,返回結果中的用戶ID:如果成功則返回對象。

這是Facebook本身的錯誤嗎?有沒有人見過這個?我們確信這一週前沒有發生。

Facebook.login(onLogin, {perms:Config.FB_PERMISSIONS}); 

private function onLogin(result:Object, fail:Object):void { 

    // first time this is called after the popup closes returns 
    // result == null and fail == null 
    // second time around, results are as expected 
} 

乾杯, 馬克。

回答

2

這是有點髒,但我之前調用超時登錄工作得很好:

的setTimeout(Facebook.login,200,onLogin,{燙髮:Config.FB_PERMISSIONS});

+0

是的這就是我們最終做的 - 或者類似的。我實際上不得不打電話給Facebook.login兩次才能使它起作用 - 我想象超時也會起作用。 – koosa 2011-07-22 20:25:14

+0

謝謝你。 – Mattias 2012-02-24 11:04:21

4

這是一種使用Graph API連接到Facebook的方式。一切都在評論中解釋。這實際上是連接到Facebook,不會張貼到牆壁或任何東西。該部分可以在本課下面找到。

package com.DAL 
{ 
    import com.facebook.graph.Facebook; 
    import flash.events.Event; 
    import com.facebook.graph.data.FacebookSession; 
    import flash.events.EventDispatcher; 
    import flash.events.MouseEvent; 
    import com.fbLoginButton; 
    import com.adobe.serialization.json.JSON; 

    public class FBConnect extends EventDispatcher 
    { 
     /****************************************** 
     * Variables 
     ******************************************/ 
     private var _applicationID:String; 
     private var _extendedPermissions:Object; 

     /****************************************** 
     * Constants 
     ******************************************/ 
     public static const CONNECTED:String = "CONNECTED"; 

     /****************************************** 
     * Properties 
     ******************************************/    
     public function get applicationID():String 
     { 
      return _applicationID; 
     } 

     /****************************************** 
     * Constructor 
     ******************************************/ 
     public function FBConnect() 
     { 
      super(); 

      //Set applicationid 
      _applicationID = "YOUR_ID"; 

      //Set permissions to ask for 
      _extendedPermissions = {perms:"read_stream, publish_stream, user_about_me, read_friendlists, user_photos"}; 

      //Initialize facebook 
      Facebook.init(_applicationID); 
     } 

     /****************************************** 
     * Methods 
     ******************************************/  
     public function login(e:MouseEvent):void 
     {   
      Facebook.login(handleLogin, _extendedPermissions); 
     } 

     private function handleLogin(response:Object, fail:Object):void 
     { 
      dispatchEvent(new Event(CONNECTED)); 
     } 
    } 
} 

這應該照顧連接到Facebook。如果你想發佈到牆壁或任何東西,你可以在下面找到一個小例子。

 /****************************************** 
     * Constructor 
     ******************************************/ 
     public function FBLogic() 
     { 
      super(); 

      _connect = new FBConnect(); 
      _connect.addEventListener(FBConnect.CONNECTED, startLoaders); 

      initLoaders(); 
     } 

     /****************************************** 
     * Methods 
     ******************************************/ 

     ... 

     public function post(message:String):void 
     { 
      var _params:Object = new Object(); 

      _params.access_token = Facebook.getSession().accessToken; 
      _params.message = message; 

      Facebook.api("/" + _userID + "/feed", messagePosted, _params, "POST"); 
     } 

     public function messagePosted(response:Object, fail:Object):void 
     { 
      dispatchEvent(new Event(MESSAGEPOSTED)); 
     } 

     public function login(e:MouseEvent):void 
     { 
      var _loginButton:fbLoginButton = e.target as fbLoginButton; 
      _loginButton.alpha = 0; 
      _loginButton.visible = false; 

      _connect.login(e); 
     } 

如果這沒有辦法,你可能已經忘記添加一些代碼到你的html文件。一定要將下面的代碼添加到您的html文件的頭部:

<script type="text/javascript" src="http://connect.facebook.net/en_US/all.js"></script> 

而且您還需要一個名爲fb-root的div,聲明如下。

<body> 
    <div id="fb-root"></div> 
    <div id="flashContent"> 
    </div> 
</body> 
+0

太好了。這對我有用,解決方案很好地放在一個單獨的類。感謝分享! – 2011-07-24 16:45:30

+0

很高興我可以幫助:) – 2011-07-24 19:02:30

0

簡短的回答

只要保持Facebook.init()每0.5秒循環,直到它找到一個有效的憑證的cookie。

LONG ANSWER

該文檔描述Facebook.init(),爲設置功能。但它不止於此,它尋找有效的fb登錄cookie。和Facebook.login()一樣。

這個想法是在啓動時調用Facebook.init(),並查看用戶是否已經有權訪問。否則使用Facebook.login()來使用戶登錄。

不是可執行代碼:

/** 
    * Start the app, and see if there are any valid credentials 
    **/ 
    public function startApp() { 
     Facebook.init(fbAppid, handleFbLogin); 
    } 

    /** 
    * This is a method to call the app didnt login successfully 
    * at startup. 
    **/ 
    private function tryLogin() { 
     Facebook.login(handleFbLogin, {});  
    } 

    private var lastLoginSuccess:Object; //being a bit pedantic maybe 

    /** 
    * This is the callback that is <i>supposed</i> to run 
    * ones the user has logged in. 
    * Unfortunately the callback assoc. with the login/init 
    * goes off almost instantly; and so often fails before 
    * valid credentials have been creations >:(
    **/ 
    public function handleFbLogin(success:Object, fail:Object) { 
     lastLoginSuccess = success; 
     if(success){    
        //yay! 
     } else { 
        //taps foot impatiently... 
       flash.utils.setTimeout(tryFbInitIfLastFailed, 500); 
     } 
    } 

    /** 
    * And also the user could be taking their sweet time 
    * typing in their password. 
    * Oh and giving their device informative names like 'qwe' 
    * 
    * So when they finally login, and the regularly executing 
    * handleFbLogin() will finally find some valid credentials 
    **/ 
    private function tryFbInitIfLastFailed() {    
     if (lastLoginSuccess == null)  
      Facebook.init(view.fbApp.id, handleFbLogin);  
    } 

任何爲什麼不保持通話Facebook.login()?因爲打開Facebook登錄彈出窗口 - 所以你會有穩定的彈出窗口。

0

這個工作對我來說,無論是如果或者沒有登錄IM即時通訊已經:

 private function init(e:Event = null):void 
     { 
      removeEventListener(Event.ADDED_TO_STAGE, init); 
      Facebook.init("APPID", onInit); 
     } 

     private function onInit(response:Object, fail:Object):void 
     { 
      if(response) 
      { 
       handleLoginResponse(true, null);      
      } 
      else 
      { 
       Facebook.login(handleLoginResponse, { scope: "email, user_photos, publish_stream" }); 
      } 
     } 

     private function handleLoginResponse(result:Object, fail:Object):void 
     { 
       if (result != null) { 
        // Logged in 
       } else { 
        // Goodbye :(
       }    
     } 
2

_extendedPermissions = {燙髮: 「read_stream,publish_stream,user_about_me,read_friendlists,user_photos」}; 塊引用

「燙髮」 現在是 「範圍」

{範圍: 「read_stream,publish_stream,user_about_me,read_friendlists,user_photos」};

這在Adobe Facebook API頁面上沒有很好的記錄。

0

在html文件中使用的標記中添加https for all.js

+1

接受的答案是什麼? – 2012-10-05 20:54:03

相關問題