如何在iOS上获取Facebook访问令牌

36

我是iOS的初学者。我有以下代码:

[facebook authorize:nil delegate:self];
NSString *string1=[facebook accessToken];
NSLog(string1);

日志显示:miFOG1WS_7DL88g6d95Uxmzz7GCShsWx_FHuvZkmW0E.eyJpdiI6IjNZZkFBY1c5ZnBaMGEzOWM2RzNKbEEifQ.LNjl06lsOQCO9ArVARqff3Ur2XQHku3CMHDBKkpGg351EB33LGxVv96Hh5R860KDJL0cLq8QezSW0GovYxnhUucOwxlITV364sVKDXIzC3bAn9P_74r2Axl1SgOaTyMMkQ_aSQ2OWh-8d3Zn9BDt3pXVWzBLJ9I4XAosnw0GjuE

这个看起来太长了,不像是一个访问令牌,我读到它只应该有40个字符长。我错在哪里了?

10个回答

121

使用Facebook SDK的版本为2013年3月20日的v3.2.1。

NSString *fbAccessToken = [[[FBSession activeSession] accessTokenData] accessToken];

如果你更喜欢点语法,

NSString *fbAccessToken = [FBSession activeSession].accessTokenData.accessToken;

对于使用 Swift 的人;

var fbAccessToken = FBSession.activeSession().accessTokenData.accessToken

v4.1.0 SDK及以后版本更新

Objective-C

NSString *fbAccessToken = [FBSDKAccessToken currentAccessToken].tokenString;

Swift

var fbAccessToken = FBSDKAccessToken.currentAccessToken().tokenString

快速后续问题 - 这个令牌生成的是否是他们文档中描述的“长期”访问令牌?谢谢! - daspianist
我认为从本机客户端获得的所有令牌都被视为“长期”的。它唯一变成“短期”的可能是针对Web客户端。如果我说错了,请随时纠正我。您可以在此处阅读更多信息:https://developers.facebook.com/docs/facebook-login/access-tokens/ - Nur Iman Izam
什么是FBSession?我在哪里可以访问它? - Andrew K
2
对于Swift,语法为FBSDKAccessToken.currentAccessToken().tokenString。 - Amir
1
对于Swift 3,FBSDKAccessToken.current().tokenString - Ammar Mujeeb
显示剩余2条评论

8

如果你正在使用Facebook SDK,你可以使用FBSession对象来获取accessToken。 如果用户已经通过应用程序进行了身份验证并且你有一个活动的会话,请使用:

NSString * accessToken = [[FBSession activeSession] accessToken];

获取访问令牌。

这对我很有效。


2
abdus.me所建议的方法在3.2 SDK中已被弃用。访问accessToken的正确方式是由Nur Iman Izam提出的:if ([[FBSession activeSession] isOpen]) { NSString *fbAccessToken = [[[FBSession activeSession] accessTokenData] accessToken]; ... } - Rool Paap

4
您可以使用委托方法:
- (void)fbDialogLogin:(NSString *)token expirationDate:(NSDate *)expirationDate 

如需更多信息,请参考以下问题:Facebook访问令牌


1
我不确定长度,因为像这个问题中所示,它没有固定的长度。https://dev59.com/1G855IYBdhLWcg3wVikt - Sarah

4

针对SDK 4.0版本

NSString *fbAccessToken = [[FBSDKAccessToken currentAccessToken] tokenString];

4

对于Swift 1.2和FB SDK 4.1:

var fbAccessToken = FBSDKAccessToken.currentAccessToken().tokenString

3

适用于FacebookLogin(0.9.0)的Swift版本

import FacebookLogin

AccessToken.current?.tokenString

2
- (IBAction)facebookClick:(id)sender {

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

     [login logOut];

    login = [[FBSDKLoginManager alloc] init];


    login.loginBehavior = FBSDKLoginBehaviorWeb;
    [login logInWithReadPermissions:@[@"email"] fromViewController:self handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
        if (error)
        {
                 NSLog(@"Process error");
             //   [login logOut];
         } else if (result.isCancelled) {
             NSLog(@"Cancelled");
            // [login logOut];
         } else {
             NSLog(@"Logged in");
             [self getUserInformation];
         }
     }];
}

虽然这段代码片段或许解决了问题,但附加说明能够真正提高您的帖子质量。请记住,您回答问题不仅是为了当前的提问者,也为将来的读者解答问题,他们可能不知道为何您的代码是这样的。 - Claudia

1
请查看以下代码,以获取来自ACAccountStore的access_token:
ACAccountStore *accountStore = [[ACAccountStore alloc] init];
ACAccountType *accountType =  [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];
NSDictionary *FBOptions = [NSDictionary dictionaryWithObjectsAndKeys:FACEBOOK_APP_ID, ACFacebookAppIdKey,@[@"email"],ACFacebookPermissionsKey, nil];

[accountStore requestAccessToAccountsWithType:accountType options:FBOptions completion:
 ^(BOOL granted, NSError *error) {
     if (granted) {

         NSArray *facebookAccounts = [accountStore accountsWithAccountType:accountType];
         FBAccount = [facebookAccounts firstObject];
         NSLog(@"token :%@",[[FBAccount credential] oauthToken]);

     } else {
         //Error
         NSLog(@"error getting permission %@",error);
         if([error code]== ACErrorAccountNotFound){
             NSLog(@"Account not found. Please setup your account in settings app"); 
         }
         else {
             NSLog(@"Account access denied");
         }

     }
 }];

1

Swift 4(2018年)

FBSDKAccessToken.current().tokenString

0

对于需要使用 SDK 3.2.1 的 Swift 的人:

let token = FBSession.activeSession().accessTokenData.accessToken

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接