設計一個 Facebook 應用程序
理想情況下,您希望設計一個用戶認為十分好用或者充滿樂趣的應用程序。它使得用戶能夠通過 Facebook 網絡同他們的朋友進行溝通。您不能保證一個成功的應用程序(這依賴于應用程序的核心概念),但是您可以保證如果這個概念是成功的,那么您的應用程序可以被很好地集成到 Facebook 平臺之中,并且通過市場和虛擬的口口相傳不斷提升。所以,您可以從以下角度來看待問題:如何創建一個能夠大幅提高用戶連通性的應用程序,并且通過 Facebook 的集成點擴大您的用戶基礎,并且鼓勵用戶隨時隨地的同您的應用程序進行交互。
剖析一個 Facebook 應用程序
Facebook 為您的應用程序提供了許多集成點:其中兩個主要的區域分別被稱作應用程序的畫布頁面和剖面盒,除此之外,還有大量的輔助集成點。
畫布頁面
您通過這些輔助點的最突出的和無所不在的 Left Nav 訪問一個應用程序的畫布頁面。Left Nav 是 Facebook 的左側導航欄中的一個鏈接,它將 Facebook 中的所有其他的頁面整合起來,并且列出了所有的當前用戶已安裝的應用程序(除非用戶在安裝應用程序時去掉了這一選項)。舉例來說,您可以點擊相冊應用程序的 Left Nav 鏈接(請參見圖 8 中所示)。
圖 8. 左側定位鏈接
私有設置
最后,用戶可以通過 Applications 應用程序在他們的環境中限制一個應用程序的集成點,Applications 應用程序列出了所有已經安裝的程序,允許您對其進行刪除或者編輯操作。點擊 Edit Settings 打開標準私有設置窗口(請參見圖 28 所示)。
圖 28. 標準私有設置對話框
這里是私有設置的詳細信息:
- 誰能看到這里:允許用戶指定哪些人能夠看到他們所安裝的相冊應用程序。選項包括:
- 我的網絡和朋友:用戶網絡(例如紐約)中的任何人,以及用戶的所有朋友。
- 朋友的朋友
- 只有朋友可以
- 沒有人可以
- 定制:在彈出的窗口中,允許用戶自己設定哪些網絡和哪些朋友可以或者不可以看到應用程序。
- 在左手菜單中顯示:決定這個應用程序是否在用戶的應用程序安裝列表中建立鏈接(在他們的左側導航欄中)。
- 在我的 News Feed 中發布相關的故事:決定應用程序是否能夠將條目發布到用戶的 News Feed 中(位于他們的主頁面)。
- 在我的 Mini-Feed 中發布相關的故事:決定應用程序是否能夠將條目發布到用戶的 Mini-Feed 中(位于剖面頁面)。
- 在剖面圖片之下添加一個到任何剖面的鏈接:決定應用程序是否能夠發布剖面行動鏈接。
- 允許這一應用程序通過電子郵件同我保持聯系:決定應用程序是否能夠向用戶發送電子郵件。請注意這涉及到用戶的外部郵件賬號;您的應用程序不能夠向用戶的 Facebook 收件箱發送電子郵件。
在完成這些標準私有設置之后,應用程序還會提供其定制配置窗口,您可以通過標準私有設置窗口中的 Other Privacy Settings 鏈接進行進一步的設置(請參見圖 29 所示)。
圖 29. 在標準私有設置對話框中的另一個私有設置鏈接
現在,您已經回顧了用于集成您的應用程序的可用點,下面我們看一下如何為這些不同的集成點創建您的應用程序的內容。
FBML
您需要提供 Facebook 可以嵌入到其頁面中的內容,但是您不能像在您自己的網站上那樣,使用直接的 HTML 和 Javascript。Facebook 需要確保內容不包含任何惡意的 Javascript,并且希望使應用程序盡可能簡單地將 Facebook 環境中的信息包含在您的提交內容中。
Facebook 對于這一問題的解決方法就是 FBML(FaceBook 標記語言),一種當 Facebook 提交您的應用程序的內容是所使用的 XML 語言。您可以將 Facebook 認為是一個文本預處理器,就像 XSLT 或者 PHP,它將 FBML 內容轉換為 HTML,代替不同的 Facebook 標簽下關于用戶或者環境的數據。為了取代失去的 Javascript 功能,Facebook 提供了 FBJS 語言(FaceBook JavaScript)。為了簡化到 Facebook 數據庫的復雜查詢,并且減少所需的調用的數量,Facebook 提供了 FQL(FaceBook 查詢語言,SQL 的一個變體)。圖 30 中描繪了信息從您的應用程序服務器到用戶瀏覽器的流程。
圖 30. 從應用程序服務器到用戶瀏覽器的信息通告的流程
大多數 FBML 標簽在語法上同 THML 標簽都是一致的,但是 FBML 還提供了許多行為標簽,以及從 Facebook 數據庫中提取信息并且包含在您的內容中的標簽。您將在第 2 部分中對相關內容做進一步的研究。
至于 FBJS(Facebook Javascript),它僅僅是做出某些修改后的 Javascript。Facebook 從語法上對您常見的 Javascript 代碼進行了分析,并且在傳遞到瀏覽器之前做出了一些改變。它同樣對 DOM 進行了修改,對于訪問和修改元素加入了限制。您將在第 2 部分中看到更多關于這種改變的詳細內容。
Facebook 還通過一個 AJAX 對象提供了功能強大的 AJAX。所有的 AJAX 請求都通過 Facebook 的服務器被代理,從而使您能夠將 FBML 代碼作為一個 AJAX 請求的結果返回。Facebook 對于 FBML 代碼的處理同它對其他代碼的處理一樣,在適當的位置(比如 <fb:name>
)插入 Facebook 數據,并且您的 AJAX 調用被返回一個對象,該對象能夠通過一個 DOM 元素的 setInnerFBML()
函數設置為該元素的“內部 FBML”。出于安全性的原因,Facebook 并不支持“內部 HTML”,但是一個 setInnerXHTML()
函數正在測試之中。
WebSphere Application Server 和 Facebook 的服務器之間的通訊
我們的應用程序運行在 WebSphere 之下,它必須同 Facebook 進行通訊,而且 Facebook 也必須同您的應用程序進行通訊。Facebook 同您的 PHP 腳本之間的通訊被限制在畫布頁面請求中,在那里用戶可以進行某些活動。當用戶進入您的應用程序的畫布頁面 URL 時(http://www.facebook.com/JakeTestApp),Facebook 代理這一請求到您的遠程服務器 URL(http://myserver.url/FacebookTestApp/index.php),并且您的 index.php 返回 FBML。類似地,您的 FBJS 代碼發出一個 AJAX 請求,它通過同樣的代理并且向您的服務器發出請求。
您的應用程序還需要同 Facebook 進行通訊,在一個請求期間或者是提取信息或者是發送信息。它通過 Facebook 的 REST 接口完成這一操作,這是一個將 API 暴露為您可以通過不同的請求參數進行特定調用的 URL 的 HTTP 接口,并且返回 XML 或者 JSON。您無需擔心這些 HTTP 調用或者返回數據的細節,這是因為 Facebook 提供了 PHP、Java 和 Javascript 客戶機程序庫 —— REST 接口周圍的封套處理 HTTP 請求的建造,并且將返回數據整理為在客戶機程序語言中可用的數據。
使用客戶機程序庫
客戶機程序庫提供了一個 Facebook 客戶機 API 對象,它是一個將我們的方法調用轉換為向 Facebook 服務器的請求的一個代理對象。舉例來說,要獲得當前用戶的朋友,您只需要調用一個 Facebook 對象上的函數即可(請參見列表 1 中所示)。
列表 1. 通過 PHP 客戶機程序庫獲得當前用戶的朋友
$friends = $facebook->friends_get();
|
我們還可以將信息發送到 Facebook 中(對信息進行升級)。舉例來說,剖面盒同畫布頁面的工作方式是不同的(請參見 剖面盒 和 畫布頁面 小節)。您并不是等待 Facebook 查詢您的服務器以獲得一位用戶的剖面盒的內容,而是必須在希望改變時發出明確地內容。Facebook 隨后將剖面盒內容存儲在它的服務器上。這樣做的意義在于,如果剖面盒內容不存儲在 Facebook 上面,那么 Facebook 將在每次查看包含您的應用程序的用戶剖面時訪問您的服務器,并且用戶將在訪問其他用戶的剖面時花費大量的時間。對于一個受歡迎的應用程序來說,這將導致大量的服務器負載,并且在加載剖面頁面時加長等待時間。為了改變用戶剖面上的您的應用程序的剖面盒的內容,您只需要再次調用由 PHP 客戶端程序庫所提供的 $facebook
對象上面的一個方法(請參見列表 2 中所示)。
列表 2. 在當前用戶的剖面頁面設置您的應用程序的剖面的內容
$facebook->profile_setFBML ('New profile box content', $user);
|
每一次方法調用都向 Facebook 發出一個明確地請求。隨著您的應用程序變得愈加復雜,您的 PHP 代碼也必須向 Facebook 查詢越來越復雜的數據,并且這些數據依賴于先前功能調用的結果。舉例來說,您可能希望取得當前用戶相冊中的所有人的名字,這需要您首先調用 Facebook 請求所有的用戶相冊,然后請求那些相冊中的相片,然后請求那些相片中的相片標簽,然后請求相片標簽的用戶 —— 大量的工作、大量的 Facebook 服務器請求、以及大量的 PHP 代碼。
FQL
此外,您可以使用單一的 FQL 查詢(Facebook 查詢語言),它是 Facebook 提供的一種 SQL 的變體,用來直接查詢數據庫和核心應用程序的數據。FQL 只允許在 from
子句中出現一個數據表,但是允許在 select 和 where 子句中使用子查詢,所以下面的 FQL 查詢所得到的結果同上面所描述的一致(標簽用戶的名字),但是在一個單一的查詢中,我們的代碼將會更加簡明和易于讀寫(請參見列表 3 中所示)。
列表 3. FQL 示例 —— 選擇一個用戶相冊中的所有標簽用戶的名字
select first_name from user
where uid in
(select subject from photo_tag where pid in
(select pid from photo where aid in
(select aid from album where owner = 563830447)))
|
在列表 3 中,563830447 是作者的 Facebook 號碼。這一 FQL 請求將返回一個 XML,并且作為 Facebook REST 響應的一個實例(請參見列表 4 中所示)。
列表 4. FQL 查詢響應
<?xml version="1.0" encoding="UTF-8"?>
<fql_query_response xmlns="http://api.facebook.com/1.0/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" list="true">
<user>
<first_name>Jake</first_name>
</user>
</fql_query_response>
|
您可以對此進行檢驗,并且通過 FBML 片段進行實驗。使用的工具是 Facebook 的開發器測試控制臺:http://developers.facebook.com/tools.php?api (請參見圖 31 所示)。
圖 31. Facebook API 測試控制臺
使用 FBML、FBJS、FQL 和 Facebook 客戶機程序庫,您可以開發出一個能夠很好地被集成到環境之中,并且能夠提供強大功能的應用程序。現在,我們可以開始創建我們的應用程序了。
posted on 2008-07-22 20:27
侖波比 閱讀(1194)
評論(1) 編輯 收藏