Facebook Logout не работает в новом SDK V.4.1.0 в ios?

Друзья. Я хочу интегрировать Facebook в свое приложение, так что я загружаю новый Facebook SDK v.4.1.0, для кнопки входа в Facebook используйте класс FBSDKLoginButton, как показано ниже в Swift.

if (FBSDKAccessToken.currentAccessToken() != nil)
{
    // User is already logged in, do work such as go to next view controller.

    // Or Show Logout Button
    let loginView : FBSDKLoginButton = FBSDKLoginButton()
    self.view.addSubview(loginView)
    loginView.center = self.view.center
    loginView.readPermissions = ["public_profile", "email", "user_friends"]
    loginView.delegate = self
    self.returnUserData()
}
else
{
    let loginView : FBSDKLoginButton = FBSDKLoginButton()
    self.loginButtonDidLogOut(loginView)
    self.view.addSubview(loginView)
    loginView.center = self.view.center
    loginView.readPermissions = ["public_profile", "email", "user_friends"]
    loginView.delegate = self
 }
}

Как и в предыдущем коде, отображается кнопка "Войти с помощью Facebook".

enter image description here

После успешной авторизации войдите в систему. когда я нажимаю кнопку выхода из системы, то ее делегат вызывается - делегировать класс FBSDKLoginButtonDelegate

Делегировать метод выхода из системы:

func loginButtonDidLogOut(loginButton: FBSDKLoginButton!) {
    println("User Logged Out")

    FBSDKAccessToken.setCurrentAccessToken(nil)
    FBSDKProfile.setCurrentProfile(nil)

    let manager = FBSDKLoginManager()
    manager.logOut()

}

в делетете я явный токен, а также вызывается функция выхода из класса FBSDKLoginManager. Но каждый раз вы получаете авторизованный экран пользователя. Не получить экран входа в систему, чтобы другой пользователь не мог войти в систему с помощью facebook. каждый раз, когда мне приходится очищать историю браузера.

без очистки истории браузера. Страница входа не отображается, так что другой пользователь не может войти в систему.

Qusetion: Facebook BUG

Каждый раз экран дисплея после выхода из системы:

enter image description here

Ответы

Ответ 1

Я тоже застрял там же. Однако серфинг я пришел к следующему выводу.

Сначала давайте узнаем значение SingleSignOn:

Единый вход (SSO) является свойством контроля доступа нескольких связанных, но независимых программных систем. С помощью этого свойства пользователь входит в систему один раз и получает доступ ко всем системам, не запрашивая их снова в каждом из них.

Я думаю, что это какой-то момент. Почему мы не просим снова войти в систему, хотя мы вышли из системы? Его, потому что на симуляторе учетные данные были сохранены на сафари (в первый раз, используя facebook login, ваше приложение открывает сафари или приложение facebook, если установлено).

Информация, которая позволяет вам видеть сообщение "вы уже авторизованы...", находится в Facebook. Чтобы отменить разрешения из вашего приложения, вам нужно будет обратиться к графическому API. FB, в разделе "Удалить" https://developers.facebook.com/docs/reference/api/user/

Отключить вход

Вы также можете позволить людям полностью отменить авторизацию приложения или аннулировать вход в систему, выполнив вызов этой конечной точки API графики: DELETE/{user-id}/permissions

например, в быстрой:

 let deletepermission = FBSDKGraphRequest(graphPath: "me/permissions/", parameters: nil, HTTPMethod: "DELETE")
        deletepermission.startWithCompletionHandler({(connection,result,error)-> Void in            
            println("the delete permission is \(result)")

        })

Но чтобы полностью выйти из приложения, чтобы пользователю было предложено повторно ввести учетные данные, см. ниже:

Вам нужно выйти из приложения facebook, тогда только вы действительно вышли из системы, а затем только приложение снова запрашивает учетные данные. Это потому, что вы нигде не зарегистрированы в телефоне. Так что правило SSO не применяется здесь. Если вы выходите из системы только из своего приложения (а не из fb), вы будете регистрироваться из-за входа в сафари в вашем случае. Поэтому, вы получите то же сообщение, в котором вы уже авторизованы для этого приложения.

Попробуйте выполнить тестирование на симуляторе, в то время как вы впервые вводите учетные данные, а затем сафари открывается, а вводимые учетные данные сохраняются в сафари. Итак, в следующий раз, когда вы выходите из системы и заходите в приложение, он не запрашивает учетные данные. Поскольку сафари предоставляет его (или приложение facebook, если вы ввели свои учетные данные)

Теперь вы открываете сафари и открываете фейсбук. Вы видите, что facebook уже открыт и информация, которую он берет с сафари автоматически или если у вас установлено приложение facebook, то оттуда. Итак, выйдите из сафари и снова откройте приложение и выйдите из приложения. Затем ваше приложение снова спросит учетные данные.

Ответ 2

Этот ответ помог мне определить первопричину. 2 ключа - это SSO и Safari. Facebook плохо документирует процесс входа в Facebook. Мне пришлось отключить SSO. Это находится на сайте разработчика Facebook, где ваше приложение зарегистрировано в разделе "Настройки". Но что более важно, мне пришлось изменить поведение FBLoginManager для использования UIWebView, а не Safari. Я сделал это со следующим фрагментом:

FBSDKLoginManager *loginMgr = [[FBSDKLoginManager alloc] init];
loginMgr.loginBehavior = FBSDKLoginBehaviorWeb;

Если вы используете поведение по умолчанию, оно будет управлять выходами через приложение Facebook или браузер Safari, а не напрямую из приложения. FBSDKLoginBehaviorWeb должен использовать iOS UIWebView во всплывающем окне. Это работает отлично, и учетные данные требуются каждый раз после выхода из системы.