可以將 AppKey 和 AppSecret 放到一個檔案裡,再載入。URL-encoded 的文字檔是個選擇,為了讓本篇看起來有深度點(誤),在此採用SWF。若要更有深度可以用ZIP、DOC...,也可以修改副檔名偽裝一下。
若可以載入 Key 檔,表示是在開發過程,必須連一下 Facebook 取得 Session。若無法載入 Key 檔,表示己經發佈了。
Step 1: 製作 Key 檔,如下的類別檔,用FlashDevelop搭Flex編譯成SWF
package
{
import flash.display.Sprite;
public class FbastutorialKey extends Sprite
{
public static var appapikey:String = '::AppKey::';
public static var appsecret:String = '::AppSecret::';
}
}Step 2: 將 AppKeyLoader 和 SessionGetter 複製到專案裡。AppKeyLoader 是載入 Key 檔,若有取得 Keys,丟出個 complete 事件;若沒取得,丟出個 ioError 事件。SessionGetter會使用AppKeyLoader,依 Keys 取得的方式,做不用的處理,丟出個 connect 事件。接到 connect 事件再去拿 facebookSession 或 facebook 物件即可。
package lin.shinder.facebook.utils
{
import flash.display.Loader;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.IOErrorEvent;
import flash.net.URLRequest;
import flash.system.ApplicationDomain;
import flash.system.LoaderContext;
import flash.utils.getDefinitionByName;
[Event(name="complete", type="flash.events.Event")]
[Event(name="ioError", type="flash.events.IOErrorEvent")]
/**
* ...
* @author shinder.lin
* @date 2010/03/28
*/
public class AppKeyLoader extends EventDispatcher
{
private var loader:Loader;
private var loaderContext:LoaderContext;
private var request:URLRequest;
private var keyClassName:String;
private var _appapikey:String;
private var _appsecret:String;
private var _loaded:Boolean;
public function AppKeyLoader(keyClassName:String) {
this.keyClassName = keyClassName;
loader = new Loader;
loaderContext = new LoaderContext;
loaderContext.applicationDomain = ApplicationDomain.currentDomain;
request = new URLRequest(keyClassName + ".swf");
loader.load(request, loaderContext);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, eventHandler);
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, eventHandler);
}
private function eventHandler(event:Event):void {
if (event.type == Event.COMPLETE) {
var KeyClass:Class = getDefinitionByName(keyClassName) as Class;
_appapikey = KeyClass.appapikey;
_appsecret = KeyClass.appsecret;
_loaded = true;
} else
if (event.type == IOErrorEvent.IO_ERROR) {
_loaded = false;
}
dispatchEvent(event);
}
public function get appapikey():String {
return _appapikey;
}
public function get appsecret():String {
return _appsecret;
}
public function get loaded():Boolean {
return _loaded;
}
}
}package lin.shinder.facebook.utils
{
import com.facebook.Facebook;
import com.facebook.events.FacebookEvent;
import com.facebook.utils.FacebookSessionUtil;
import flash.display.LoaderInfo;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.IOErrorEvent;
import flash.net.URLRequest;
import flash.net.navigateToURL;
import mx.controls.Alert;
import mx.core.FlexGlobals;
import spark.components.Application;
[Event(name="connect", type="com.facebook.events.FacebookEvent")]
/**
* ...
* @author shinder.lin
* @date 2010/03/28
*/
public class SessionGetter extends EventDispatcher
{
private var session:FacebookSessionUtil;
private var appKeyLoader:AppKeyLoader;
private var application:Application;
private var loaderInfo:LoaderInfo;
public function SessionGetter(keyClassName:String) {
application = Application(FlexGlobals.topLevelApplication);
loaderInfo = application.loaderInfo;
appKeyLoader = new AppKeyLoader( keyClassName );
appKeyLoader.addEventListener(Event.COMPLETE, getSessionBySWFKey);
appKeyLoader.addEventListener(IOErrorEvent.IO_ERROR, getSessionByURLKey);
}
private function getSessionBySWFKey(event:Event):void {
var appapikey:String = appKeyLoader.appapikey;
var appsecret:String = appKeyLoader.appsecret;
session = new FacebookSessionUtil(appapikey, appsecret, loaderInfo);
session.addEventListener(FacebookEvent.WAITING_FOR_LOGIN, whenWaitingForLogin);
session.addEventListener(FacebookEvent.CONNECT, onSessionConnect);
session.login();
}
private function whenWaitingForLogin(event:FacebookEvent):void {
var alert:Alert = Alert.show("登入 Facebook 後點按 OK!","登入");
alert.addEventListener(Event.CLOSE, onAlertClosed);
}
private function onAlertClosed(event:Event):void {
session.validateLogin();
}
private function getSessionByURLKey(event:Event):void {
var appapikey:String = loaderInfo.parameters.fb_sig_api_key;
var appsecret:String = null;
session = new FacebookSessionUtil(appapikey, appsecret, loaderInfo);
session.addEventListener(FacebookEvent.WAITING_FOR_LOGIN, whenWaitingForLogin);
session.addEventListener(FacebookEvent.CONNECT, onSessionConnect);
if(loaderInfo.parameters.fb_sig_added == true){
session.verifySession();
} else if(loaderInfo.parameters.fb_sig_added == false){
navigateToURL(new URLRequest("http://www.facebook.com/login.php?api_key="+appapikey),"_top");
} else {
session.login();
}
}
private function onSessionConnect(event:FacebookEvent):void {
dispatchEvent(event);
}
public function get facebookSession():FacebookSessionUtil{
return session;
}
public function get facebook():Facebook{
return session.facebook;
}
}
}
Step 3: 接著使用起來就很方便了。
private function init():void {
sessionGetter = new SessionGetter("FbastutorialKey");
sessionGetter.addEventListener(FacebookEvent.CONNECT, onSessionConnect);
}
private function onSessionConnect(event:FacebookEvent):void {
facebook = sessionGetter.facebook;
var call:FacebookCall = facebook.post( new GetFriends() );
call.addEventListener(FacebookEvent.COMPLETE, onGetFriendsComplete);
}原始檔同樣在此按右鍵→View Source。Step 4: 發佈時,記得不要把 Key 檔放上去。
沒有留言:
張貼留言