Facebook的AS3 - 为什么我的登录回调没有被调用?
我们正在开发一个与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
}
干杯, 马克。
这是有点脏,但我之前调用超时登录工作得很好:
的setTimeout(Facebook.login,200,onLogin,{烫发:Config.FB_PERMISSIONS});
这是一种使用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>
太好了。这对我有用,解决方案很好地放在一个单独的类。感谢分享! – 2011-07-24 16:45:30
很高兴我可以帮助:) – 2011-07-24 19:02:30
简短的回答
只要保持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登录弹出窗口 - 所以你会有稳定的弹出窗口。
这个工作对我来说,无论是如果或者没有登录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 :(
}
}
_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页面上没有很好的记录。
在html文件中使用的标记中添加https for all.js
接受的答案是什么? – 2012-10-05 20:54:03
是的这就是我们最终做的 - 或者类似的。我实际上不得不打电话给Facebook.login两次才能使它起作用 - 我想象超时也会起作用。 – koosa 2011-07-22 20:25:14
谢谢你。 – Mattias 2012-02-24 11:04:21