2013-11-29 88 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