Проблемы с входом в Facebook OAuth api - PullRequest
0 голосов
/ 12 сентября 2011

Я зашел в тупик API Facebook для входа в систему. Я не могу найти ничего полезного в сети.

Мои методы FBSessionDelegate не вызываются, а значения accessToken и expirationDate не устанавливаются, поэтому я не думаю, что я когда-либо входил в систему.

Я вернулся к очень простому приложению, содержащему только две кнопки (вход, выход из системы) и метку для просмотра информации о состоянии.

Вот код для контроллера представления, где происходит вся обработка:

// 
#import <UIKit/UIKit.h>
#import "Facebook.h"

@interface facebook_login_testViewController : UIViewController <FBSessionDelegate>{

    UIButton *loginButton;
    UIButton *logoutButton;
    UILabel *info;

    Facebook *facebook;

}

@property (nonatomic, retain) Facebook *facebook;

- (void) loggingIn;
- (void) loggingOut;

@end

и

#import "facebook_login_testViewController.h"

@implementation facebook_login_testViewController
@synthesize facebook;

- (void)dealloc
{
    [super dealloc];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];

    loginButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [loginButton setTitle: @"Log In" forState:UIControlStateNormal];
    [loginButton addTarget:self action:@selector(loggingIn) forControlEvents:UIControlEventTouchUpInside];
    loginButton.frame = CGRectMake(200, 200, 200, 50);

    logoutButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [logoutButton setTitle: @"Log Out" forState:UIControlStateNormal];
    [logoutButton addTarget:self action:@selector(loggingOut) forControlEvents:UIControlEventTouchUpInside];
    logoutButton.frame = CGRectMake(200, 300, 200, 50);

    info = [[UILabel alloc] initWithFrame:CGRectMake(200, 400, 400, 600)];
    info.numberOfLines = 0;

    [self.view addSubview:loginButton];
    [self.view addSubview:logoutButton];
    [self.view addSubview:info];

    info.text = @"Waiting to log in...\n\nPress the login button.";

    facebook = [[Facebook alloc] initWithAppId:@"159...........5" andDelegate:self];

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    if ([defaults objectForKey:@"FBAccessTokenKey"] 
        && [defaults objectForKey:@"FBExpirationDateKey"]) {
        facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"];
        facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"];
    }

}


- (void)viewDidUnload
{
    [super viewDidUnload];        
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return YES;
}

- (void) loggingIn{
    if (![facebook isSessionValid]) {
        [facebook authorize:nil];
    }
}

- (void) loggingOut{
    info.text = [NSString stringWithFormat:@"\naccess token: %@\nexpiration date: %@\nfacebood description:%@\n",facebook.accessToken, facebook.expirationDate, facebook];
    [facebook logout:self];

}

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {

    return [facebook handleOpenURL:url]; 
}

- (void)fbDidLogin {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:[facebook accessToken] forKey:@"FBAccessTokenKey"];
    [defaults setObject:[facebook expirationDate] forKey:@"FBExpirationDateKey"];
    [defaults synchronize];

}

@end

Файл .plist настроен так

enter image description here

Это действительно выглядит слишком просто, чтобы ошибиться. Когда я нажимаю кнопку входа в систему, я могу проследить через authorize:permission, а затем authorize:permissions localAppId:localAppId, и, насколько я могу отследить, я не вижу ничего похожего на то, что isSessionValid станет ИСТИНОЙ.

Я жду, а затем нажимаю кнопку выхода из системы и смотрю на некоторые параметры Facebook, на случай, если что-то должно произойти асинхронно, и они все еще равны нулю.

Может кто-нибудь увидеть, чего мне не хватает?

1 Ответ

1 голос
/ 12 сентября 2011

В сети есть несколько примеров, показывающих, как это работает, но Facebook SDK распространяется с демонстрационным приложением (DemoApp), которое работает, когда вы подключаете appId.(Если вы не включите значение appId, оно будет убито при проверке этого значения.)

В процессе авторизации происходит следующее: [facebook authorize: permissions] называется.(разрешения не должны быть равны нулю)

Это приводит к вызову [self authorize: permissions localAppId: nil] , который затем вызывает [self authorizeWithFBAppAuth: YES safariAuth: YES].В этом методе можно попробовать три способа подключения к Facebook для авторизации.

В каждом из этих асинхронных методов делегат приложения является делегатом, который обрабатывает полученный обратный вызов как часть приложения : (UIApplication *) приложение handleOpenURL: (NSURL *) url .Если это было упомянуто в других онлайн-уроках, это легко пропустить, потому что они, как правило, выполняют всю обработку внутри делегата приложения, из того, что я видел.В моем случае я выполнял основную обработку в контроллере основного представления.

В моем случае исправление состояло в том, чтобы переместить приложение: (UIApplication *) приложение handleOpenURL: (NSURL *) url метод для делегата приложения и указание его на объект facebook следующим образом:

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
  return [[controller facebook] handleOpenURL:url];
}

После этого были вызваны другие методы делегата facebook (fbDidLogin, fbDidLogout), и я получил accessToken и expirationDate.Похоже, сейчас это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...