AS3: 创建Facebook应用

Facebook是当前最流行的社交平台之一。刚刚,使用她们的API,我完成了一个基于flash的游戏,并决定分享我的经验。

        我写的这个例子是比较简单的,但是能解释Facebook API的基础用法。例子看起来是这样的:


 这个flash显示出你的名字、头像;如果点击“Get Friends”,还能获取到你的朋友。本教程的源码在http://krasimirtsonev.com/files/facebookapplication/source.zip
        当开始做这个项目的时候,我试着搜索AS3类库。也找到了一个,Adobe自己的,http://code.google.com/p/facebook-actionscript-api/。一开始看起来不错,用了几个小时后,发现它有点小儿科。我查看了它的部分源码,我用的这个版本,实际上是通过ExternalInterface与Facebook交互的。过去几个月,我经常用Facebook's JavaScript SDK,老实说,很实用。为了不再修复接二连三的bug,果断放弃AS3的库。Facebook's JavaScript SDK的所有向Facebook的请求都由JavaScript完成,数据一准备好就发给flash程序。
        另一个诡异的部分是开放进度。每个Facebook应用都链接到一个特定的网址和域名。比如说正式版的游戏发布在http://gamesite.com。本例中,设置网址为http://gamesite.com,设置域名为gamesite.com。这个应用就可以工作了,但是每次小的改动,都需要把文件上传到http://gamesite.com。这就是为什么最好要有两个版本了,一个正式版(链接到http://gamesite.com),一个开发版(链接到本地)。教程中只创建了第二个。
1.        创建Facebook应用
在新建应用之前,你的账户必须是认证过的。如果没有,你将看到如下信息:
1        Your account must be verified before you can take this action. 
2        Please verify your account by adding your mobile phone or credit card.
我用手机认证的,建议你也这样做。
账户认证以后,访问http://developers.facebook.com,点击顶部的“Apps”。



选择下一屏的“+ Create New App”。



填上你的应用的名字,同意Facebook的条款,点击“Continue”。



 此时唯一的设置就是设置你的网址和域名。也可以通过导航Web->Site URL & Domain来完成这些信息。如下图所见,我的应用的地址是http://localhost/KrasimirTestApplication,域名是localhost。初始化Facebook’s API用的应用ID,也显示在这一页。



2.        JavaScript部分
        我情愿选择面向对象的JavaScript。所以我新建了一个叫FacebookApp.js的类,用来管理所有的东西。这是初始化部分的HTML代码。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
     
        ... meta data here ...
         
        <title>AS3: create Facebook application</title>

        <script type="text/javascript" src="js/SWFObject.js"></script>
        <script type="text/javascript" src="js/json2.js"></script>
        <script type="text/javascript" src="js/FacebookApp.js"></script>
         
    </head>
<body>
    <div id="fb-root"></div>
    <div id="animation"></div>
    <script type="text/javascript">
     
        var F;
         
        window.onload = function() {
            F = new FacebookApp();  
            (function() 
                { 
                var e = document.createElement("script"); e.async = true; 
                e.src = document.location.protocol + "//connect.facebook.net/en_US/all.js?xfbml=1"; 
                document.getElementById("fb-root").appendChild(e); 
                }()
            );
        }   
        window.fbAsyncInit = function() {
            F.init();
            F.getLoginStatus();
        }

    </script>

</body>
</html>
在这页我添加了3个js文件:
a)        SWFObject.js——嵌入flash
b)        Json2.js——Facebook来的数据是JSON格式,需要转换成字符串,这个库就是干这个的。
c)        FacebookApp.js——做管理Facebook工作
        我写JavaScript总是从window.onload事件开始。这样做能保证所需资源都已经完全加载。在这里创建一个FacebookApp的实例,然后加载Facebook的库。到目前为止,对我来说,以上代码是完成这部分工作的最好的做法。All.js加载后,调用window.fbAsyncinit,触发用户的init方法以及FacebookApp类的getLoginStatus。
        类的构造方法:
    var FacebookApp = function() {
    this.appID = "[YOUR APP ID HERE]"; // the application's ID (provided by Facebook)
    this.currentUser = null; // a JSON object that will hold the current user's data
this.token = null; // the access token of the current Facebook session
};

不要忘了用你的实际ID替换[YOUR APP ID HERE]。
调用Facebook API的init方法。

    init:function() {
    log("init appID=" + this.appID);
    FB.init({
        appId : this.appID,
        status: true,
        cookie: true,
        xfbml: true,
        channelUrl: "channel.html"
    });
}
检查是否存在Facebook会话,如果不存在,弹出登录弹框。

    getLoginStatus:function() {
    log("getLoginStatus");
    FB.getLoginStatus(function(response) {
        if (response.session) {
            log("Logged in.");
            F.token = response.session.access_token;
            F.getCurrentUserInfo();
        } else {
            log("Not logged in.");
            FB.login(function(response) {
                if(response.session) {
                    log("Logging successful.");
                    F.token = response.session.access_token;
                    F.getCurrentUserInfo();
                } else {
                    log("Logging failed.");
                }
            });
        }
    });
}

