2011年4月14日 星期四

Facebook iOS SDK — 儲存Access Token

上一篇提到使用Facebook iOS SDK的範例,每次登入就會跳出一個授權頁,按了確認後才又回到App.來,這樣的設計對User會很惱人。主要是這個SDK沒有把Access Token紀錄下來。Javascript版會記錄到cookie,ActionScript版會記錄到ShareObject,而iOS版,可以手動記錄到NSUserDefaults。

稍微搜尋一下,可以找到這篇解法。剛好就是修改同一個sample而來的。不過修改的程式碼我這邊再補充完整一點:
打開DemoAppViewController.m,先在最上面加上
#define ACCESS_TOKEN_KEY @"fb_access_token"
#define EXPIRATION_DATE_KEY @"fb_expiration_date"
定義兩個Key的名稱,等等要儲存Access Token跟Expiration Date。接著找到fbDidLogin這個method,在最後面加上
[[NSUserDefaults standardUserDefaults] setObject:_facebook.accessToken forKey:ACCESS_TOKEN_KEY];
[[NSUserDefaults standardUserDefaults] setObject:_facebook.expirationDate forKey:EXPIRATION_DATE_KEY];
[[NSUserDefaults standardUserDefaults] synchronize];
就是登入完後把Access Token跟Expiration Date儲存起來。接著找到login這個method,把內容改成
_facebook.accessToken = [[NSUserDefaults standardUserDefaults] objectForKey:ACCESS_TOKEN_KEY];
_facebook.expirationDate = [[NSUserDefaults standardUserDefaults] objectForKey:EXPIRATION_DATE_KEY];

if(![_facebook isSessionValid])
{
  [_facebook authorize:_permissions delegate:self];
}else{
  [self fbDidLogin];
}
這段就是把之前存的Access Token跟Expiration Date抓出來給_facebook,然後用
[_facebook isSessionValid]
檢查這樣Session能不能用,不能用的話就去要授權,能用的話就直接執行登入後的動作。而登出後我們也應該手動清除這兩個資料,所以找到fbDidLogout,在最後面加上
[[NSUserDefaults standardUserDefaults] setObject:nil forKey:ACCESS_TOKEN_KEY];
[[NSUserDefaults standardUserDefaults] setObject:nil forKey:EXPIRATION_DATE_KEY];
[[NSUserDefaults standardUserDefaults] synchronize];
這樣就行啦!還有一個重點就是permissions記得要跟user要offline_access,這樣可以讓Expiration Date長達4001/1/1,就不怕Access Token過期啦。這樣改了以後,如果之前登入過,按下Login之後就不會跳授權頁,而是直接進入登入後的狀態。實際的App.裡面就是找適當的時機去呼叫login method囉。

沒有留言:

張貼留言