2013-07-23 1 views
1

В моем новом приложении для iOS мне нужно войти в Facebook и получить информацию о пользователе. Я прочитал учебник здесь - http://developers.facebook.com/docs/tutorials/ios-sdk-tutorial/authenticate/ и изучил Scrumptious и другие образцы. Но я не могу понять поток.Подключение к Facebook в приложении iOS

Я создал образец проекта, чтобы сделать Facebook логин (код ниже) - но есть ниже главный вопрос:

  • Почему приложение запрашивает разрешение еще раз, когда я нажимаю на кнопку Вход - после того, как я нажимаю "OK" на Facebook раз

Ниже мой код -

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    // See if the app has a valid token for the current state. 
    if (FBSession.activeSession.state == FBSessionStateCreatedTokenLoaded) 
    { 
     // To-do, show logged in view --- LOGGED IN : Already Login 
     // Yes, so just open the session (this won't display any UX). 
     UIWindow *window = [UIApplication sharedApplication].keyWindow; 
     ViewController *rootViewController = (ViewController *)window.rootViewController; 
     [rootViewController openSession];   
    } 

    return YES; 
} 

- (BOOL)application:(UIApplication *)application 
      openURL:(NSURL *)url 
    sourceApplication:(NSString *)sourceApplication 
     annotation:(id)annotation 
{ 
    return [FBSession.activeSession handleOpenURL:url]; 
} 

- (void)applicationDidBecomeActive:(UIApplication *)application 
{ 
    [FBSession.activeSession handleDidBecomeActive]; 
} 


@implementation ViewController 

@synthesize lblStatus; 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    lblStatus.text = @"Login Now"; 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

- (IBAction)login:(id)sender 
{ 
    [self openSession]; 
} 

- (void)sessionStateChanged:(FBSession *)session 
         state:(FBSessionState) state 
         error:(NSError *)error 
{ 
    switch (state) { 
     case FBSessionStateOpen: 
     { 
      // Connection is Open 
      lblStatus.text = @"FBSessionStateOpen"; 
     } 
      break; 
     case FBSessionStateClosed: 
     case FBSessionStateClosedLoginFailed: 
     { 
      [FBSession.activeSession closeAndClearTokenInformation]; 

      // Connection is Closed/Login Failed 
      lblStatus.text = @"FBSessionStateClosed"; 
     } 
      break; 
     default: 
      break; 
    } 
} 

- (void)openSession 
{ 
    [FBSession openActiveSessionWithReadPermissions:nil 
             allowLoginUI:YES 
            completionHandler: 
    ^(FBSession *session, 
     FBSessionState state, NSError *error) 
    { 
     [self sessionStateChanged:session state:state error:error]; 
    }]; 
} 

ОТВЕТ ---->

Спасибо nerowolfe за предложения.

Ниже представлено мое полное решение для подключения к Facebook. Моя следующая задача - получить данные пользователя сейчас.

@implementation AppDelegate 

- (BOOL)application:(UIApplication *)application 
      openURL:(NSURL *)url 
    sourceApplication:(NSString *)sourceApplication 
     annotation:(id)annotation 
{ 
    return [FBSession.activeSession handleOpenURL:url]; 
} 

- (void)applicationDidBecomeActive:(UIApplication *)application 
{ 
    [FBSession.activeSession handleDidBecomeActive]; 
} 

-------------------------- 

@implementation ViewController 

@synthesize lblStatus; 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    lblStatus.text = @"Login Now"; 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

- (IBAction)login:(id)sender 
{ 
    [self openSession]; 
} 

- (void)sessionStateChanged:(FBSession *)session 
         state:(FBSessionState) state 
         error:(NSError *)error 
{ 
    switch (state) { 
     case FBSessionStateOpen: 
     { 
      // Connection is Open 
      lblStatus.text = @"FBSessionStateOpen"; 
     } 
      break; 
     case FBSessionStateClosed: 
     case FBSessionStateClosedLoginFailed: 
     { 
      [FBSession.activeSession closeAndClearTokenInformation]; 

      // Connection is Closed/Login Failed 
      lblStatus.text = @"FBSessionStateClosed"; 
     } 
      break; 
     default: 
      break; 
    } 
} 

- (void)openSession 
{ 
    if(FBSession.activeSession.isOpen) 
    { 
     [FBSession openActiveSessionWithReadPermissions:nil 
              allowLoginUI:NO 
             completionHandler: 
     ^(FBSession *session, 
      FBSessionState state, NSError *error) 
     { 
      [self sessionStateChanged:session state:state error:error]; 
     }]; 
    } 
    else 
    { 
     [FBSession openActiveSessionWithReadPermissions:nil 
              allowLoginUI:YES   
             completionHandler: 
     ^(FBSession *session, 
      FBSessionState state, NSError *error) 
     { 
      [self sessionStateChanged:session state:state error:error]; 
     }]; 
    } 
} 

- (IBAction)logout:(id)sender 
{ 
    [FBSession.activeSession closeAndClearTokenInformation]; 

    if(FBSession.activeSession.isOpen) 
     lblStatus.text = @"Open Still"; 
    else 
     lblStatus.text = @"Close"; 

} 

ответ

1

Только что не отображается LoginUI.

- (void)openSession 
{ 
if(FBSession.activeSession.isOpen) 
{ 

     [FBSession openActiveSessionWithReadPermissions:nil 
            allowLoginUI:NO 
           completionHandler: 
        ^(FBSession *session, 
         FBSessionState state, NSError *error) 
     { 
     [self sessionStateChanged:session state:state error:error]; 
     }]; 
    } 

} 
+0

Да, это помогло. Теперь, когда сеанс открыт, я больше не получаю экран экрана входа/авторизации. Другое дело - что, если я хочу войти в систему с использованием другого пользователя - как я могу выйти из системы или убить текущий сеанс –

+0

[FBSession.activeSession closeAndClearTokenInformation]; – nerowolfe

+0

Две вещи в коде, который вы опубликовали - 1. FBSession.activeSession.isOpen: это означает, что мы проверяем, активен ли сеанс, а затем только внутри. Разве мы не должны проверять «если сеанс неактивен»? 2. «allowLoginUI: YES» и «allowLoginUI: NO» - каково влияние этого? –

 Смежные вопросы

  • Нет связанных вопросов^_^