Facebook iOS SDK中的强制登录

Facebook iOS SDK中的强制登录,ios,swift,facebook,Ios,Swift,Facebook,我有一个iPad应用程序,它在一家酒店里为客人使用。因此,多个用户通过Facebook登录使用该应用程序,使用后,我需要将该用户从该应用程序中注销。因此,下一个用户将再次进入登录屏幕。我在注销过程中这样做,当我调用login函数时,它不会给出登录屏幕。相反,它给了我已经授权的屏幕。(使用“确定”和“取消”按钮)。请帮助解决此问题 登录: FBSDKLoginManager().logInWithReadPermissions(["email", "public_profile"], fromVi

我有一个iPad应用程序,它在一家酒店里为客人使用。因此,多个用户通过Facebook登录使用该应用程序,使用后,我需要将该用户从该应用程序中注销。因此,下一个用户将再次进入登录屏幕。我在注销过程中这样做,当我调用login函数时,它不会给出登录屏幕。相反,它给了我已经授权的屏幕。(使用“确定”和“取消”按钮)。请帮助解决此问题

登录:

FBSDKLoginManager().logInWithReadPermissions(["email", "public_profile"], fromViewController: self, handler: { (result, error) -> Void in
if error != nil {
    print("error : \(error.localizedDescription)")
} else if result.isCancelled {
    print("user cancelled")
} else {
    print("success")
}
})
FBSDKLoginManager().logOut()
FBSDKAccessToken.setCurrentAccessToken(nil)
FBSDKProfile.setCurrentProfile(nil)

let storage = NSHTTPCookieStorage.sharedHTTPCookieStorage()
for cookie in storage.cookies! {
    storage.deleteCookie(cookie)
}
NSUserDefaults.standardUserDefaults().synchronize()
注销:

FBSDKLoginManager().logInWithReadPermissions(["email", "public_profile"], fromViewController: self, handler: { (result, error) -> Void in
if error != nil {
    print("error : \(error.localizedDescription)")
} else if result.isCancelled {
    print("user cancelled")
} else {
    print("success")
}
})
FBSDKLoginManager().logOut()
FBSDKAccessToken.setCurrentAccessToken(nil)
FBSDKProfile.setCurrentProfile(nil)

let storage = NSHTTPCookieStorage.sharedHTTPCookieStorage()
for cookie in storage.cookies! {
    storage.deleteCookie(cookie)
}
NSUserDefaults.standardUserDefaults().synchronize()

像这样从ios上清除你的facebook令牌。。。这使得用户每次在应用中都可以登录

ACAccountStore *store = [[ACAccountStore alloc] init];
        NSArray *fbAccounts = [store accountsWithAccountType:[store accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook]];
        for (ACAccount *fb in fbAccounts) {
            [store renewCredentialsForAccount:fb completion:^(ACAccountCredentialRenewResult renewResult, NSError *error) {

            }];
        }

下面是一个在视图上使用自定义按钮类FBSDKLoginButton的工作解决方案。如果currentAccessToken不是nil,则只应在视图中输入受保护的页面。这将阻止在几毫秒内显示第一个视图。如您所见,我将ViewController嵌入到NaviguationController中

在登录视图中具有自定义类的UIView:

视图将显示:

override func viewWillAppear(animated: Bool) {
    super.viewDidAppear(animated)
    if (FBSDKAccessToken.currentAccessToken() != nil) {
        loginFacebook(FBSDKAccessToken.currentAccessToken().tokenString,
            userId: FBSDKAccessToken.currentAccessToken().userID)
        self.enterProtectedPage();
    }
}
ViewDidLoad:

override func viewDidLoad() {
        super.viewDidLoad()
        loginBtn.delegate = self
        loginBtn.readPermissions = ["public_profile", "email", "user_birthday", "user_relationship_details"];
}
登录按钮单击操作:

func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result: FBSDKLoginManagerLoginResult!, error: NSError!) {
    if (error != nil) {
       print(error.localizedDescription)
       return
    }

    if let _ = result.token {
       loginFacebook(FBSDKAccessToken.currentAccessToken().tokenString,
       userId: FBSDKAccessToken.currentAccessToken().userID)
       self.enterProtectedPage();
    }
 }
进入受保护页面:

func enterProtectedPage() {
     let protectedPage = self.storyboard?.instantiateViewControllerWithIdentifier("ProtectedPageViewController") as!
        ProtectedPageViewController
        let protectedPageNav = UINavigationController(rootViewController: protectedPage)
        let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
        appDelegate.window?.rootViewController = protectedPageNav
}
@IBAction func btnLogoutClicked(sender: AnyObject) {
        let loginManager = FBSDKLoginManager()
        loginManager.logOut()
        let loginPage = self.storyboard?.instantiateViewControllerWithIdentifier("ViewController") as!ViewController
        let loginPageNav = UINavigationController(rootViewController: loginPage)
        let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
        appDelegate.window?.rootViewController = loginPageNav
}
受保护页面上的注销操作:

func enterProtectedPage() {
     let protectedPage = self.storyboard?.instantiateViewControllerWithIdentifier("ProtectedPageViewController") as!
        ProtectedPageViewController
        let protectedPageNav = UINavigationController(rootViewController: protectedPage)
        let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
        appDelegate.window?.rootViewController = protectedPageNav
}
@IBAction func btnLogoutClicked(sender: AnyObject) {
        let loginManager = FBSDKLoginManager()
        loginManager.logOut()
        let loginPage = self.storyboard?.instantiateViewControllerWithIdentifier("ViewController") as!ViewController
        let loginPageNav = UINavigationController(rootViewController: loginPage)
        let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
        appDelegate.window?.rootViewController = loginPageNav
}
这对我有用 对于目标-C

第一定义

@property(nonatomic,strong)FBSDKLoginManager *login;
然后用这个方法

-(void)logoutFromFacebook{

   if(self.login){

      [self.login logOut];
  }else{
      self.login = [[FBSDKLoginManager alloc] init];
      [self.login logOut];
  }

}
用于Swift

var login: FBSDKLoginManager?

func FBSDKLoginManager () {
  if self.login != nil {
    self.login.logout()
  }else {
    self.login = self.login()
    self.login.logout()
  }
}
希望这会有所帮助

它将始终为您提供一个已经授权的屏幕,因为Facebook不负责从Safari浏览器注销

您已从登录管理器注销,一切正常

对于这种情况,您可以使用
FBSDKLoginManager

您必须将行为设置为
Web
,它将打开弹出窗口进行登录

let fbManager : FBSDKLoginManager = FBSDKLoginManager()
fbManager.loginBehavior = FBSDKLoginBehavior.Web
fbManager.logInWithReadPermissions(["email"], fromViewController: self) { (result, error) -> Void in
    if error != nil {
        print(error)
    }
    else {
        print(result)
    }
}

您可以根据需要从经理处注销


希望它能对您有所帮助。

您可以注销您的FBSDKLoginManager类会话,但不能在浏览器中注销。使用设备登录:@CharithNidarsha Welcome anytime:)这种方式有效。一旦用户尝试重新登录,它会显示“已授权…”,但当您按OK时,它会自动关闭,结果不会被取消。我只是希望用户不必登录。。