如何使用Parse和Swift注销或撤销Facebook登录

5

我想要完全让我的应用程序用户退出登录。当使用

PFUser.logout()

我成功地将用户从Parse中登出。但是当我重新进入应用程序并点击登录按钮时,我会被重定向到Facebook屏幕,上面显示“您已经授权了该应用程序的名称”。所以,除非我重置模拟器,否则我无法使用其他帐户再次登录。
我还尝试使用以下方法注销:
PFFacebookUtils.facebookLoginManager().logOut()

但这也不起作用...希望您能帮我找到解决方法! 我正在使用最新的Facebook和Parse SDK。

更新:

实际上,使用 PFUser.logout() 和最新版本的ParseFacebook iOS SDK 版本 >= 4.4.0 就可以了。

不要使用 PFFacebookUtils.facebookLoginManager().logOut()FBSDKLoginManager().logOut(),因为它只会将用户从Facebook中注销,而不是从Parse后端注销。这意味着它不会删除Parse后端的可撤销会话。

3个回答

6

实际上,在撤销登录(让人们完全取消授权应用程序或撤销登录)和从其Facebook帐户中注销用户之间存在区别:

撤销登录

(您可以查看Facebook文档

您还可以通过调用此Graph API端点,让人们完全取消授权应用程序或撤销登录:

DELETE /{user-id}/permissions

此请求必须使用有效的用户访问令牌或当前应用程序的应用程序访问令牌进行。如果请求成功,则您的应用程序将收到一个true的响应。如果调用成功,则该人的任何用户访问令牌都将失效,并且他们将不得不再次登录。因为您正在取消授权您的应用程序,所以他们也必须像第一次登录一样授予对您的应用程序的访问权限。

let facebookRequest: FBSDKGraphRequest! = FBSDKGraphRequest(graphPath: "/me/permissions", parameters: nil, HTTPMethod: "DELETE")

facebookRequest.startWithCompletionHandler { (connection: FBSDKGraphRequestConnection!, result: AnyObject!, error: NSError!) -> Void in

                if(error == nil && result != nil){
                    println("Permission successfully revoked. This app will no longer post to Facebook on your behalf.")
                    println("result = \(result)")
                } else {
                    if let error: NSError = error {
                        if let errorString = error.userInfo?["error"] as? String {
                            println("errorString variable equals: \(errorString)")
                        }
                    } else {
                        println("No value for error key")
                    }
                }
}

从用户的Facebook账户注销

如果您使用了ParseFacebook iOS SDK版本 >= 4.4.0通过Facebook注册或登录用户,并且您不想取消应用程序授权或撤销登录,而只是想让用户从Facebook注销,请改用以下方法:

PFUser.logOut()

它将注销用户,删除Parse后端上的会话(不要忘记通过Parse应用程序设置启用Parse 可撤销会话),同时还将删除写在用户设备磁盘上的Facebook会话。
我希望这个答案能够帮助你们。

谢谢,答案再清晰不过了!我知道我漏掉了什么。这并不是真正的问题,因为我们通常不想在用户退出应用程序时完全注销用户。至少现在我知道该如何正确地做了。再次感谢! - Simon
如果这个问题和答案对你有帮助,请别忘了给它们点个赞(+1)。 - King-Wizard
1
很遗憾,对我来说不起作用。无论我做什么,我总是看到“您已经授权”的屏幕。 - Andrey Chernukha
仍然有效。非常好的答案。只需确保在成功部分中进行任何注销,以防止出现任何错误。如果您尝试在注销之后删除,它将抛出错误,并且您将无法删除权限。 - App Dev Guy

1

我刚刚实现了这个功能。在应用程序的任何视图控制器中调用此函数,它将注销Facebook。对我来说非常有效。希望能帮到你。

-(void) logout
{
    FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];

    if ( [FBSDKAccessToken currentAccessToken] ){
        [login logOut];
    }
}

这适用于当前最新的Facebook SDK,而不是任何旧版本。 - Ahsan Ebrahim
我会尝试的!谢谢 :) - Simon
当然,如果这个方法对你有用,请将其标记为正确答案 :) - Ahsan Ebrahim
实际上,在使用PFUser.logout()和最新版本的Parse以及Facebook iOS SDK版本>=4.4.0时,就可以完成任务。不要使用PFFacebookUtils.facebookLoginManager().logOut()FBSDKLoginManager().logOut(),因为这只会将用户从Facebook中注销,而不是从Parse后端注销。这意味着它不会删除Parse后端的可撤销会话。 - King-Wizard

-1

来源:在iOS应用中退出Facebook

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

  _sessionDelegate = delegate;

  NSMutableDictionary * params = [[NSMutableDictionary alloc] init];
  [self requestWithMethodName:@"auth.expireSession"
                    andParams:params andHttpMethod:@"GET"
                  andDelegate:nil];

  [params release];
  [_accessToken release];
  _accessToken = nil;
  [_expirationDate release];
  _expirationDate = nil;

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

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

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

谢谢回复!但是在最新的SDK中,FBSessions已经不存在了,所以我不能使用它们... - Simon
@Simon,你有发现使用新的Facebook SDK注销的方法吗?我也遇到了同样的问题。 - Ahsan Ebrahim
1
嗨@AhsanEbrahim!不幸的是,我没有找到一个合适的方法来做这件事...目前我只使用PFFacebookUtils.facebookLoginManager().logOut()PFUser.logout() 最后,这并不是真正的问题,因为手机通常只有一个用户。但如果你能找到解决办法,告诉我就好 :) - Simon
@Simon,看一下我刚刚发布的答案。希望对你有所帮助 :) - Ahsan Ebrahim
更新:实际上,使用PFUser.logout()和最新版本的Parse以及Facebook iOS SDK版本>= 4.4.0就可以完成工作。不要使用PFFacebookUtils.facebookLoginManager().logOut()FBSDKLoginManager().logOut(),因为它只会将用户从Facebook注销,而不是从Parse后端注销。这意味着它不会删除Parse后端上的可撤销会话。 - King-Wizard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接