对于一个熟练的PHP程序员或者JAVA Guru,开发一个Facebook App可能还是很容易的,毕竟Demo文档非常齐全。然而,对于同样渴望开发优秀App的前端工程师,入门的门槛可能还是要高一些。好在Facebook 为我们提供了强大的文档,更好在,我,Aw,也是一名关注Web前端技术的开发者,归纳总结了一些个人的经验与大家分享:)
- 如何上手
首先,我建议使用PHP的开发方式。没错,既然你是一个对服务器端编程一点都 不懂的前端工程师,为什么要去花时间折腾文档和Demo较少的其他服务器端语言呢。我并不是PHP的“粉丝”,但范例最多、配置最快并且有 Facebook官方支持的,似乎只有PHP了。
然后去官方看这些内容,非常详细(但不太容易找到):
《App所具备的一些要素 》
《手把手叫你开发一个App 》 - Callback到底是什么
Callback URL和ActionScript中的Call Back函数还是不太一样的。
CallBack URL说白了,就是你自己的服务器的一个URL,比如,我的awflasher.com/someurl,在这个URL上,输出一些“相关内容”给Facebook的Canvas来进行渲染。关于这一套流程,强烈建议看这篇 (翻到下面),也是在Wiki里面藏的特别深很难找到的:这么重要的问题,居然藏在一个“Random Questions”里面。也可以看这张“图” +------------------+
| BROWSER |
| |
| +-------------+|
| |Application ||
| |Canvas ||
| | ||
| | ||
| +-------------+|
| |
+---+----------+---+
| ^
1) Browser makes | | 5) Facebook Renders FBML to
request v | HTML
+-----+----------+-----+
| FACEBOOK SERVER |
+-------+ |
| | |
| | |
| | +<-------------+
| | | |
| | | |
| | | |
| | | |
| | | 4) App Server
2) FB Server Calls | Returns FBML
out to App Server---------+-----------+ |
| ^ |
| | 3) App calls FB API |
| v |
| +---------+------------+ |
| | YOUR APP SERVER | |
| | | |
| | | |
| | | |
+------->+ 2.5) App server +-------------+
| composes API |
| calls |
| |
| 3.5) App server |
| generates FBML |
| from API results
+----------------------+- 官方提供的PHP client包存在的一些细节问题
我到现在也不知道官方提供了多少个PHP版本。似乎在Developer的App页面(简写为:apps.fb.com/dev和dev.fb.com)和Developers的Wiki页面有许多不同的范例。这其中有很多不规范的地方,例如:
把<?php echo getFriends();?>写为<?=getFriends()=?>之类的“简写”。这对于刚配置好的PHP环境实在是让人无从调试(因为你想不到官方提供的代码可能有问题)
- PHP开发中常遇到的问题
前端开发者的思路似乎更“粗糙”一些,我就有这个毛病。我在开发Facebook App的时候经常犯的错误就是把HTML和PHP内容混到一起了,例如:
<?php echo ‘<p>test’.$somevar.’</p>’;
<br>
?>
这样的写法乍一看没问题,但实际上中间的<br>是PHP根本看不懂的。在大多数配置下,这个错误根本看不到(不像Flash那样会有 一个Compliler帮你报错),遇到这种情况,如果是少量HTML,就给它echo出来;否则,就将PHP标签结束再输出,例如:
<?php echo ‘<p>test’.$somevar.’</p>’;
?><br><?php … ?>
- FBML的设置
最关键的setFBML是把FBML显示到用户个人主页的函数。在使用这个函数的时候,一定要确认用户已经“同意改变profile box”,这是安装App的几条协议中的一条。如果你自己调试期间不希望被别人看到而当时没选中,那么很可能是导致你多次无法看到相关内容出现的主要原 因。
此文仅是抛砖引玉之文,因为也许我遇到的错误其他人又很容易地解决了,欢迎补充,我会保留链接。