Saturday, October 31, 2009

c( ̄ܫ ̄)a 之Facebook開發手札 – Open Stream API操作筆記

個人覺得Facebook Platform稍微有點困難的地方在於起步的時候, 因為要先理解整個App平台的架構包含一些名詞與App的各種驗證機制, 一但跨過了這些階段之後, API的操作其實就相當的直覺了, 畢竟我認定API的定義就是應該我代參數給你, 你就乖乖的回我該有的資料(Facebook API回傳資料是JSON), API有問題就發信去轟炸Facebook的龐大工程師群們.
Open Stream API是Facebook近期釋放出的API, 主要功能就是讓應用程式開發者可以在任何地方包含第三方網站, 行動裝置, 桌面環境去讀取已登入使用者Wall上的訊息流(Stream)去進行混搭的應用.


Friday, October 30, 2009

c( ̄ܫ ̄)a 之Facebook開發手札 – Facebook Javascript Client Libraries的初始化


在使用Facebook所提供的前端Javascript Libraries之前, 必須先載入








千萬記得不要寫在<head></head>之間, 要寫在<body>之內. 當完成了FeatureLoader.js.php的載入之後, 其實只有最小化的Facebook API被載入, 也就是說, 目前為止, 開發者只能使用FB.Bootstrap(經過測試, FB等同於FB.Bootstrap)命名空間下的方法而已.



接下來就是要利用載入FB.Bootstrap去繼續進行接下來的初始化步驟, 那就是指定API Key與"跨網域存取頻道"的相對路徑, 如下行程式所示, 如果有搭配jQuery的話, 可以將他寫在



$.ready(function(){


    FB.Bootstrap.init('{API Key}','/xd_receiver.htm');

});


FB.Bootstrap.init會動態載入下列的內容到<head></head> Tag裡面


<script type="text/javascript" src="http://static.ak.connect.facebook.com/connect.php/en_US/js/Api/CanvasUtil/Connect/XFBML"></script>

<link rel="stylesheet" type="text/css" href="http://static.ak.connect.facebook.com/connect.php/en_US/css/connect-button-css/share-button-css/FB.Connect-css/connect-css">

根據文件說明, XFBML (dependencies" => "CanvasUtil", "Api", "Connect")  XFBML相依於上述三個javascript函式庫, 而該三個函式庫又相依於其他的函式庫. 簡言之, 透過FB.Bootstrap.init會將所有的Javascript客戶端函式庫都進行載入, 用Firebug觀察發現大小為59KB

未命名-1



文件中還提到如果效能是第一考量的話, 可以嘗試改用FB.Bootstrap.requireFeatures去動態載入必要的Javascript, 像是XdComm, Connect, Common, CanvasUtil, Base, Base, Api等等.


FB.Bootstrap.requireFeatures(["Connect"], function() {
    FB.Facebook.init("{API Key}","{跨網域通道檔的URL}");   


API Call Here … 


});


雖然我發現儘管採用這樣個別載入的方式, FB.Bootstrap仍然會將所有的Javascript進行載入, 因為用Firebux觀察載入的Javascript仍然為59KB


另外要注意的是, FB.Bootstrap.requireFeatures可以執行任意多次, 當被指定載入的Javascript已經於前方的程式進行載入過的話, FB.Bootstrap.requireFeatures會立即執行Callback函數的內容, 而不會發生重複載入的問題.


除此之外, 仔細看了一下<body>的內容, 我們還可以發現多了以下被動態載入的內容, 姑且先跳過這些詭異的東西, 我先講完整個初始化過程在回頭來剖析這一個部分


<div id="FB_HiddenContainer" style="position: absolute; top: -10000px; width: 0px; height: 0px;"> <div>
<iframe class="FB_SERVER_IFRAME" scrolling="no" frameborder="0" src="http://api.connect.facebook.com/static/v0.4/client_restserver.php?r=163033" name="fb_api_server"></iframe>
</div>
<div>
<iframe class="FB_SERVER_IFRAME" scrolling="no" frameborder="0" src="http://www.facebook.com/extern/login_status.php?api_key=75b90556f1c53bb965bf83a9cf4acfac&extern=2&channel=http%3A%2F%2Fwww.6yeah.com%2Fxd_receiver.htm&locale=en_US" name="loginStatus"></iframe> 

</div>
</div>



特別要注意的是, FB.Bootstrap.init是採用非同步的方式去載入外部javascript, 所以為了確保在程式完全載入客戶端瀏覽器之後才允許程式進行後續的Facebook API操作, 開發者必須將API Call的程式放在FB.Bootstrap.ensureInit之內, 透過將API呼叫放置在Callback function內的方式, 可以確保發出Facebook API操作的請求之前就已經完成必要Javascript的載入.


FB.Bootstrap.ensureInit(function(){

        My_FB.friends_getLists();


    });

Thursday, October 29, 2009

c( ̄ܫ ̄)a 之Facebook開發手札 – 由Facebook新推出的Platform Live Status來解析Facebook的bug追蹤系統(一)

Facebook Developers - Platform Live Status_1256869650758

Platform Live Status, 一個主要是提供給App開發者的工具, 聚合了目前Facebook Platform上諸多重要資訊包括

Facebook平台狀態

Facebook Developers - Platform Live Status_1256869719360

最近發生的問題

Facebook Developers - Platform Live Status_1256869841362

Facebook API的平均回應時間表

Facebook Developers - Platform Live Status_1256869935287

錯誤記數

Facebook Developers - Platform Live Status_1256870094930

Top Live Platform Bugs, 簡言之, 就是Bug list就對了

Facebook Developers - Platform Live Status_1256870240376

Deceloper Updates, 這裡會羅列出跟應用程式開發相關的各項消息, 包含即將釋出的新API, 即將Deprecating的功能或API, 經過強化(Refactoring)或修正(Modified)的API功能…etc

Facebook Developers - Platform Live Status_1256870264110

因為整個頁面上看起來相當直覺, 所以也就不多說了, 就直接進到我想談的主題上吧, 那就是Facebook的Bug Trace System

於Top Live Platform Bugs區塊中點擊任意一條Bug之後會連結到如下的頁面

Facebook Platform .-. Bug 7148 – friend selector is not a constructor_1256874396385

點選log in連結會進入到一個登入頁. 在這個頁面裡要求你輸入的並不是你在Facebook的帳號, 而是需要另外註冊, 而且在這裡可以看到Facebook的Bug追蹤系統是採用Bugzilla建構起來的

Facebook Platform .-. Log in to Bugzilla_1256874966057

點選create a new account

Facebook Platform .-. Create a new Bugzilla account_1256876344100

輸入合法的email, 因為要進行驗證

Gmail - Bugzilla- confirm account creation - gnihtonsielbissopmi@gmail.com_1256876458078

點選信件中進行驗證的連結

Facebook Platform .-. Create a new user account for 'gnihtonsielbissopmi@g'_1256876789648 

按照指示輸入名字與密碼, 一切順利的話應該會看到如下圖所示的頁面

Facebook Platform .-. User gnihtonsielbissopmi@gmail.com created_1256876927275

點選Log In進入Bug追蹤系統的登入頁面

Facebook Platform .-. Bugzilla .-. Main Page_1256877087797

登入成功之後, 就可以進入Facebook Bug追蹤系統的首頁, 如下圖所示

Facebook Platform .-. Bugzilla .-. Main Page_1256877196118

哈, 不過因為目前沒有關於Facebook App開發上的Bug要進行回報(我個人相信應該很快我就有東西要

回報了c( ̄ܫ ̄)a   ), 所以待下一篇在進行回報流程的介紹.

Facebook App開發手札 - Facebook JavaScript Client Library的驗證模式

範例網站

步驟一

首先請先確認你於Facebook是處於登出狀態, 接下來當你連結到範例網站之後, Facebook JavaScript Client Libraries中的FB.Facebook.apiClient.requireLogin方法會檢查目前的URL中是否有session這一個參數, 假如沒有的話, 你就會被強制的重導向到Facebook的登入頁, 並在URL後方附加上許多相關的GET變數, 包含你的API Key以及Callback URL等等資訊.

Login - Facebook_1256818047312

http://www.facebook.com/login.php?api_key={應用程式的API Key}&extern=0&fbconnect=1&next={應用程式的Callback URL}&return_session=1&v=1.0&locale=en_US

步驟二

如果return_session設定為1, 當登入成功之後, 頁面會重導向回Callback Page URL, 而瀏覽器路徑會顯示如下, 在Callback URL後會附上許多GET參數

http://www.6yeah.com/fb_apps/js_demo/?session={%22session_key%22%3A%223.drvv_pxbWgtdgo1dqmbL9g__.86400.1256907600-638368594%22%2C%22uid%22%3A%22638368594%22%2C%22expires%22%3A1256907600%2C%22secret%22%3A%22BnOyOpZJ8E9VWhhJUKUn9Q__%22%2C%22sig%22%3A%225a1856eac374f80cd115f41b8c5db5b8%22}

如果於登入頁中我們手動的將return_session設為0, 當登入成功之後, 頁面同樣的會重導向回Callback Page URL, 但是瀏覽器路徑列中多了一個auth_token的參數

http://www.6yeah.com/fb_apps/js_demo/?auth_token=99ee9fadf7d2dd3db9bebc3ad0474efb&session={%22session_key%22%3A%223.Ih1w4GGicah2W4ADW9Ah0g__.86400.1256907600-638368594%22%2C%22uid%22%3A638368594%2C%22expires%22%3A1256907600%2C%22secret%22%3A%2270uwUoq3CT7G2p1vTvrQGQ__%22%2C%22sig%22%3A%22af59a57df3d2f67b0d4107a6408ffdee%22}

此時依舊會執行到FB.Facebook.apiClient.requireLogin並發現URL(document.URL)中有一個session參數

步驟三

回傳的session資訊會被寫入Cookie之中, 也就是說就算把Callback URL後面的參數都刪除掉再重新連線一次(ex:http://www.6yeah.com/fb_apps/js_demo/)你依舊會被FB.Facebook.apiClient.requireLogin判定為已登入的狀態.

小結

  • 在Iframe App的模式下, 使用者身分驗證完成後進行重導向的URL是透過埋在前端頁面Javascript裡的API Key去Facebook的資料庫中去擷取出來的, 也就是說目前開發者並無法於前端指定重導向反回的URL. 然而在使用Facebook Connect的模式下, Callback URL會被設定成當前的頁面.
  • 一個session只適用於某特定的使用者與應用程式的配對而且只能被用來擷取,操作與更新符合該配對的使用者資料

 





 

Wednesday, October 28, 2009

Facebook App開發手札 - 使用Facebook JavaScript Client Library取得朋友的頭圖列表


  • What

    Facebook Javascript Client Library是一組可以依功能需求而進行動態載入的Javascript函式庫, 開發者透過這些函 式庫來與Facebook API進行互動(ex:進行Facebook API的呼叫). 

  • Why

    開發者可以在任何主機上以前端技術進行需要取得Facebook Social Content的應用程式開發, 也就是說Facebook App的開發模式並不一定要採用被框限在Facebook Chrome內的FBML或是Iframe.

  • How



    • 建立"跨網域溝通頻道(cross domain communication channel)" 建立一個空白的文字檔案名稱為"xd_receiver.htm" 將以下的內容寫入該檔案中並執行儲存



      <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
      <html xmlns="http://www.w3.org/1999/xhtml" >
      <head>
      <title>Cross-Domain Receiver Page</title>
      </head>
      <body>
      <script src="http://static.ak.facebook.com/js/api_lib/v0.4/XdCommReceiver.js?v2" type="text/javascript"></script>
      </body>
      </html>

      該檔案最主要是要在使用FB.init的時候當成參數傳入, 一個網域只需要一個xd_receiver.htm, 而且檔案的路 徑要使用相對路徑的方式來指定.相對於使用到Facebook Javascript客戶端函式庫的檔案時 ex : 假設你的應用程式放置在 http://{Domain Name}/fb_apps/js_demo/ 之下, 而xd_receiver.htm放置於
      http://{Domain Name}/fb_apps/js_demo/channel/
      之下.

      <script type="text/javascript">
      FB.init("{應用程式的API Key}", "channel/xd_receiver.htm");
      </script>

      相對於根目錄(Root)時

      ex : 假設你的應用程式放置在
      http://{Domain Name}/fb_apps/js_demo/ 之下, 而xd_receiver.htm放置於 http://{Domain Name}/channel/ 之下.

      <script type="text/javascript">
      FB.init("{應用程式的API Key}", "/channel/xd_receiver.htm");
      </script>

      注意事項:




        當使用你的應用程式屬於Iframe Canvas模式時, 引入的js為 <script src="http://static.ak.facebook.com/js/api_libv0.4/FeatureLoader.js.php" type="text/javascript"></script> 當你開發的是Facebook Connect類型的網站應用程式時, 請載入 <script src="http://static.ak.connect.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php" type="text/javascript"></script>

Sunday, October 25, 2009

Facebook App開發手記 - 如何讓User發送應用程式站內Request與郵件Request給朋友



為什麼已經有網站了,卻還是有很多網站經營者一窩峰的著手於Facebook App的開發呢?

毫無疑問的, 奠基於Facebook上廣大使用者(全球使用人數3億)的病毒式訊息散佈絕對是

主因, 網路就是一個營者通吃的世界, 大多數人使用Facebook的主因都是因為他們的朋友

都在用, 然而當一個網站的使用者突破了某個神奇的數字之後, 其他許多競爭者也大都只

能於其後望塵興嘆了, 而Facebook就是用了一些有創意的機制去加速了這個過程, 使得那

個數字的達成速度遠快於其競爭者, 使用者的累積代表了流量的提升, 而流量通常就是商

機, 對品牌與商品而言就是能夠有更多的曝光機會, 正如簡報中Sean Parker所分析的,

Facebook是一個Network Services, 有別於Google的Information Services, 而身為一個從

事於Network Services的公司, 其最主要的核心價值就在運用個人與個人以及群體與群

體, 甚至個人與群體之間的可能建立起無限的關聯(Relationship)去擴大資訊散佈的廣度與

深度.


Friday, October 23, 2009

Facebook API - Facebook即將進行Streaming API的變動



今天Facebook對Home Page做了版面與訊息串(Streaming)呈現方式的調整, 在閱讀相關

文章的同時, 發現Facebook也即將對其有關於Streaming發佈的API也進行架構的調整, 根
據Facebook Blog的說法是因為Facebook API在隨著Facebook功能不斷快速的擴增與演化
之後, Facebook工程師們不斷的在維護一些很原始的程式版本, 進而造成API在功能上出
現很多疊床架屋的地方, 所以透過這次架構調整之後, 將有些API不再繼續進行維護與更
新, 進而建議使用者採用重新設計過並相對簡化的API, 下方列出即將被Deprecated的APIs
與即將推出的新APIs

Facebook今天發佈了重新設計過的首頁版面

 

Facebook - Home_1256358778724

最主要的變更在於最上頭導覽列下的Live Feed與News Feed

根據Facebook官方Blog的解釋其兩者的差別在於

  • Live Feed

    Facebook - Home_1256361220935

    即時在發生的訊息, 只要你持續的維持在登入狀態下, Live Feed就會不斷的提供你所

    有朋友們最新的動態, 包含貼文, 流言, 評論…etc

  • News Feed

    Facebook - Home_1256359764129

    Facebook會利用新的演算法去評估昨天發生了哪些事件對於你是最具有意義的, 然後

    這些經過過濾後的訊息會出現在News Feed下的訊息流(Stream)之中. 演算法會根據

    有多少屬於你的朋友曾經跟該則訊息進行過互動, 包含回應, 喜歡去推算出你與該則

    訊息繼續進行互動的可能性.

Facebook在這一波的Redesign中還將一些使用者可能會感興趣的資訊加入了News Feed

之中, 包含朋友們被下標籤在那些相片上以及成為了那些頁面(Page)的粉絲, 加入了哪些

新朋友與群組
以及RSVP了哪些事件…etc



 

Facebook API - 簡易Facebook App 朋友牆

先來實做一個簡單的範例, 一個極為簡單的Facebook App, 其唯一的功能只有列出User所有朋友的頭圖, 當然前提是User已經完成對App的授權(Allow)之後.

  • Step1 建立一個新的應用程式

    Facebook - Developers_1256290709899 

    輸入應用程式的名稱, 並且要將"Agree"點選起來

    Facebook - Create Application_1256290985380 

    點選"Create Application"之後, 你會被導向如下圖所示的頁面

    Facebook - Edit Demo App - 6yeah_001_1256291102156

    本頁面有三個非常重要的資訊, 其中API Key與Secret都是要用在API中的重要資訊

    Facebook - Edit 6yeah Friends List App Demo_1256291516650 

    接下來點選"Canvas"頁籤, 在這裡有三個設定非常重要

    • Canvas Page URL


      這裡設定的就是以後User連結到你的App的URL, 以本範例而言, 我們在輸入框中填入sixyeah_demo_a, 一但送出之後, 以後User只要輸入http://apps.facebook.com/sixyeah_demo_a就會連結到你App的Canvas Page了.

    • Canvas Callback URL


      這裡所設定的URL就是指向放置該App的應用程式主機, 以本範例來說, App是Hosting在www.6yeah.com 這台主機上面, 設定值為"http://www.6yeah.com/fb_apps/friends_list/my_friends_list.php"

    • Render Method


      我們選用FBML

      如此一來我們已經完成了一個App所有必要的設定了

  • 下載PHP Client Libraries
  • PHP與FBML程式碼

    <?php
    require_once('./facebook-platform/php/facebook.php');
    require_once('./facebook-platform/php/facebookapi_php5_restlib.php');

    $appapikey = '{API Ley}';
    $appsecret = '{APP Secret}';
    $facebook = new Facebook($appapikey, $appsecret);

    $user = $facebook->require_login();

    $friend_uids = explode(',',$_POST['fb_sig_friends']);
    ?>
    <div style="border:solid 2px gray;padding:5px;float:left;clear:both;">

    <?php
    foreach ( $friend_uids as $uid ){
    ?>
    <div style="float:left;margin:5px;">
    <fb:profile-pic uid="<?php echo $uid; ?>" linked="true" size="square"/>
    </div>
    <?php
    }
    ?>
    </div>

    結果會如下圖所示 進入Demo頁面

    6yeah Friends List App Demo on Facebook_1256292431891

Thursday, October 22, 2009

Facebook API - Facebook的應用程式授權機制(二)


如本文的系列一中所提到, 一個應用程式不論是否被User授權過(Allow), 該應用程式都會出現在User的應用程式清單中, 只要User於登入的狀態下瀏覽了該應用程式的Canvas Page. 一但你的App被使用者加入了應用程式清單之後, 往後只要User再次使用了你的App, 你所開發的App就可以取得許多與該User有關的資訊, 而且該User會被認定為App的活躍使用者(Active User). 不只如此, 只要該User的朋友於User的Profile上與App進行過互動, 該位User的朋友也會被認定為App的Active User, 整個App的擴散過程就是如此的病毒式.
那麼究竟User授權(Allow)我的App與否對身為開發者的我有何影響呢?
根據Facebook的Documentation所描述, 以下分別來討論

Wednesday, October 21, 2009

Facebook API - Facebook的應用程式授權機制(一)

Facebook在應用程式的授權上, 講單純一點, 最主要的分別就是使用者是否曾經"Allow"過它, "Allow"這項動作決定了應用程式往後能跟使用者進行互動的程度, 以下就分各個不同的情境來觀察這事關重大的機制

Sunday, October 18, 2009

Facebook API - Facebook Connect 系列 – Comment Box簡易設定步驟


詳細的解說將會於"Facebook Connect系列"中陸續解說, 本文僅就協助對Facebook API有興趣的使用者達成些許成就感為主要目的.

  • 建立應用程式

    點擊Set Up New Application

    Facebook - Developers_1255936409428 

    設定應用程式名稱,每一個Facebook Connect等同於一個Facebook Application

    Facebook - Create Application_1255937082522

    點選Connect頁籤,並將Connect URL設定成xd_receiver.htm檔案存放的地方,也就是您網站的根目錄

    Facebook - Edit 6yeah-connect-demo_1255937278540

     
  • 步驟一

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <body>
    <script src="http://static.ak.connect.facebook.com/js/api_lib/v0.4/XdCommReceiver.js" type="text/javascript"></script>
    </body>
    </html>

    將上述程式碼存成xd_receiver.htm,並將檔案存放在伺服器的根目錄下.
     
  • 步驟二

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:fb="http://www.facebook.com/2008/fbml">

    將畫紅線的部分添加到html標籤內
     
  • 步驟三

    將<script type="text/javascript" src="http://static.ak.connect.facebook.com/js/api_lib/v0.4 /FeatureLoader.js.php"></script>
    <script type="text/javascript"> FB.init("API Key","/xd_receiver.htm");</script>
    寫入</body>之前

    請注意! FB.init中, 弟二個參數為xd_receiver.htm檔案的相對路徑

  • 步驟四

    下方的FBML將會於頁面上顯示一個Comment Box

    <fb:comments xid="獨一無二的序號" canpost="true" candelete="false" returnurl="http://apps.facebook.com/myapp/titans/">
    <fb:title>請留下您的意見</fb:title>
    </fb:comments>

    xid : 請使用一個於您的網站上不會發生重複的ID,例如您所經營的是一個3C商品網站就請使用產品ID作為xid
    Example: xid="product_1234"

    Fb:comments說明文件
  • 步驟五

    完成以上步驟之後,您進入頁面應該就會看見紅色框線包圍的地方

    六葉摩卡 6yeah_1255930189310 

    點選Connect with Facebook之後就會彈出一個如下圖所示的對話框

    六葉摩卡 6yeah_1255930607426 

    點選對話視窗中的Connect with Facebook之後會跳出一個新的視窗如下

    Facebook - Log in to 6yeah-connect-demo_1255930796132 

    最後當您點選了Connect Button之後頁面就會,父視窗就會進行重整,接下來您就會見到如下的畫面,如此一來,您就成功的與Facebook連結在一起了

    六葉摩卡 6yeah_1255931257793

  • Facebook Connect Demo

Saturday, October 3, 2009

Facebook API – IFRAME or FBML(二)

除了Facebook Chat某個程度上突顯出了IFRAME模式的優點, XFBML的引入更讓IFRAME的運作更有效率. 在XFBML之前, IFRAME模式下如果要取得Facebook上的Social Content, 必須在你的應用程式伺服器上與Facebook Server進行多次的API Call, 然後才能將整合了Social Content的頁面內容回傳到使用者的瀏覽器中. 但是在使用了XFBML之後, 身為開發者的你可以直接在IFRAME呼叫的程式裡勘入FBML的Tags, 然後透過引入Facebook所提供的Javascript去掃描整個頁面的DOM去取出所有位於fb命名空間下的Tag進行 一次批次性的API Call去取得social Content然後進行DOM的替換, 而其他不屬於fb Namespace下的DOM元素將會在API Call完成之前就顯示於頁面之上, 甚至開發者還能將一些資訊於應用程式伺服器上進行快取, 連API call的Round Trip都能省了下來, 這樣的做法大大的提升了IFRAME的效能.

以下我嘗試拆解整個流程

  • IFRAME Canvas Page使用XFBML - 使用者第一次載入頁面的情境
    1. 使用者的瀏覽器發出連線到應用程式的Request到Facebook
    2. Facebook Server回傳fb Chrome給使用者的瀏覽器
    3. 瀏覽器根據fb Chrome內的IFRAME對你的應用程式伺服器發出Request
    4. 如果IFRAME的內容中有需要發出Facebook API Call的請求, 此時在Facebook Server與APP Server間會有一次或是多次的Round Trip
    5. App Server將IFRAME的內容回傳到User的Browser內
    6. User的Browser會利用引入的Facebook Javascript Library進行整個頁面DOM的掃描去取出所有fb Namespace的元素然後進行批次的API Call, 而其餘的不數於fb命名空間下DOM會在API Call的同時先顯示於瀏覽器之中.

      而API Call所回傳的Social Content可以快取在客戶端, 當User於下一次Reload Page之時, 就不會發生與Facebook Server之間的Round Trip 
    7. 待API Call完成之後, fb Namespace下的Tag將會替換成相對應的Social Content
  • IFRAME Canvas Page使用XFBML - 使用者已載入頁面後的Page Reload情境

    步驟1~5一樣, 主要的差別在於如果有在第一次載入面頁的時候將Social Content快取在客戶端的話, 連第6步中與Facebook Server間的Round Trip都可以省下來了, 如此一來讓IFRAME運作起來就像一般的網頁一樣. 除了Social Content會在其他不屬於fb Namespace下的DOM先顯示完成後才會呈現.

Friday, October 2, 2009

Facebook API – IFRAME or FBML(一)

 

對於初次開發Facebook App的Developer而言,最難以抉擇也模糊不清的應該就是究竟Canvas Page上要用FBML還是IFRAME來呈現您的程式,下面簡單的列出兩者之間的差別

  • FBML

    使用FBML開發的Facebook應用程式,在Canvas Callback URL所指向的程式不能有<body>,<head>,<meta>,<script>,<link>…等等標籤在裡面, 也就是說你不能在裡面去引入外部的CSS,Javascript以及許多出神入化的Javascript Framework,像是jQuery與ExtJs等等.

    使用FBML可以使用非常多Facebook內建的標籤去取用許多Facebook功能模組(ex:Social,Sanitization,Design,Component,Control…)以及敏銳的驗證機制

    運作程序


    1. 使用者發出對你的Canvas Page的Request.
    2. Facebook Server根據你應用程式設定中的所指定的Callback URL, 發出HTTP POST到你的應用程式伺服器, POST的內容就是一堆以fb_sg為prefix的參數,細節請看應用程式的授權.
    3. 假如你的應用程式沒有呼叫Facebook API的必要的話, 此時你的應用程式就會回傳FBML給Facebook.

      反之如果你有需要透過Facebook API去取得一些FBML所無法取得的資料的話, 此時你的APP會發出Facebook API Request到Facebook Server
    4. Facebook Server會根據API所請求的內容回傳相對應的Social Content到你的應用程式伺服器
    5. 接收到Facebook Server回傳的資料後, 你的應用程式會將接收到的Social Content伴隨著FBML一起回傳到Facebook Server
    6. Facebook在接收到FBML之後會透過FBML Parser將其轉換成一般的HTML並回傳到使用者的瀏覽器上去作頁面的呈現

      大部分的狀況下, FBML就已經能提供足夠的Social Content去進行應用程式的運作, 所以步驟3與步驟4在採用FBML的應用程式上通常不會發生.

  • IFRAME

    簡單說, 採用此種開發模式的Facebook App就是在Facebook的Canvas Page上Layout出一個傳統的IFRAME(官方文件說法是IFRAME會被包在Facebook Chrome之中), 而位於開發者主機上的程式或頁面就顯示於該IFRAME裡面, 在這個IFRAME妳可以任意的使用CSS,Javascript, 以及任何你愛用的Javascript Framework.

    Javascript除錯較為方便, 因為開發者可以利用許多工具像是Firebug來進行偵錯的動作.

    較快的AJAX存取, 因為不用經過Facebook Proxy

    用Firebug檢視位於Facebook Chrome中的IFRAME你會發現Facebook附加了很多資訊在你的Canvas Callback URL之後

    http://www.6yeah.com/facebook/6yeah-official.php?fb_sig_in_iframe=1&fb_sig_iframe_key=xxxxx&fb_sig_locale=en_US&fb_sig_in_new_facebook=1&fb_sig_time=1256090683.9768&fb_sig_added=0&fb_sig_api_key=xxxxx&fb_sig_app_id=xxxxx&fb_sig=xxxxx

    這些附加在Canvas Callback URL之後的fb_sig系列參數是為了讓你的程式知道哪一位使用者登入了你的應用程式以及確認這項Request確實是來自Facebook. 除此之外, 附加的參數中也包含了你應用程式的API Key(fb_sig_api_key=xxxxx), 讓你可以呼叫Facebook API去取得使用者姓名, 朋友清單, 個人頭圖…等各項社交內容(Social Content).

    運作程序


    1. 使用者對Facebook Server發出App的請求
    2. Facebook Server會剖析使用者Request的是那一個App, 然後回傳相對應的Facebook Chrome到使用者的瀏覽器上.
    3. 使用者瀏覽器接收到回傳的Facebook Chrome之後, 會根據包在裡面的IFRAME去向你(應用程式開發者)的應用程式伺服器去取得IFRAME的內容.

      PS:如果你去檢視頁面原始碼就會看到Facebook Chrome就是如下方顯示的HTML

      <div id="app_content_{應用程式的APP ID}" class="canvas_rel_positioning app_content_{應用程式的APP ID}">

      <iframe frameborder="0" class="smart_sizing_iframe" fbcontext="d878215e9e95" smartsize="true" src={應用程式設定中的Canvas Callback URL}?fb_sig_in_iframe=1&amp;fb_sig_iframe_key=xxxxx&amp;fb_sig_locale=en_US&amp;fb_sig_in_new_facebook=1&amp;fb_sig_time=1256090683.9768&amp;fb_sig_added=0&amp;fb_sig_api_key=xxxxx&amp;fb_sig_app_id=xxxxx&amp;fb_sig=xxxxx name="iframe_canvas" id="app{應用程式的APP ID}_iframe_canvas" style="width: 758px; height: 440px;"/>

      </div>
    4. 在你的應用程式伺服器上, 應用程式會發出Facebook API的Request到Facebook伺服器去取得需要的資料.
    5. Facebook Server會驗證API Request然後回傳API呼叫的資料到你的應用程式伺服器.
    6. 將透過Facebook API取得的資料組成完整的HTML回傳到使用者的瀏覽器去進行呈現.

  • FBML與IFRAME在速度上的比較

    基本上, FBML會比IFRAME來得快, 也就是有較低的Round Trip, 其原因有三

    • 大部分FBML的Canvas Page不需要進行Facebook API的呼叫, 也因此應用程式伺服器與Facebook之間的Round Trip降低了.

    • 相較於IFRAME的模式, 使用者的瀏覽器主要是跟Facebook Servers進行溝通, 而非直接的與你的應用程式伺服器溝通, 而Facebook的Server都擺放在一些世界級的Data Center(Amazon與Joyent…etc)中, 所以想當然爾其間的Latency必然比IFRAME的模式來得有效率多.

    • IFRAME的設定對大部分瀏覽器來說會有一些不必要的Overhead, 當然這項因素對效能的影響遠低於前兩項.

但是IFRAME的模式在近期Facebook新增的Facebook Chat這項新功能上就顯著的優於FBML, 因為Facebook Chat這項功能在初始化時需要載入大量的Javascript與CSS, 雖然在第一次載入頁面的時候兩種模式都會需要耗用資源去執行Chat所需要的運算, 而且初始後這些Javascript與CSS會被快取在瀏覽器中. 但是FBML模式下的頁面每重新載入(page reload)一次就必須要耗用CPU資源去執行顯示Chat Bar的Javascript, 反之IFRAME模式下的APP就只會變更IFRAME裡面的頁面內容, 不會影響到Facebook Chrome已載入並初始化好的Chat Bar.

Facebook - Home_1256104036949

除了Facebook Chat某個程度上突顯出了IFRAME模式的優點, XFBML的引入更讓IFRAME的運作更有效率. 在XFBML之前, IFRAME模式下如果要取得Facebook上的Social Content, 必須在你的應用程式伺服器上與Facebook Server進行多次的API Call, 然後才能將整合了Social Content的頁面內容回傳到使用者的瀏覽器中. 但是在使用了XFBML之後, 身為開發者的你可以直接在IFRAME呼叫的程式裡勘入FBML的Tags, 然後透過引入Facebook所提供的Javascript去掃描整個頁面的DOM去取出所有位於fb命名空間下的Tag進行 一次批次性的API Call去取得social Content然後進行DOM的替換, 而其他不屬於fb Namespace下的DOM元素將會在API Call完成之前就顯示於頁面之上, 甚至開發者還能將一些資訊於應用程式伺服器上進行快取, 連API call的Round Trip都能省了下來, 這樣的做法大大的提升了IFRAME的效能.



Thursday, October 1, 2009

Facebook API – Facebook Application的運作原理(一)

 

所謂的Facebook應用程式的運作過程大致可以拆為六個步驟

  • 步驟一

    使用者於瀏覽器中輸入Facebook application的網址,例如http://apps.facebook.com/hello_world_sixyeah

    該網址會連結到Facebook位於雲端上的伺服器叢集中,這些伺服器會分析使用者瀏覽器所發出的HTTP Request,決定這項請求是針對哪一個應用程式,當伺服器找出對應的應用程式.
  • 步驟二
    Facebook會去擷取該應用程式設定中Callback URL(以本例來說就是http://apps.facebook.com/hello_world_sixyeah)的設定值,並依該設定值去擷取網頁內容,使用者不會感覺到其實他所存取的程式並不在Facebook的伺服器上.
  • 步驟三

    Facebook App會從開發者的伺服器發出對Facebook API的呼叫,應用程式開發者最好在此處盡其所能的將資料快取住,降低整個程式的反應時間.
  • 步驟四

    開發者的應用程式伺服器會將FBML,也就是應用程式開發者最後產生並回傳到Facebook伺服器的資料格式.
  • 步驟五

    Facebook的FBML Parser會將接收到的FBML轉換成一般的HTML並將內容勘入Facebook的頁面中,如下所示.

    <div id="app_content_202633485040" class="canvas_rel_positioning app_content_202633485040">
    …應用程式被FBML Parser轉換後的HTML會寫於此處
    202633485040是此應用程式的序號
    </div>

  • Demo Facebook Application