Facebook OAuth api登录问题

时间:2011-09-11 23:10:15

标签: facebook-graph-api facebook

我很难被Facebook API登录。我在网上找不到任何有用的东西。

我的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,并且只要我可以追踪它,我看不到任何看起来会导致{{1}的结果1}}变为真。

我等待,然后按下注销按钮,看看一些Facebook参数,以防异步需要发生,并且它们仍为空。

有人能看到我错过的东西吗?

1 个答案:

答案 0 :(得分:1)

网上有很少的例子说明了这是如何运作的,但是Facebook SDK与一个演示应用程序(DemoApp)一起发布,一旦你插入appId就可以运行。 (如果你没有插入appId值,它会在检查该值时被杀死。)

授权过程中发生的是 [facebook authorize:permissions] 被调用。 (权限不应该是零)

这会导致调用 [self authorize:permissions localAppId:nil] ,然后调用 [self authorizeWithFBAppAuth:YES safariAuth:YES] 。在该方法中,可以尝试三种连接到Facebook以进行授权的方式。

在每个异步方法中,应用程序委托是作为to 应用程序:(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。所以看起来现在正在发挥作用。