2011-05-11 101 views
2

我一直在寻找解决方案,似乎是一个简单的问题一段时间了,但没有运气。登录代码如下。facebook iphone sdk注销问题!

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

return [facebook handleOpenURL:url]; 
} 

- (void)applicationDidBecomeActive:(UIApplication *)application 
{ 
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 

    NSString *accessToken = [prefs stringForKey:@"facebook-accessToken"]; 
    NSDate *expirationDate = [prefs objectForKey:@"facebook-expirationDate"]; 
    facebook.accessToken = accessToken; 
    facebook.expirationDate = expirationDate; 
    if ([facebook isSessionValid]) { 
    NSLog(@"valid session"); 
} 
else { 
    NSLog(@"NOT VALID"); 
    [facebook authorize:nil delegate:self]; 
} 
} 

- (void)fbDidLogin { 
    NSLog(@"delegate method"); 
    NSString *accessToken = facebook.accessToken; 
    NSDate *expirationDate = facebook.expirationDate; 
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
    [prefs setObject:accessToken forKey:@"facebook-accessToken"]; 
    [prefs setObject:expirationDate forKey:@"facebook-expirationDate"]; 
    [prefs synchronize]; 
} 

我有我的RootViewController的和实型的属性按钮退出。我将facebook实例传递给rootViewController,然后尝试按如下方式注销。

-(IBAction) logout { 
    [facebook logout:self]; 

} 

- (void)fbDidLogout { 
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
    [prefs setObject:nil forKey:@"facebook-accessToken"]; 
    [prefs setObject:nil forKey:@"facebook-expirationDate"]; 
    [prefs synchronize]; 
} 

这种作品.....例如。当我不注销时,即使正确关闭应用程序,也可以重新启动应用程序(按住图标,然后按x),用户将无需执行任何操作即可登录。但是当我注销时,下次启动应用程序时,用户不会有机会重新输入登录详细信息,而只是获得一个Facebook页面,上面显示“您已经授权此应用程序使用Facebook”?

有没有人知道我是否正在讨论这个错误的方式,因为它现在真的很烦人?

非常感谢

+0

有你解决它 – 2011-06-03 12:31:56

+0

类似的情况在这里..从应用程序/ SDK的Facebook注销成功,但它在Safari插件会话还是......如果我再次请登录就说明已经登录仅仅只确认许可 – 2011-06-03 12:33:18

回答

2

用户可能并不需要,因为重新输入其凭据single sign-on

在更新后的SDK版本中,我们将 更改了授权机制,因此 用户不必再为其 重新输入 他们的凭证,以便 应用程序在他们想要的设备上授权 。

如果用户登录Facebook应用程序,他只会看到“您已经授权此应用程序使用Facebook”页面。

logout方法清除所有应用程序状态,并向发出服务器请求,使当前访问令牌无效。

注意,注销将不会撤销 应用程序的权限,但 简单地清除您的应用程序的 访问令牌。如果先前已经退出了自己的 应用程序返回的 用户,他只会 看到他的日志 到你的应用的通知,而不是一个 通知授予权限。

+0

感谢您的重新安装,但是我删除了所有其他使用FB的应用程序,并且问题仍然存在。我想要以下行为,如果这有帮助...第一次用户登录他们被要求登录详细信息。任何后续的应用程序启动应绕过用户登录屏幕,除非他们先前已按下注销按钮。这是甚至可能的,我确定它是其他应用程序这样做,我只是不知道如何?非常感谢。 – Jules 2011-05-11 14:34:39

+0

“我删除了所有其他使用FB的应用程序”。你是否从Facebook应用登出?您是否已从Safari Mobile登出Facebook?多个应用程序可以通过Safari cookie共享相同的Facebook用户会话。 – albertamg 2011-05-11 14:44:07

+0

好的我正在模拟器上测试,没有其他应用程序。我在safari上注销了Facebook,而且我仍处于相同的情况。 Hmmmm。即使我在Safari上登录FB,也必须有这样做,因为Facebook应用程序本身做我想要实现的目标。非常感谢。 – Jules 2011-05-11 14:54:42

-1

您需要验证会话授权因此,这段代码仍然有效:

- (void)applicationDidBecomeActive:(UIApplication *)application 
{ 
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 

    NSString *accessToken = [prefs stringForKey:@"facebook-accessToken"]; 
    NSDate *expirationDate = [prefs objectForKey:@"facebook-expirationDate"]; 
    facebook.accessToken = accessToken; 
    facebook.expirationDate = expirationDate; 

if (![facebook isSessionValid]) { 
    [facebook authorize:MY_APP_ID delegate:self]; 
} 

} 
+0

如何你能够传递MY_APP_ID ...我认为授权函数将NSArray作为参数而不是字符串/ ID?或者我在这里错过了什么?非常感谢。 – Jules 2011-05-11 14:24:49

+1

'authorize'方法将一组权限作为参数。 – albertamg 2011-05-11 14:33:48

+0

那就是我以为...所以上面的答案是不正确的呢? – Jules 2011-05-11 14:37:06