【问题标题】:facebook iphone sdk logout issue!facebook iphone sdk注销问题!
【发布时间】:2011-05-11 13:45:47
【问题描述】:

一段时间以来,我一直在寻找看似简单的问题的解决方案,但没有运气。登录代码如下。

- (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 中有一个 Type Facebook 属性和一个注销按钮。我将 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”??

有谁知道我现在是不是走错了路,因为这真的让我很烦?

非常感谢

朱尔斯

【问题讨论】:

  • 这里的类似情况.. facebook 从应用程序/sdk 注销成功,但它的会话仍在 safari 插件中...如果我再次登录,则表明已经登录只是确认权限

标签: iphone cocoa-touch facebook


【解决方案1】:

由于single sign-on,用户可能不需要再次重新输入他的凭据:

在 SDK 的更新版本中,我们 改变了授权机制,所以 用户不再需要重新输入 他们的凭据 他们想要的设备上的应用程序 授权。

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

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

请注意,注销不会撤销 您的应用程序的权限,但是 简单地清除您的应用程序的 访问令牌。如果一个用户有 以前从您的 申请返回,他会简单地 看到他正在登录的通知 进入您的应用程序,而不是 授予权限的通知。

【讨论】:

  • 感谢回复,但是我已经删除了所有其他使用 FB 的应用程序,问题仍然存在。如果这有帮助,我想要以下行为......第一次用户登录时,他们被要求提供登录详细信息。应用程序的任何后续启动都应绕过用户登录屏幕,除非他们之前按下了注销按钮。这甚至可能吗,我确定它就像其他应用程序一样,我只是不确定如何?再次感谢。
  • “我已删除所有其他使用 FB 的应用程序”。您是否已从 Facebook 应用程序中注销?您是否已从 Safari Mobile 退出 Facebook?多个应用程序可以通过 Safari cookie 共享同一个 Facebook 用户会话。
  • 好的,我正在模拟器上进行测试,没有其他应用程序。我在 safari 上退出了 Facebook,但我仍然处于同样的情况。嗯。必须有某种方法可以做到这一点,因为 facebook 应用程序本身可以实现我想要实现的目标,即使我在 Safari 上登录到 FB?再次感谢。
  • 所以在模拟器中当你尝试授权你的应用时,你说你被重定向到Safari直接到“你已经授权这个应用使用Facebook”页面。在底部,它应该显示类似“以 XXX 身份登录。不是你吗?”。 “不是你”是一个会让你退出的链接。
  • 我不知道是否有更好的方法,所以我的建议是提出一个新问题,例如“如何禁用 iPhone 的 SSO”。说,我看过in the comments of this post你可以摆脱SSO编辑Facebook.m的源代码,只需在authorize:delegate:方法的实现中更改一行,将[self authorizeWithFBAppAuth:YES safariAuth:YES];更改为[self authorizeWithFBAppAuth:NO safariAuth:NO];
【解决方案2】:

您需要在授权之前验证会话,因此此代码仍然有效:

- (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];
}

}

【讨论】:

  • 你怎么能传入 MY_APP_ID... 我认为授权函数将 NSArray 作为参数而不是字符串/id?或者我在这里错过了什么?非常感谢。
  • authorize 方法将权限数组作为参数。
  • 这就是我的想法……那么上面的答案不正确吗?
  • 我觉得我们的版本不一样:/
  • MY_APP_ID 应该是权限数组,即 [[NSArray alloc] initWithObjects:"email","user_location",nil],而不是 app_id。
猜你喜欢
  • 1970-01-01
  • 2011-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-25
  • 1970-01-01
  • 2011-10-22
相关资源
最近更新 更多