iOS:通过自动登录获取Facebook访问令牌

iOS:通过自动登录获取Facebook访问令牌,ios,facebook,facebook-graph-api,parse-platform,pffacebookutils,Ios,Facebook,Facebook Graph Api,Parse Platform,Pffacebookutils,我在应用程序中使用Parse和Facebook进行帐户管理。无论用户何时通过facebook按钮登录,我的代码都能正常工作,因为facebook sdk会自动生成一个新的访问令牌。然而,如果我使用自动登录代码检查用户是否已经批准了该应用程序,我就没有访问令牌,也无法访问该用户的facebook数据。我不知道如何为已经同意使用我的应用程序的用户请求访问令牌 加载数据: - (void)_loadData :(BOOL)updateData { NSLog(@"entered _loadDa

我在应用程序中使用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]
是不可分配的,所以我也不能这样做。

这是我下面的代码

 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);
      }

你是说一次登录吗。例如,如果用户首次成功登录,则不应要求登录?请在首次成功登录时存储bool值yes,然后每次检查bool valye,如果是,请转到下一页,否则显示登录屏幕。问题是,如果我没有首先收到访问令牌,我无法访问个人数据,例如他的朋友。据我所知,在这一点上,唯一的接收方式是强迫用户不断地通过FaceBookCorry通过FaceBookCorry来批准应用程序,因为他们会一次又一次地询问。在那之前我做了这件事,我问,你是否调用这个函数((iAction)loginWithFacebook:(id)sender)来获取用户好友数据?我将更新下面的代码作为回答。请问任何问题。我刚刚意识到我在自动登录系统中输入了错误的代码。你们以前看到的是当用户点击facebook按钮登录时会发生什么。
viewDidAppear
中的这段代码使自动登录工作,但是没有给我访问令牌。当我使用
FBSDKLoginManager
时,应用程序启动后,用户的应用程序权限请求屏幕会自动打开,因此它不会解决任何问题,因为我想绕过它。