2011-04-06 60 views
19

正如facebook-ios-sdk自述文件中所述,我的應用程序在執行任何API調用之前調用Facebook#authorize:delegate:。Facebook iOS SDK是否需要用戶在每次使用應用程序時進行身份驗證?

此方法要求用戶進行身份驗證(在Facebook應用程序或Safari中),然後將控制權下放回我的iPhone應用程序。問題是每次我調用方法時都會要求用戶進行身份驗證。如果他們已經向我的應用授予了許可,他們會收到一條消息,說該應用已獲得授權,他們必須按Okay才能返回到我的應用。它看起來不太專業。

所以我有兩個問題:

  1. 是否用戶總是爲了讓Facebook呼籲重新授權?我一直認爲它會將訪問令牌保存在某個地方,可能是用戶默認的,這樣你就不需要重新授權。

  2. 如果用戶不必每次重新授權,是否有方法檢查我的應用程序是否已具有權限,因此用戶不必看到該消息並按下好?

+0

你我必須自己保存accessToken和expirationDate。檢查我的答案的代碼。 – 2011-04-21 19:54:50

回答

23

很遺憾,Facebook SDK不會自動爲我們處理它。除了構建它到SDK自己,最簡單的方法是這樣:

每次分配_facebook時間:

_facebook = [[Facebook alloc] initWithAppId:@"SuperDuperAppID"]; 
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
NSString *accessToken = [prefs stringForKey:@"facebook-accessToken"]; 
NSString *expirationDate = [prefs stringForKey:@"facebook-expirationDate"]; 
_facebook.accessToken = accessToken; 
_facebook.expirationDate = expirationDate; 

如果你從來沒有在保存NSUserDefaults的東西,然後零值將被設置。什麼都沒有發生。否則,將設置真值,並且[_facebook isSessionValid];應該返回TRUE,表示良好的值。繼續進行Facebook SDK調用,就好像他們已經登錄(他們是)。如果爲假,請致電

[facebook authorize:permissions delegate:self]; 

照常。

然後確保支持以下Facebook的委託方法:

- (void)fbDidLogin { 
NSString *accessToken = _facebook.accessToken; 
NSString *expirationDate = _facebook.expirationDate; 
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
[prefs setObject:accessToken forKey:@"facebook-accessToken"]; 
[prefs expirationDate forKey:@"facebook-expirationDate"]; 
[prefs synchronize]; 
} 

我在我的應用程序使用此代碼,它完美的作品。我從內存中完成了這個工作,所以如果在複製和粘貼時不起作用,我表示歉意。某處可能有錯誤輸入,加上不正確的內存管理。不要忘記,除非獲得脫機權限,否則訪問令牌會過期。在任何情況下,上面的代碼處理一切。

+0

謝謝Daniel。我讀過,默認的到期日期只有登錄後的24小時。這是你的經歷嗎? – Bill 2011-04-21 21:45:05

+2

事實上,24小時,但我幾乎總是要求「offline_access」權限,它授予它無窮無盡的有效期限(禁止用戶手動拒絕權限)。 – 2011-04-21 22:00:15

+0

我明白了。我只需要登錄photos.upload操作。如果我請求offline_access並存儲該令牌,那會起作用嗎?我認爲offline_access嚴格適用於只讀數據,但我可能是錯的。 – Bill 2011-04-21 22:15:20

2

1)不,我不得不這樣做Facebook *fbConnect = [[Facebook alloc] init]; [fbConnect logout:self];來獲取用戶會話遠

2)我想你可以調用accestoken在Facebook.m檢查

4

當用戶登錄時,你會得到一個訪問令牌和一個失效日期。保存訪問令牌,只要尚未達到有效日期,您可以重新使用它。 Facebook SDK有一個方法來做這個檢查:[fbConnect isSessionValid],但它似乎有時會產生誤報,所以如果請求失敗,我有用戶登錄。

6

問題是它會要求用戶每次撥打 方法時都需要進行身份驗證 。如果他們已經向我的應用授予 權限,他們會收到一條 消息,指出該應用已獲得授權,並且必須按Okay 才能返回到我的應用。

