facebook-ios-sdk вопрос выхода - PullRequest
12 голосов
/ 03 июня 2011

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

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

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

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

Вы уже авторизованы .... Нажмите «Хорошо», чтобы продолжить. Вы вошли как ... (не вы?).

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

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

Спасибо

Ответы [ 7 ]

13 голосов
/ 01 декабря 2011

Эдуардо,

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

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

[facebook logout:self];

Метод 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];
  }
}

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

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

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

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

[facebook authorize:permissions];

Метод Facebook API:

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

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

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

gadildafissh

3 голосов
/ 08 июня 2016

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

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

let fbButton = FBSDKLoginButton()
fbButton.loginBehavior = .Web
3 голосов
/ 03 июня 2011

Hii,

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

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

3 голосов
/ 03 июня 2011

Боюсь, ответ - нет, вы не можете этого сделать.

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

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

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

Если вы выберете эту опцию , этот запрос на вытягивание может сэкономить вам время;)

2 голосов
/ 22 декабря 2011

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

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

  [self authorizeWithFBAppAuth:YES safariAuth:YES];

до

  [self authorizeWithFBAppAuth:YES safariAuth:NO];

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

1 голос
/ 29 июня 2016

в дополнение к ответу kishnan94. целевая версия с;

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

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

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

0 голосов
/ 27 июня 2017

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

...