我们正在开发一个与Facebook大量集成的Flash网站。
我们注意到一个错误,如果用户没有登录Facebook,我们尝试通过Adobe提供的AS3类中的Facebook.login登录,则会调用回调,但参数结果为:Object和失败:对象是空的。如果我们的用户然后尝试再次登录,那么一切正常,返回结果中的用户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
}
干杯, 标记
答案 0 :(得分: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>
答案 1 :(得分:2)
这有点脏,但对我来说,在调用登录之前暂停工作正常:
setTimeout(Facebook.login,200,onLogin,{perms:Config.FB_PERMISSIONS});
答案 2 :(得分:2)
_extendedPermissions = { perms :“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页面上没有详细记录。
答案 3 :(得分: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登录弹出窗口 - 所以你将有稳定的弹出窗口流。
答案 4 :(得分:0)
这对我有用,要么我还没有登录,要么我已经:
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 :(
}
}
答案 5 :(得分:0)
为你在html文件中使用的标签中的all.js添加https