facebook-ios-sdk退出问题

Edu*_*lho 12 iphone facebook logout facebook-graph-api ios4

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

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

  1. 在应用程序中输入(无accessToken/ expirationDate创建).
  2. 通过调用authorize:delegate:方法使用SSO执行登录(应用程序进入后台,登录在"全局"范围(Facebook App/Mobile Safari)中进行,请求用户凭据.
  3. 在应用程序中输入回(现在登录,都accessTokenexpirationDate保存到NSUserDefaults).
  4. 通过调用执行注销logout:方法(现在已经退出,都accessTokenexpirationDate从被删除NSUserDefaults)
  5. 尝试再次执行登录,完成与2中完成的完全相同的步骤.

我意识到,当我打电话时logout:,我确实accessToken从我的App范围注销Facebook(无效),而不是从global范围(Facebook App/Mobile Safari)注销.在5.)当我尝试再次登录时,应用程序转到后台,并且像往常一样在Facebook App/Mobile Safari中再次登录尝试,但是我得到一个屏幕,说我已经登录:

你已经授权了....按"好"继续.登录为...(不是吗?).

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

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

谢谢

gad*_*ssh 13

爱德华多,

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

从您的代码中调用:

[facebook logout:self];
Run Code Online (Sandbox Code Playgroud)

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];
  }
}
Run Code Online (Sandbox Code Playgroud)

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

"You have already authorized .... Press "Okay" to continue. Logged in as ... (Not You?)."
Run Code Online (Sandbox Code Playgroud)

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

从您的代码中调用:

[facebook authorize:permissions];
Run Code Online (Sandbox Code Playgroud)

Facebook API方法:

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

//  [self authorizeWithFBAppAuth:YES safariAuth:YES];
    [self authorizeWithFBAppAuth:NO safariAuth:NO];
}
Run Code Online (Sandbox Code Playgroud)

如果这有助于你请高举这个帖子和我的帖子,以帮助其他人找到它.

gadildafissh


Vin*_*rci 3

恐怕答案是否定的,你不能这样做。

您的应用程序位于沙箱中,无法在外部写入,其中全局 cookie(用于移动 Safari)和 Facebook 应用程序设置(我认为在 Facebook 应用程序首选项/cookies 中)

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

...或者您可以不使用 facebook api SSO,而是在应用程序登录 Web 表单中使用,就像我出于其他原因所做的那样。

如果您选择该选项,此拉取请求可能会为您节省一些时间;)

  • 你是对的,它是一个 SSO,但是多重注销......并且主要登录是在你的应用程序之外,你没有任何控制权......人们不应该经常注销,这就是为什么大多数情况下都可以。如果没有,我刚刚编辑了答案以绕过 facebook api 中的 SSO。 (2认同)