facebook-ios-sdk退出问题

时间:2011-06-03 12:14:24

标签: iphone facebook ios4 facebook-graph-api logout

我在这里看到了很多关于Facebook Graph API的问题,但我仍然没有找到使用它的简单“登录”/“注销”操作的解决方案。看起来单一登录风格造成的混乱比利益更多。

我想知道是否有可能出现以下情况:

  1. 在应用中输入(未创建accessToken / expirationDate)。
  2. 通过调用authorize:delegate:方法使用SSO执行登录(应用程序进入后台并登录“全局”范围(Facebook App / Mobile Safari),询问用户凭据。
  3. 在应用中输入(现已登录,accessTokenexpirationDate都会保存到NSUserDefaults)。
  4. 通过调用logout:方法执行注销(现已注销,accessTokenexpirationDate已从NSUserDefaults移除
  5. 尝试再次执行登录,完成与2中完成相同的步骤。
  6. 我意识到当我拨打logout:时,我确实从我的App范围注销了Facebook(accessToken无效),而不是global范围(Facebook App / Mobile)苹果浏览器)。在 5。)当我再次尝试登录时,应用程序转到后台,并且像往常一样在Facebook App / Mobile Safari中再次登录尝试,但是我得到一个屏幕说我我已登录:

      

    您已经授权...。按“好”继续。   以...登录(不是吗?)。

    对于刚刚在我的应用程序中注销的用户来说,这是一种奇怪的行为。 我的问题是:

    “我可以真的从我的应用内部(我的意思是'全球'范围)退出吗?这会影响使用Facebook凭据的其他应用。但是,如果我不能这样做,我怎样才能避免上面描述的“奇怪的行为”?

    由于

7 个答案:

答案 0 :(得分:13)

爱德华多,

我感觉到你的痛苦!我花了一天的时间来处理这个问题。我发现当你使用SSO和电话时:

从您的代码中调用:

[facebook logout:self];

Facebook API方法:

- (void)logout:(id<FBSessionDelegate>)delegate {

  self.sessionDelegate = delegate;
  [_accessToken release];
  _accessToken = nil;
  [_expirationDate release];
  _expirationDate = nil;

  NSHTTPCookieStorage* cookies = [NSHTTPCookieStorage sharedHTTPCookieStorage];
  NSArray* facebookCookies = [cookies cookiesForURL:[NSURL URLWithString:@"http://login.facebook.com"]];

  for (NSHTTPCookie* cookie in facebookCookies) {
    [cookies deleteCookie:cookie];
  }

  if ([self.sessionDelegate respondsToSelector:@selector(fbDidLogout)]) {
    [_sessionDelegate fbDidLogout];
  }
}

facebook API确实使访问令牌和expirationdate变量无效并尝试删除移动Safari Cookie,但由于某种原因,可能是Apple的错误,cookie并未真正删除。因此,当您下次尝试登录时,您的移动版Safari将会看到该Cookie并显示:

"You have already authorized .... Press "Okay" to continue. Logged in as ... (Not You?)."

在Facebook找到修复程序或Apple修复其破坏的API之前,我们必须通过Safari绕过SSO。以下是我对Facebook.m所做的更改,以强制使用旧的登录对话框。如果您使用这些更改,它们可能无法永久工作,但我猜他们将会工作很长时间。另外,为了确保这适用于最新的facebook API,我更新到本帖子(2011年11月版)的最新版本。

从您的代码中调用:

[facebook authorize:permissions];

Facebook API方法:

- (void)authorize:(NSArray *)permissions {
  self.permissions = permissions;

//  [self authorizeWithFBAppAuth:YES safariAuth:YES];
    [self authorizeWithFBAppAuth:NO safariAuth:NO];
}

如果这有助于您请为此帖子和我的帖子评分,以帮助其他人找到它。

gadildafissh

答案 1 :(得分:3)

我担心答案是否定的,你不能这样做。

您的应用程序位于沙箱中,不能在外面写,全局cookie(用于移动版游戏)和Facebook应用程序设置(我认为在Facebook应用程序首选项/ cookie中)

您只能警告您的用户在您的应用外注销...

...或者你可以不使用facebook api SSO,但是在app登录webform中,就像我出于其他原因一样。

如果您选择该选项this pull request可能会节省您一些时间;)

答案 2 :(得分:3)

Hii,

它不可能,原因是单点登录(SSO)不是每次都让用户登录,而是注销,相反如果用户登录任何一个支持FB的应用程序 - 它将使用它再次登录 - 这是因为在这种情况下,设备主要由单人使用,只有一个用户可以在Facebook登录。

您无法控制应用以外的任何应用 - 例如 - 如果您使用Gmail&amp;当您打开google.com时,您可以看到您当前登录的用户名,其中包含SSO,

答案 3 :(得分:3)

在Facebook的新SDK中,您可以设置登录按钮loginBehaviour属性

swift中的代码......

let fbButton = FBSDKLoginButton()
fbButton.loginBehavior = .Web

答案 4 :(得分:2)

答案已经完成,但我只想澄清一下。可能会节省一些人的时间。

转到Facebook.m并更改行

  [self authorizeWithFBAppAuth:YES safariAuth:YES];

  [self authorizeWithFBAppAuth:YES safariAuth:NO];

这将导致应用程序内部出现登录窗口。退出将完美。换句话说,它将在旧版本的操作系统中使用。

答案 5 :(得分:1)

除了kishnan94的回答。目标c版本是;

如果你想要一个模态打开并从Safari或Facebook应用程序单独询问facebook凭据,只需使用最新的facebook sdk并设置登录行为

FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
[login setLoginBehavior:FBSDKLoginBehaviorWeb];

这将使注销过程更加方便,并且在不使用safari或facebook app帐户的情况下不会让用户感到困惑。

答案 6 :(得分:0)

这似乎是Facebook SDK的一个错误。如果Facebook应用程序安装在设备上,则会更新access_token。另一方面,access_tokenexpirationDate无法更改。 :((