В моем новом приложении для 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";
}
Да, это помогло. Теперь, когда сеанс открыт, я больше не получаю экран экрана входа/авторизации. Другое дело - что, если я хочу войти в систему с использованием другого пользователя - как я могу выйти из системы или убить текущий сеанс –
[FBSession.activeSession closeAndClearTokenInformation]; – nerowolfe
Две вещи в коде, который вы опубликовали - 1. FBSession.activeSession.isOpen: это означает, что мы проверяем, активен ли сеанс, а затем только внутри. Разве мы не должны проверять «если сеанс неактивен»? 2. «allowLoginUI: YES» и «allowLoginUI: NO» - каково влияние этого? –