facebook isSessionValid总是NO

时间:2011-05-27 20:08:42

标签: iphone objective-c facebook-graph-api single-sign-on

嗨,我使用最新的facebook api和SSO,并在我的viewController中实现如下所示(如果有任何区别,不在appDelegate中,如示例中所示): 在我的.h文件中

Facebook *facebook;
@property (nonatomic,retain) Facebook *facebook;

在我的.m文件中,我在viewDidLoad

中执行以下操作
self.facebook = [[Facebook alloc] initWithAppId:@"myappID"];

我用另一种方法

if (![facebook isSessionValid]) {


NSArray *permissions =  [[NSArray arrayWithObjects:@"publish_stream",nil] retain];
[facebook authorize:permissions delegate:self];
}

但似乎isSessionValid总是没有 我不知道为什么! 有谁知道为什么? 哦,还有expirationDate和accessTokken都是零

2 个答案:

答案 0 :(得分:4)

昨天我遇到了同样的问题,看来你必须坚持并自己恢复访问令牌/到期日期。

在viewDidLoad中:

// Restore previously saved Facebook credentials (If any)
facebook.accessToken    = [[NSUserDefaults standardUserDefaults] stringForKey:@"FBAccessToken"];
facebook.expirationDate = (NSDate *) [[NSUserDefaults standardUserDefaults] objectForKey:@"FBExpirationDate"];

// Trigger SSO Facebook authentication if required
if ([facebook isSessionValid] == NO) {
    [facebook authorize:nil delegate:self];
} else {
    [self fbDidLogin];
}

然后在fbDidLogin委托中:

- (void)fbDidLogin

{     //保存用户访问令牌和到期日期,以便我们以后恢复     //这样我们就可以避免对Facebook进行不必要的身份验证。

[[NSUserDefaults standardUserDefaults] setObject:self.facebook.accessToken forKey:@"FBAccessToken"];
[[NSUserDefaults standardUserDefaults] setObject:self.facebook.expirationDate forKey:@"FBExpirationDate"];

// User has logged in to Facebook, now get their userId from Facebook
[facebook requestWithGraphPath:@"me" andDelegate:self];

}

所以现在用户必须登录/授权您的应用程序,从那时起,他们的会话将一直有效,直到他们退出Facebook。

答案 1 :(得分:4)

好的,这就是我的问题的答案。 正如我在评论中所说的应用程序:handleOpenURL:永远不会被调用! 因为我在我的ViewController中有这个方法,显然它必须在appDelegate!

所以在我的基于导航栏的应用程序中,我在appDelegate中执行了以下操作:

<。>文件中的

ViewController *viewController;
@property (nonatomic, retain) IBOutlet ViewController *viewController;
<。>文件中的

@synthesize viewController;

viewController = [[ViewController alloc]init];
[self.navigationController pushViewController:viewController animated:NO];

然后实现了这样的方法:

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

return [viewController.facebook handleOpenURL:url]; 
}

当然在我的ViewController中我做了@Tyler提到的所有事情(谢谢你) 一切都像魅力一样。 希望这可以帮助每个人解决同样的问题。