2013-11-29 77 views
0

我正在尝试将Facebook集成应用到我的应用中。我使用以下代码登录。 在我登录后,当我注销时,应用程序从头开始全面重新启动,并且每次都需要权限。我只希望它在我第一次登录特定用户时要求获得许可。但它总是询问我何时退出并尝试使用Facebook按钮登录。ios登录并登录后的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; 
      [email protected]"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; 
[email protected]"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

那么我有几点建议。在这里你总是用登录界面打开FB会话。

[FBSession openActiveSessionWithAllowLoginUI:YES]; 

这并不是必须的。一旦您授权用户并获得了所需的权限,您就不再需要登录界面。那么你如何决定我的用户是否被授权?只要设法代表的用户没有登录登录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]; 
} 
+0

你说的是对的。但是,当我注销活动会话关闭。所以这再次发生。它一次又一次地要求许可。同样,在接受许可或跳过后,应用程序将重新启动,并且启动屏幕会显示为我上传的链接中的视频。 – Spidy

+0

如果你注销,它应该再次询问权限。否则如果userA注销和userB想要登录会发生什么。你的意思是说,用户B应该问用户A知道应用程序将访问什么数据或应用程序应该假设用户B也会给予权限 –

+0

主要问题是应用程序在获取数据后重新启动...这是登录我必须在facebook登录按钮上按两次... – Spidy