2015-10-29 63 views
4

我正在使用facebook sdk 4.7,我需要檢查accesstoken是否已過期。檢查accesstoken是否已過期Facebook SDK 4.7 ios

FBSDKAccessToken *access_token = [FBSDKAccessToken currentAccessToken]; 
    if (access_token != nil) { 
     //user is not logged in 

     //How to Check if access token is expired? 
     if ([access_token isExpired]) { 
      //access token is expired ...... 
      // 
     } 
    } 

如果我成功,我必須再次登錄用戶。

SDK提供expiration_date.how可以幫助嗎?該設備可能有錯誤的日期。

+0

您可以從網絡獲取當前日期和時間,並根據該日期和時間做出此決定。 – Adeel

回答

0

檢查Facebook的許可.. &給予許可......如果允許存在,則自動獲得的accessToken其他明智索要登錄...

對於斯威夫特

var login: FBSDKLoginManager = FBSDKLoginManager() 
login.logInWithReadPermissions(["public_profile", "email"], handler: { (result:FBSDKLoginManagerLoginResult!, error:NSError!) -> Void in 

    if (error != nil) 
    { 
     //Process error 
    } 
    else if result.isCancelled 
    { 
     //Handle cancellations 
    } 
    else 
    { 
     // If you ask for multiple permissions at once, you 
     // should check if specific permissions missing 
     if result.grantedPermissions.contains("email"){ 
      //Do work 
    } 
    } 
    }) 

爲目的c:

check像這樣的權限。下面的代碼使用..

if ([[FBSDKAccessToken currentAccessToken]hasGranted:@"email"]) 
     { 
      // add your coding here after login call this block automatically. 
     } 
     else 
     { 

    //login code **//if accesstoken expired...then call this block** 

    FBSDKLoginManager *loginManager = [[FBSDKLoginManager alloc] init]; 

    [loginManager logInWithReadPermissions:@[@"public_profile", @"email"] handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) 




     }]; 

     } 
+0

確實'hasGranted'確保訪問令牌未過期?您能否給我提供您的信息源? – mmrayyan

+0

如果訪問令牌過期則請求登錄 –

7

假設用戶已經登錄與Facebook之前,有[FBSDKAccessToken currentAccessToken] != nil(我不打算進入細節在這裏,因爲通過FB登錄是另一回事)。

在我的應用程序中,我執行以下操作來確保FB訪問令牌始終有效並與我的應用程序服務器同步。

爲了簡單起見,所有的代碼下面是AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    // ... 

    /** 
     Add observer BEFORE FBSDKApplicationDelegate's 
     application:didFinishLaunchingWithOptions: returns 

     FB SDK sends the notification at the time it 
     reads token from internal cache, so our app has a chance 
     to be notified about this. 
    */ 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(fbAccessTokenDidChange:) 
               name:FBSDKAccessTokenDidChangeNotification 
               object:nil]; 

    return [[FBSDKApplicationDelegate sharedInstance] application: application didFinishLaunchingWithOptions: launchOptions]; 
} 

- (void)fbAccessTokenDidChange:(NSNotification*)notification 
{ 
    if ([notification.name isEqualToString:FBSDKAccessTokenDidChangeNotification]) { 

     FBSDKAccessToken* oldToken = [notification.userInfo valueForKey: FBSDKAccessTokenChangeOldKey]; 
     FBSDKAccessToken* newToken = [notification.userInfo valueForKey: FBSDKAccessTokenChangeNewKey]; 

     NSLog(@"FB access token did change notification\nOLD token:\t%@\nNEW token:\t%@", oldToken.tokenString, newToken.tokenString); 

     // initial token setup when user is logged in 
     if (newToken != nil && oldToken == nil) { 

      // check the expiration data 

      // IF token is not expired 
      // THEN log user out 
      // ELSE sync token with the server 

      NSDate *nowDate = [NSDate date]; 
      NSDate *fbExpirationDate = [FBSDKAccessToken currentAccessToken].expirationDate; 
      if ([fbExpirationDate compare:nowDate] != NSOrderedDescending) { 
       NSLog(@"FB token: expired"); 

       // this means user launched the app after 60+ days of inactivity, 
       // in this case FB SDK cannot refresh token automatically, so 
       // you have to walk user thought the initial log in with FB flow 

       // for the sake of simplicity, just logging user out from Facebook here 
       [self logoutFacebook]; 
      } 
      else { 
       [self syncFacebookAccessTokenWithServer]; 
      } 
     } 

     // change in token string 
     else if (newToken != nil && oldToken != nil 
      && ![oldToken.tokenString isEqualToString:newToken.tokenString]) { 
      NSLog(@"FB access token string did change"); 

      [self syncFacebookAccessTokenWithServer]; 
     } 

     // moving from "logged in" state to "logged out" state 
     // e.g. user canceled FB re-login flow 
     else if (newToken == nil && oldToken != nil) { 
      NSLog(@"FB access token string did become nil"); 
     } 

     // upon token did change event we attempting to get FB profile info via current token (if exists) 
     // this gives us an ability to check via OG API that the current token is valid 
     [self requestFacebookUserInfo]; 
    } 
} 

- (void)logoutFacebook 
{ 
    if ([FBSDKAccessToken currentAccessToken]) { 
     [[FBSDKLoginManager new] logOut]; 
    } 
} 

- (void)syncFacebookAccessTokenWithServer 
{ 
    if (![FBSDKAccessToken currentAccessToken]) { 
     // returns if empty token 
     return; 
    } 

    // BOOL isAlreadySynced = ... 
    // if (!isAlreadySynced) { 
     // call an API to sync FB access token with the server 
    // } 
} 

- (void)requestFacebookUserInfo 
{ 
    if (![FBSDKAccessToken currentAccessToken]) { 
     // returns if empty token 
     return; 
    } 

    NSDictionary* parameters = @{@"fields": @"id, name"}; 
    FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:@"me" 
                    parameters:parameters]; 

    [request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { 
     NSDictionary* user = (NSDictionary *)result; 
     if (!error) { 
      // process profile info if needed 
     } 
     else { 
      // First time an error occurs, FB SDK will attemt to recover from it automatically 
      // via FBSDKGraphErrorRecoveryProcessor (see documentation) 

      // you can process an error manually, if you wish, by setting 
      // -setGraphErrorRecoveryDisabled to YES 

      NSInteger statusCode = [(NSString *)error.userInfo[FBSDKGraphRequestErrorHTTPStatusCodeKey] integerValue]; 
      if (statusCode == 400) { 
       // access denied 
      } 
     } 
    }]; 
} 

每次你認爲這是檢查FB令牌好時機(例如一個應用程序在後臺了一段時間),撥打-requestFacebookUserInfo時間。這將提交Open Graph請求,並在令牌無效/過期時返回錯誤。

相關問題