有些浏览器禁止了Facebook的登录弹框。测试的时候确保你的浏览器“安全卫士”已经关闭。
一旦我们拥有了会话,就可以使用Facebook Graph API。getCurrentUserInfo方法获取当前用户数据,像账户ID和名字。

        getCurrentUserInfo:function() {
    log("getCurrentUserInfo");
    FB.api('/me', function(response) {
        if(response) {
            F.currentUser = response;
            F.showFlash(response);
        } else {
            log("getCurrentUserInfo failed");
        }
    });
}
如果一切顺利,我们就具备了足够的信息,以嵌入flash。
        showFlash:function(currentUser) {
    log("showFlash");
    var rand = Math.floor(Math.random()*1000000);
    var swf = new FlashObject("facebook.swf?tmp=" + rand, "animationSwf", "550", "550", "9", "#FFFFFF");
    swf.addVariable("userName", currentUser.name);
    swf.addVariable("userID", currentUser.id);
    swf.write("animation");
}
如你所见,我向flash应用发送了用户名和id。
我又新怎了一个由AS3调用的方法。
        getFriends:function() {
    log("getFriends");
    FB.api('/me/friends', function(response) {
        if(response) {
            F.getFlash().onGetFriends(JSON.stringify(response));
        } else {
            log("getFriends failed");
        }
    });
}
        getFriends用户当前用户的好友列表,转换成字符串,发送到flash应用。

        FacebookApp.js的完整源码可以从这里获取
3.        AS3部分
        文档类的构造方法。
        public function App() {
    debug("App constructor");
     
    _currentUserName = loaderInfo.parameters.userName || "Krasimir Stefanov Tsonev";
    _currentUserID = loaderInfo.parameters.userID || "617578836";
     
    loadCurrentUserAvatar();
    showCurrentUserName();
    addControls(); // adds the button and the text area on the stage
     
    ExternalInterface.addCallback("onGetFriends", onGetFriends);
     
}
为了在flash环境中测试程序,我把我自个儿的Facebook用户名和id设置成默认值。大项目中,从外部的xml文件或脚本中读取数据,作为例子,是个不错的注意。我还添加了onGetFriends回调方法。当JavaScript得到好友列表后,将删除这个方法。

加载头像。
        private function loadCurrentUserAvatar():void {
    var url:String = "http://graph.facebook.com/" + _currentUserID + "/picture";
    _avatar = new Loader();
    _avatar.load(new URLRequest(url));
    _avatar.x = _avatar.y = 20;
    addChild(_avatar);
}
每个用户的头像都可以通过一个这样的简单的请求而得到,http://graph.facebook.com/[USER ID]/picture。
显示当前用户名,并添加控制。
        private function showCurrentUserName():void {
    var tf:TextFormat = new TextFormat();
    tf.font = "Verdana";
    tf.size = 12;
    tf.color = 0x000000;
    _nameField = new TextField();
    _nameField.defaultTextFormat = tf;
    _nameField.text = _currentUserName;
    _nameField.x = 80;
    _nameField.y = 20;
    _nameField.width = 300;
    _nameField.height = 30;
    addChild(_nameField);
}
private function addControls():void {
    _controls = new AppControls();
    _controls.x = 20;
    _controls.y = 83;
    _controls.b1.addEventListener(MouseEvent.CLICK, getFriends);
    addChild(_controls);
}
获取好友列表。
        private function showCurrentUserName():void {
    var tf:TextFormat = new TextFormat();
    tf.font = "Verdana";
    tf.size = 12;
    tf.color = 0x000000;
    _nameField = new TextField();
    _nameField.defaultTextFormat = tf;
    _nameField.text = _currentUserName;
    _nameField.x = 80;
    _nameField.y = 20;
    _nameField.width = 300;
    _nameField.height = 30;
    addChild(_nameField);
}
private function addControls():void {
    _controls = new AppControls();
    _controls.x = 20;
    _controls.y = 83;
    _controls.b1.addEventListener(MouseEvent.CLICK, getFriends);
    addChild(_controls);
}
        当用户点击按钮,触发getFriends方法。当JavaScript部分有返回值了,我们把结果字符串转换成数组。我用的是json.js里类似JSON操作的库。可以在这里得到它。
要文档类的全部代码,可以访问这里

例子代码
-        http://krasimirtsonev.com/files/facebookapplication/source.zip
Facebook JavaScript SDK
-        http://developers.facebook.com/docs/reference/javascript/
Facebook Graph API
-        http://developers.facebook.com/docs/reference/api/


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值