posts - 15,  comments - 9,  trackbacks - 0

设计一个 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 仑波比 阅读(1177) 评论(1)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: