注销和登录时出现ios Facebook集成错误

注销和登录时出现ios Facebook集成错误,ios,facebook,authorization,runtime-error,Ios,Facebook,Authorization,Runtime Error,我正在尝试将Facebook集成到我的应用程序中。我使用以下代码登录。 在我登录和注销后,应用程序从一开始就完全重新启动,并且每次请求许可时都会重新启动。我只希望它在第一次使用特定用户登录时请求许可。但当我注销并尝试使用Facebook按钮重新登录时,它总是会询问 - (IBAction)facebook:(id)sender { FBLoginView *loginView=[[FBLoginView alloc]init]; loginView.delegate=self; loginVi

我正在尝试将Facebook集成到我的应用程序中。我使用以下代码登录。 在我登录和注销后,应用程序从一开始就完全重新启动,并且每次请求许可时都会重新启动。我只希望它在第一次使用特定用户登录时请求许可。但当我注销并尝试使用Facebook按钮重新登录时,它总是会询问

- (IBAction)facebook:(id)sender
{

FBLoginView *loginView=[[FBLoginView alloc]init];
loginView.delegate=self;
loginView.readPermissions = @[@"first_name",
                                   @"last_name",
                                   @"location",
                                   @"id",
                                   @"access_token",
                                   @"email"];
NSArray* permissions =  [NSArray arrayWithObjects: @"email", nil];
loginView.readPermissions = @[@"email"];
loginView.readPermissions=permissions;


    [FBSession openActiveSessionWithAllowLoginUI:YES];

[FBRequestConnection
 startForMeWithCompletionHandler:^(FBRequestConnection *connection,
                                   id<FBGraphUser> user1,
                                   NSError *error)
    {
        if (!error)
        {

            firstname=user1.first_name;
            lastname=user1.last_name;
            city=[user1.location objectForKey:@"name"];
            email=user1[@"email"];
            fbid=user1.id;
            Loggedin=@"Y";
            [[NSUserDefaults standardUserDefaults]setObject:Loggedin forKey:@"token"];
            [[NSUserDefaults standardUserDefaults]synchronize];
        }
        NSURL *url = [[NSURL alloc]initWithString:[NSString stringWithFormat:@"%@action=currfbuser&email=%@&fb_id=%@",MainURL,email,fbid ]];
        NSError *errors;
        NSData *data = [NSData dataWithContentsOfURL:url];
        NSDictionary *json = (NSDictionary *)[NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&errors];
        status = json[@"status"];
        user = json[@"user"];
        if ([status isEqualToString:@"success"])
        {
            [self performSegueWithIdentifier: @"LogIN" sender: self];
        }
        else if (!([fbid isEqualToString:@""]))
        {
            [self performSegueWithIdentifier: @"Facebooksegue" sender: self];
        }
        NSLog(@"%@",firstname);
        NSLog(@"%@",lastname);
        NSLog(@"%@",city);
        NSLog(@"%@",email);
        NSLog(@"%@",fbid);

    }];

}
这是我第一次整合Facebook。所以我对我使用的代码不是很确定。 用户数据提取工作非常正常。问题是,应用程序每次都会请求权限,如果我按“确定”或“跳过”以获取权限,则两者都会执行相同的操作,即当我单击“确定”或“跳过”时,应用程序会重新启动

我获得的输出已经上传到youtube上。请检查以下链接

我一直被这个问题困扰着,无法前进,因为这个错误。 请帮我做这件事,当赏金可用时,我可以为解决方案支付50赏金


谢谢。

我有几点建议。在这里,您总是使用登录UI打开FB会话

[FBSession openActiveSessionWithAllowLoginUI:YES];
这并不总是必需的。一旦您授权了用户并获得了所需的权限,您就不再需要登录UI。那么你将如何决定我的用户是否被授权??只需尝试代表用户登录,无需登录UI(回退登录)

如果此登录尝试成功(使用缓存令牌),那么您将有一个活动的
FBSession
。现在facebook api的实际使用情况已经出现了。做一个简单的检查

if (FBSession.activeSession.isOpen)
{
     [self getFacebookFriends];
}
else
{
     // User is not logged in
     [FBSession openActiveSessionWithAllowLoginUI:YES];
}

你说的是对的。但当我注销时,活动会话关闭。所以这种情况再次发生。它一次又一次地请求许可。另外,在接受许可或跳过后,应用程序将重新启动,启动屏幕显示为我在上面链接中上传的视频。如果您注销,它应再次请求许可。否则,如果userA注销而userB想要登录,将会发生什么情况。你的意思是说用户B应该让用户A知道应用程序将访问哪些数据,或者应用程序应该假设用户B也会给予许可。主要问题是,在获取数据后,应用程序正在重新启动。。。这是为了登录,我必须按两次facebook登录按钮…[FBSession openActiveSessionWithAllowLoginUI:NO];//应进入viewDidLoad或applicationDidFinishLaunching。对不起,我错过了这一行…我做了这一点,现在它的工作良好。。
[FBSession openActiveSessionWithAllowLoginUI:NO];  // Should go in viewDidLoad or applicationDidFinishLaunching 
if (FBSession.activeSession.isOpen)
{
     [self getFacebookFriends];
}
else
{
     // User is not logged in
     [FBSession openActiveSessionWithAllowLoginUI:YES];
}