iOS:通过自动登录获取 Facebook 访问令牌
Posted
技术标签:
【中文标题】iOS:通过自动登录获取 Facebook 访问令牌【英文标题】:iOS: Get Facebook Access Token with Auto-Login 【发布时间】:2015-12-26 04:02:21 【问题描述】:我在我的应用程序中使用 Parse 和 Facebook 进行帐户管理。每当用户通过 facebook 按钮登录时,我的代码都能完美运行,因为 facebook sdk 会自动生成一个新的访问令牌。但是,如果我使用自动登录代码检查用户是否已批准该应用程序,我没有访问令牌,也无法访问该用户的 Facebook 数据。我不知道如何为已经同意使用我的应用的用户请求访问令牌。
加载数据:
- (void)_loadData :(BOOL)updateData
NSLog(@"entered _loadData");
NSMutableDictionary* userInfoParams = [NSMutableDictionary dictionary];
[userInfoParams setValue:@"id,name,email,gender" forKey:@"fields"];
if([FBSDKAccessToken currentAccessToken])
NSLog(@"Expiration date of token: %@", [[FBSDKAccessToken currentAccessToken] expirationDate]);
else NSLog(@"No access token");
FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphpath:@"me" parameters:userInfoParams];
[request startWithCompletionHandler:^(FBSDKGraphRequestConnection* connection, id result, NSError* error)
if(!error)
...
自动登录系统:
(void)viewDidAppear:(BOOL)animated
if ([PFUser currentUser] || [PFFacebookUtils isLinkedWithUser:[PFUser currentUser]])
NSLog(@"Yes");
[self _loadData:YES];
[self transitionToLoginSegue:(id)self];
else NSLog(@"No");
此外,当用户单击登录按钮时我收到的访问令牌持续 4 周,所以如果有办法手动分配访问令牌,那么我可以这样做,但是 [FBSDKAccessToken currentAccessToken]
是不可分配的,所以我也做不到。
【问题讨论】:
你的意思是一次登录。例如,如果用户第一次成功登录,那么它不应该要求登录吗? 第一次登录成功时请存储bool值yes,然后每次检查bool valye,如果是请转到下一页否则显示登录屏幕。 问题是如果我没有先收到访问令牌,我就无法访问他的朋友等个人数据。目前我所知道的接收它的唯一方法是强迫用户不断地通过 Facebook 去批准该应用程序 抱歉一再询问。我在你问之前这样做了,你调用这个函数(-(IBAction)loginWithFacebook:(id)sender) 来获取用户朋友数据吗?我将在答案中更新下面的代码。请提出任何问题。 我刚刚意识到我在自动登录系统中复制了错误的代码。您之前看到的是当用户使用 facebook 按钮单击登录时会发生什么。viewDidAppear
中的这段代码使自动登录工作,但没有给我访问令牌。
【参考方案1】:
这是我下面的代码,
if ([self check_network])
START_LOAD;
FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
[login
logInWithReadPermissions: @[@"public_profile",@"email",@"user_friends"]
fromViewController:self
handler:^(FBSDKLoginManagerLoginResult *result, NSError *error)
if (error)
STOP_LOAD;
NSLog(@"Process error");
NSLog(@"%@",error);
TOAST_FOR_TRY_AGAIN;
/*
UIAlertView *alert=[[UIAlertView alloc] initWithTitle:@"Please Try Again"
message:nil
delegate:self
cancelButtonTitle:@"Ok"
otherButtonTitles: nil];
[alert show];
*/
else if (result.isCancelled)
STOP_LOAD;
NSLog(@"Cancelled");
else
NSLog(@"Logged in");
NSLog(@"Result=%@",result);
[[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:@ @"fields": @"id,first_name,middle_name,last_name,name,picture,email"]
startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error)
NSLog(@"Facebook result=%@",result);
if (!error)
[NSUSER setObject:result forKey:@"user_info"];
[NSUSER setObject:[result objectForKey:@"name"] forKey:@"skip_name"];
[NSUSER synchronize];
API_CALL_ALLOC(ls_apicall);
[ls_apicall Login: STRING([result objectForKey:@"id"])];
else
STOP_LOAD;
NSLog(@"An error occurred getting friends: %@", [error localizedDescription]);
];
];
else
TOAST(TOAST_NETWORK_ERROR);
【讨论】:
当我使用FBSDKLoginManager
时,用户的应用权限请求屏幕会在应用启动后自动打开,因此它无法解决任何问题,因为我想绕过它。以上是关于iOS:通过自动登录获取 Facebook 访问令牌的主要内容,如果未能解决你的问题,请参考以下文章
Android Facebook通过访问令牌获取登录的电子邮件地址
Facebook Phonegap 插件 - 能够登录(似乎)但无法获取访问令牌