2009年6月17日 星期三

Facebook Flash Application開發心得(前言)


Facebook的API很久以前就有了,嗯。
不過前一段時間,就在Adobe跟Facebook正式宣佈要一起建構什麼新型態的社交平台之後,終於有了CS3版本的swc。(之前都是Flex版的)
基本上我仍然十分習慣在CS3之下工作,還不是很喜歡打開Flex。所以一看到有CS3的版本後就開始把玩了起來。

說真的,目前為止,我個人覺得Facebook的API說明文件寫得真的不是很好,有太多東西需要開發者自己去摸索。其實我可以理解Facebook針對client端語言的一些限制,畢竟權限以及預防API的被濫用是他們很大的一個課題,只是這些東西我都是要google好久才發現原來我必需要繞一條路去跑。

另一個部份是Application的設定問題,倒是也花了我不少時間才搞清楚什麼東西要怎麼設。

接下來應該會花幾篇的功夫記錄我這幾天在Facebook上開發flash application的心得。Adobe官網上的文章在某方面可以一看,但是更進階的部份卻更新十分緩慢,O’Reilly Inside RIA裡Mirza Hatipovic寫的幾篇文章倒是給了我一些方向,有興趣的可以先從他的文章開始。
http://www.oreillynet.com/pub/au/3675
他似乎是預計要寫二十篇來做教學,但是似乎很不巧的在他寫到一半時Facebook for Flash的API有了一些改變,但是我想基本原理不變。


至於我的部份,純粹會是記錄我在實際設定以及執行上遇到的一些問題及解決方法,一來讓我可以自己將來回頭再來翻閱,而來如果有人也需要這些資訊的話希望可以幫上一點忙。

之後新增的有關Facebook開發的文章將會列舉連結在下面:
-----------

Facebook Flash Application開發心得(1) - FB Connect - how to start
Facebook Flash Application開發心得(2) - FB Connect - 接上Flash
Facebook Flash Application開發心得(3) - 由Flash Api從Facebook取得資料
Facebook Flash Application開發心得(4) – Iframe的架構下取得Session
Facebook Flash Application開發心得(5) - 新版的streamPublish

2009年6月11日 星期四

Loader跨網域讀取圖檔,以及讀取Picasa的限制


Loader在跨網域讀取圖檔基本上是不需要crossdomain policy的,只是純粹當個乖乖的DisplayObject是沒什麼問題的,但是如果一但需要使用BitmapData對它做draw的動作時,flash player的安全性原則會封鎖這個動作。

這個問題很常見,之前也遇到過好幾次,但是一直沒有白紙黑字記下來,所以搞得自己常常忘記。
基本上要避開這個問題會需要用到LoaderContext這個類別。

通常我們在使用Loader讀取圖片或swf時:
public function load(request:URLRequest, context:LoaderContext = null):void

第一個參數URLRequest一定要的,第二個LoaderContext一般來說我們常常省略不下。不過現在要解決上述的問題時,我們就需要用到它了。
將LoaderContext. checkPolicyFile設成true再帶入就ok。但前題是遠端網域那邊要有允許你crossdomain才行 ,不然的話依舊沒輒。


順帶一提跟Picasa有關的,當Loader在讀取Picasa相簿裡的大圖時,很奇怪的事會發生。
開發時都很正常,丟到FireFox上也可以跑,但是一但用IE(測試的版本是IE 6)就怎樣都會遇到http 404,可是網址copy出來直接用IE開就又讀得到。
後來才知道在IE裡Loader如果去讀Picasa裡尺寸大於800 pixels的圖檔就會這樣,這似乎是Picasa的限制,只對外提供最大尺寸為800的圖(只是我不懂為什麼只有IE會這樣...)。

總之要解決這個問題就只能在Picasa大圖的網址後面加上「?imgmax=800」就好了。

2009年6月9日 星期二

URLLoader取得的bytesLoaded有可能大於bytesTotal!?


無意中發現了這一個很奇怪但是我目前為止無法解釋的現象。
我現在並不認為這是URLLoader的「Bug」,因為我覺得這種情況是有點複雜的,也許並不完全是URLLoader的問題。


情況如下:
今天手癢想寫個類別把我自己在Picasa相簿裡的一些照片資訊取出,讓自己以後可以方便編寫相簿瀏覽的介面。
因為在本機開發還不需要顧慮到crossdomain的問題,所以一開始我是直接取用Picasa的RSS,起初都還挺順利的,RSS的解析也都寫得差不多了,但是當我改讀另一個照片比較多的相簿時,就發現要將URLLoader.data給轉型成XML時一直出錯。
這個RSS的URL如下:
http://picasaweb.google.com/data/feed/base/user/jason.tseng76/albumid/5243914003216812001?alt=rss&kind=photo&hl=zh_TW

第一個反應就是,會不會是RSS的檔太大了? 導致RSS在還沒被完全讀取完全之前URLLoader的COMPLETE事件就被觸發了?
所以我就多監聽了一下ProgressEvent.PROGRESS事件,結果就很有趣了,trace出來的結果是bytesLoaded的值居然比bytesTotal還大。就看著ProgressEvent硬生生的把破表的值給丟了出來。
我也試過把URLLoader.data的值給trace出來,但是可能真的太大了,每次trace就每次當。

於是我也只能再次懷疑是不是檔頭或什麼的東西造成了URLLoader的判別出錯,直接把URLLoader.data轉型成XML出問題恐怕一定是整個資料讀取不完全(或是讀到多的東西!!?)。
所以我只好改走Picasa專門提供給Flash使用的RSS(有crossdomain policy的路)。
http://code.google.com/intl/zh-TW/apis/picasaweb/reference.html#Flash

轉換過後原本RSS的URL會變成這樣:
http://photos.googleapis.com/data/feed/base/user/jason.tseng76/albumid/5243914003216812001?alt=rss&kind=photo&hl=zh_TW

再try一次。
過了!
但是bytesTotal永遠都是顯示為0…。
好吧… 只能說至少work了。
至於為什麼bytesTotal會是0? 我想這已經有點超出我知識的範圍了…。