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

时间:2013-11-29 05:59:16

标签: ios facebook authorization runtime-error

我正在尝试将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);

    }];

}

以下代码我已经习惯注销。

- (IBAction)Logout:(id)sender
{
_DetailsView.hidden=YES;
_fade.hidden=YES;
y=0;
Loggedin=@"N";
user=nil;
NSHTTPCookieStorage* cookies = [NSHTTPCookieStorage sharedHTTPCookieStorage];
NSArray* facebookCookies = [cookies cookiesForURL:[NSURL URLWithString:@"http://login.facebook.com"]];

for (NSHTTPCookie* cookie in facebookCookies) {
    [cookies deleteCookie:cookie];
}
[FBSession.activeSession closeAndClearTokenInformation];
[[NSUserDefaults standardUserDefaults]setObject:Loggedin forKey:@"token"];
[[NSUserDefaults standardUserDefaults]setObject:user forKey:@"user"];
[[NSUserDefaults standardUserDefaults]synchronize];
[self.navigationController popToRootViewControllerAnimated:YES];
}

这是我第一次整合Facebook。所以我对我正在使用的代码不太确定。 用户数据获取工作完全正常。问题是应用程序每次都要求权限,如果我按“确定”或“跳过”以获得权限,则当我单击“确定”或跳过时,两者都会重新启动应用程序。

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

http://youtu.be/ki7BXr8dXmw

我一直坚持这个,不能继续前进因为这个bug。 请帮我解决这个问题,当赏金可用时,我可以为解决方案提供50点赏金。

谢谢。

1 个答案:

答案 0 :(得分:1)

我的建议很少。在这里,您始终使用登录UI打开FB会话。

[FBSession openActiveSessionWithAllowLoginUI:YES];

这不是必须的。一旦您授权用户并获得了所需的权限,您就不再需要登录UI。那么你将如何决定我的用户是否获得授权?只需尝试代表没有登录UI的用户登录(后备登录)

[FBSession openActiveSessionWithAllowLoginUI:NO];  // Should go in viewDidLoad or applicationDidFinishLaunching 

如果此登录尝试成功(获取缓存的令牌),那么您有一个活跃的FBSession。现在实际的facebook api用法来了。做一个简单的检查

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