Вопрос о выходе facebook-ios-sdk

Я видел здесь много вопросов относительно API Graph Graph, но я все еще не нашел решения для простых операций входа/выхода из системы. Похоже, что стиль Single Sign-On вызывает больше путаницы, чем преимущества.

Я хотел бы знать, возможно ли следующее:

  • Введите в приложение (нет accessToken/expirationDate).
  • Выполните логин, используя SSO, вызвав метод authorize:delegate: (приложение переходит в фоновый режим, и логин сделан в "глобальной" области (приложение Facebook/Mobile Safari), запрашивая учетные данные пользователя.
  • Введите обратно в приложение (теперь он входит в систему, оба accessToken и expirationDate сохраняются в NSUserDefaults).
  • Выполните выход из системы, вызвав метод logout: (теперь выйдите из системы, как accessToken, так и expirationDate удалены из NSUserDefaults)
  • Попытка выполнить логин снова, с теми же шагами, выполненными в 2.

Я понимаю, что когда я звоню logout:, я действительно выхожу из Facebook (accessToken недействителен) из области приложения, а не из области global (приложение для Android App/Mobile Safari). В 5.), когда я пытаюсь снова войти в систему, приложение переходит в фоновый режим, и попытка входа в систему снова выполняется в приложении Facebook App/Mobile Safari, однако я получаю экран, в котором говорится, что я 'm уже вошел в систему:

Вы уже разрешили .... Нажмите "ОК", чтобы продолжить. Войдите в систему как ... (не вы?).

Это странное поведение для пользователя, который только что вышел из моего приложения. Мой вопрос:

"Могу ли я действительно выйти из facebook (я имею в виду" глобальную "область) из моего приложения? Это повлияет на другие приложения, используя учетные данные в facebook. Однако, если я не могу сделайте это, как я могу избежать описанного выше" странного поведения"?

Спасибо

Ответ 1

Я боюсь, что ответ отрицательный, вы не можете этого сделать.

Ваше приложение находится в песочнице и не может писать снаружи, где глобальные файлы cookie (для мобильных сафари) и настройки приложения Facebook (в настройках приложения Facebook/куки, я думаю)

Вы можете только предупредить своего пользователя выйти из системы вне вашего приложения...

... Или вы просто не можете использовать facebook api SSO, но в веб-форме входа в приложение, как и по другим причинам.

Если вы выберете этот параметр этот запрос на pull может сэкономить некоторое время;)

Ответ 2

Эдуардо,

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

Вызывается из вашего кода:

[facebook logout:self];

API-интерфейс Facebook:

- (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];
  }
}

API facebook делает недействительными переменные токена доступа и expirationdate и пытается удалить файлы cookie для Safari для мобильных устройств, но по какой-то причине, вероятно, ошибка Apple, файлы cookie на самом деле не удалены. Поэтому, когда вы пытаетесь войти в систему в следующий раз, ваш мобильный Safari увидит файл cookie, и он скажет:

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

До тех пор, пока Facebook не найдет исправление или Apple не исправляет свой сломанный API, мы должны обойти SSO через Safari. Ниже приведены изменения, внесенные мной в Facebook.m, чтобы заставить старый диалог входа в систему. Если вы использовали эти изменения, они могут работать не навсегда, но я полагаю, что они будут работать очень долго. Также, чтобы быть уверенным, что это работало с последним API facebook, я обновлялся до последней версии этого сообщения (сборка в ноябре 2011 года).

Вызывается из вашего кода:

[facebook authorize:permissions];

API-интерфейс Facebook:

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

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

Если это поможет вам оценить эту тему и мое сообщение, чтобы помочь другим найти ее.

gadildafissh

Ответ 3

Hii,

его невозможно, причина в Single Sign On (SSO) заключается не в том, чтобы каждый раз вводить логин пользователя, он выходит из системы, а если пользователь регистрируется в любом из приложений с включенным FB - он будет использовать это для повторного входа в систему - это потому что устройство в основном используется одним человеком, в этом случае только один пользователь может войти в Facebook.

вы не можете управлять каким-либо приложением за пределами вашего приложения - например, если вы заходите в Gmail, и когда вы открываете google.com, вы можете увидеть свое имя пользователя, которое в настоящее время зарегистрировано, у которого есть SSO,

Ответ 4

В новом SDK Facebook вы можете установить кнопку входа в систему loginBehaviour свойство

Ниже кода в быстром...

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

Ответ 5

Ответ уже сделан, но я просто хочу его прояснить. Может быть, это спасло кого-то.

Перейдите в Facebook.m и измените строку

  [self authorizeWithFBAppAuth:YES safariAuth:YES];

к

  [self authorizeWithFBAppAuth:YES safariAuth:NO];

Это приведет к появлению окна входа в приложение. Выход будет работать отлично. Другими словами, он будет работать так же, как в старых версиях ОС.

Ответ 6

в дополнение к kishnan94 ответ. объектная версия c:

если вы хотите, чтобы модальная функция открывалась и запрашивала учетные данные в facebook отдельно от приложения Safari или Facebook, просто используйте последнюю версию sdk facebook и задайте поведение входа

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

это сделает процесс выхода более удобным и менее запутанным для пользователей без использования учетных записей приложений Safari или Facebook.

Ответ 7

Кажется, что это ошибка в SDK для Facebook. В случае, когда приложение Facebook установлено на устройстве, access_token обновляется. С другой стороны, access_token и expirationDate не могут быть изменены.: ((