1)用戶是否總是要 重新授權才能使Facebook 調用?我一直認爲它會在某處存儲訪問令牌 ,也許在 這個用戶默認值,這樣你就不需要重新授權了 。

不必經過工藝符號的原因,每次的是,在首次成功簽約後,Facebook的SDK不保存訪問令牌以靜態方式

2)如果用戶不必 重新授權每一次,有沒有辦法 檢查,如果我的應用程序已經有 權限,因此用戶不必 看到消息,然後按好的?

Facebook SDK不保存訪問令牌的事實並不意味着你不能自己做。以下代碼說明如何從NSUserDefaults保存/檢索訪問令牌。

-(void)login { 
    // on login, use the stored access token and see if it still works 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    facebook.accessToken = [defaults objectForKey:ACCESS_TOKEN_KEY]; 
    facebook.expirationDate = [defaults objectForKey:EXPIRATION_DATE_KEY]; 

    // only authorize if the access token isn't valid 
    // if it *is* valid, no need to authenticate. just move on 
    if (![facebook isSessionValid]) { 
     NSArray * permissions = [NSArray arrayWithObjects:@"read_stream", @"offline_access", @"email", nil]; 
     [facebook authorize:permissions delegate:self]; 
    } 
} 

/** 
* Called when the user has logged in successfully. 
*/ 
- (void)fbDidLogin { 
    // store the access token and expiration date to the user defaults 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    [defaults setObject:facebook.accessToken forKey:ACCESS_TOKEN_KEY]; 
    [defaults setObject:facebook.expirationDate forKey:EXPIRATION_DATE_KEY]; 
    [defaults synchronize]; 
} 
+0

@albertamg這正是我如何做的,事情工作得很好,但我有一個問題,就是facebook使用單一登錄,這意味着如果我登錄到我的iPhone上的Facebook應用程序,我不會是否必須在其他應用中再次登錄?但是應用程序只能在fbDIdLogin方法中保存accesstoken和過期日期,並且只有在用戶在登錄頁面上輸入其憑據後才能調用這些方法,理想情況下用戶不需要輸入他的憑證,甚至他也不應該看到登錄頁面,他第一次看到的所有內容都是「允許訪問此應用程序」屏幕 – Yogesh 2011-04-21 21:17:42

+0

@yogesh這裏有兩件事:用戶登錄和用戶授權您的應用程序。正如你所說,Facebook使用單點登錄(至少是sdk的更新版本)。如果用戶已經登錄(在設備上),他/她仍然必須授權您的應用程序(如果他/她還沒有完成)。所以,如果用戶沒有登錄,他將被重定向到登錄頁面,然後重定向到授權頁面。如果用戶已經登錄,他將被直接重定向到授權頁面。 – albertamg 2011-04-22 11:39:28

+0

@albertamg感謝您的回覆,所以這就是發生了什麼,第一次用戶來我的應用程序,他看到一個登錄屏幕,他必須輸入他的憑據,我想這不應該發生,因爲他已經登錄到手機上的Facebook應用程序,但是他必須授權應用程序,這很好,什麼在困擾着我,他爲什麼要登錄即使他已登錄Facebook應用程序 – Yogesh 2011-04-22 18:43:15

0

這裏是@Daniel Amitay答案的更實際的辦法:
鑑於控制器登錄按鈕,你寫

//saving user data to user defaults in order to support Facebook SSO 
let token = FBSDKAccessToken.currentAccessToken() 
let prefs = NSUserDefaults.standardUserDefaults() 
let nsdataToken = NSKeyedArchiver.archivedDataWithRootObject(token) 
prefs.setObject(nsdataToken, forKey: "facebook-AccessToken") 
prefs.synchronize() 

在AppDelegate的文件func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool 你寫以下

//restoring Facebook SSO session from user defaults 
let prefs = NSUserDefaults.standardUserDefaults() 
if let nsdataToken = prefs.valueForKey("facebook-AccessToken") as? NSData { 
    let token = NSKeyedUnarchiver.unarchiveObjectWithData(nsdataToken) as! FBSDKAccessToken 
    FBSDKAccessToken.setCurrentAccessToken(token) 
} 
相關問題