ios facebook sdk 4.0 код ошибки входа 304

Я только что обновил facebook sdk v4.0

и в соответствии с руководством по Использование пользовательского пользовательского интерфейса входа.

-(IBAction)facebookLoginClick:(id)sender {

FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];

[login logInWithReadPermissions:@[@"email"] handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
    if (error) {
        // Process error
    } else if (result.isCancelled) {
        // Handle cancellations
    } else {
        // If you ask for multiple permissions at once, you
        // should check if specific permissions missing
        if ([result.grantedPermissions containsObject:@"email"]) {
            // Do work
        }
    }
}];
}

НО результат всегда нулевой, а код ошибки 304, я что-то упустил?


person jim    schedule 02.04.2015    source источник
comment
покажите ошибку, которую вы получаете.   -  person Dheeraj Singh    schedule 02.04.2015


Ответы (14)


У меня была аналогичная проблема.

После инициализации FBSDKLoginManager я добавил строку для сброса данных и токена (Facebook):

FBSDKLoginManager *loginmanager= [[FBSDKLoginManager alloc]init];    
[loginmanager logOut];

Надеюсь это поможет.


Таким образом, именно так, как спрашивает ОП, «я что-то упустил»?

Да, следующий стандартный пример кода, который можно увидеть повсюду, просто неверен:

-(IBAction)facebookLoginClick:(id)sender
{
FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
---- ONE MAGIC LINE OF CODE IS MISSING HERE ----
[login logInWithReadPermissions:@[@"email"]
   handler:^(FBSDKLoginManagerLoginResult *result, NSError *error)
    {
    if (error) {...}
    else if (result.isCancelled) {...}
    else { // (NB for multiple permissions, check every one)
       if ([result.grantedPermissions containsObject:@"email"])
          { NSLog(@"%@",result.token); }
       }
}];
}

вы должны сделать это:

-(IBAction)facebookLoginClick:(id)sender
{
FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
[login logOut];   //ESSENTIAL LINE OF CODE
[login logInWithReadPermissions:@[@"email"]
   handler:^(FBSDKLoginManagerLoginResult *result, NSError *error)
    {
    if (error) {...}
    else if (result.isCancelled) {...}
    else { // (NB for multiple permissions, check every one)
       if ([result.grantedPermissions containsObject:@"email"])
          { NSLog(@"%@",result.token); }
       }
}];
}

В противном случае приложение не будет работать, если пользователь изменит аккаунт FB на устройстве. (Если они по какой-то причине не переустановят приложение!)

Еще раз — популярный пример кода выше просто не работает (приложение переходит в бесконечный цикл), если пользователь меняет учетные записи FB. Должен быть сделан вызов logOut.

person Vineeth Joseph    schedule 22.05.2015
comment
Это кажется немного чрезмерным. В моем случае ответ Adrian999 ниже («выключить, а затем снова включить») был реальной проблемой. - person damian; 14.06.2015
comment
правильный и удивительный ответ. СПАСИБО, что сэкономили мне часы. - person Fattie; 18.08.2015
comment
@JoeBlow Рад слышать, что это помогло .. :) - person Vineeth Joseph; 18.08.2015
comment
Thnx приятель .. вы спасли мои часы - person M Swapnil; 12.09.2015
comment
У вас могут возникнуть проблемы, если вы попытаетесь выйти из системы до входа в систему. Если разрешение email не предоставлено пользователем для вашего приложения Facebook, у вашего пользователя не будет возможности предоставить его, если вы используете этот подход. Так что лучше используйте подход * refreshCurrentAccessToken*, описанный ниже. - person zh.; 23.10.2015
comment
проклятый фейсбук. Это официальный фрагмент кода Facebook, о котором идет речь! - person Saqib Saud; 03.03.2016
comment
Вызов logOut означает, что флаг rerequest не будет добавлен. Есть ли обходной путь для этого? - person Code; 28.05.2016
comment
Я согласен с @damian. Я чувствую, что есть причина, по которой это standard example code is seen everywhere. Выход из системы может испортить остальную часть вашей логики. Это произошло во время моих тестов, когда я вошел в систему с пользователем А и запросил дополнительные разрешения, используя пользователя Б. Если вы не выйдете из системы, это заставит приложение сохранять данные для входа в систему для пользователя А. Однако, если вы выйдете из системы, затем повторно запросите новые разрешения с пользователем B, facebook позволит вам войти в систему с пользователем B, но логика вашего приложения может по-прежнему думать, что вы пользователь A (скажем, если вы сохраните свой идентификатор пользователя facebook при входе в систему, а не при добавлении новых разрешений) - person Merricat; 25.06.2019

Это случилось со мной, когда я изменил идентификатор приложения Facebook (в файле Info.plist), переключив тестовое приложение Facebook на рабочее приложение Facebook. Если ваше приложение отправляет токен Facebook на сервер, который, например, генерирует JWT, Facebook SDK по-прежнему сохраняет сохраненный fbToken (FBSDKAccessToken.currentAccessToken()), если только ему не будет сказано удалить его. Это также может произойти в рабочей среде, когда пользователь выходит из приложения, запрос API на выход приведет к выходу пользователя из системы и сбросу вашего JWT. Но даже перед отправкой API-запроса на выход клиент должен будет указать экземпляру FBSDKLoginManager выйти из системы.

if let currentAccessToken = FBSDKAccessToken.currentAccessToken() where currentAccessToken.appID != FBSDKSettings.appID()
    {
        loginManager.logOut()
    }
person amosel    schedule 02.06.2016

У меня было это, это произошло при изменении сведений о приложении FB в Xcode во время работы приложения iOS. Вам нужно удалить приложение с устройства, а затем повторно опубликовать с новой настройкой приложения FB. Просто перекомпилировать недостаточно, чтобы очистить старые настройки FB

person Adrian999    schedule 06.04.2015
comment
Но это совсем не помогает в том случае, когда: ваш пользователь выходит из приложения, а затем входит (в браузере) как другой пользователь FB, а затем снова запускает приложение. - person Fattie; 18.08.2015

Свифт 3.0

func loginWithFacebook
{
        let loginManager = FBSDKLoginManager()
        if let currentAccessToken = FBSDKAccessToken.current(), currentAccessToken.appID != FBSDKSettings.appID()
        {
            loginManager.logOut()
        }

        loginManager.logIn(withReadPermissions: ["public_profile","email"], from: self, handler: { (result, error) in
            if error != nil {
                print("error\(String(describing: error))")
            }
            else if (result?.isCancelled)! {
            }
            else {
                print(FBSDKAccessToken.current())
            }
        })
}
person Abhishek Jain    schedule 08.08.2017

Вы можете использовать следующий код для решения вашей проблемы:

[FBSDKAccessToken refreshCurrentAccessToken:^(FBSDKGraphRequestConnection *connection, id result, NSError *error){}
person Piyush    schedule 19.08.2015

свифт 4.0, 4.2, 5.0

FBSDKLoginManager().logOut()
person Tanjima Kothiya    schedule 29.04.2018

Согласно документам, 304 FBSDKLoginUserMismatchErrorCode "Указывает на сбой при запросе новых разрешений, поскольку пользователь изменился".

Имеет смысл в сценарии, упомянутом @Adrian999.

person Joseph Lin    schedule 28.05.2015

Swift 4.0 и FBSDKCoreKit 4.33

let loginManager = LoginManager()
if let currentAccessToken = AccessToken.current, currentAccessToken.appId != SDKSettings.appId
{
    loginManager.logOut()
}
person Maxime Felici    schedule 18.06.2018

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

"Ошибка входа в Facebook" может иметь две причины:

  1. вы получаете информацию о пользователе из facebook.
  2. вы получаете информацию о пользователе из facebook успешно, но загрузка на свой сервер не удалась.

Код в FBSDKLoginManager.m:

- (void)validateReauthentication:(FBSDKAccessToken *)currentToken withResult:(FBSDKLoginManagerLoginResult *)loginResult
{
  FBSDKGraphRequest *requestMe = [[FBSDKGraphRequest alloc] initWithGraphPath:@"me"
                                                                   parameters:nil
                                                                  tokenString:loginResult.token.tokenString
                                                                   HTTPMethod:nil
                                                                        flags:FBSDKGraphRequestFlagDoNotInvalidateTokenOnError | FBSDKGraphRequestFlagDisableErrorRecovery];
  [requestMe startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
NSString *actualID = result[@"id"];
  if ([currentToken.userID isEqualToString:actualID]) {
    [FBSDKAccessToken setCurrentAccessToken:loginResult.token];
    [self invokeHandler:loginResult error:nil];
  } else {
    NSMutableDictionary *userInfo = [NSMutableDictionary dictionary];
    [FBSDKInternalUtility dictionary:userInfo setObject:error forKey:NSUnderlyingErrorKey];
    NSError *resultError = [NSError errorWithDomain:FBSDKLoginErrorDomain
                                             code:FBSDKLoginUserMismatchErrorCode
                                         userInfo:userInfo];
   [self invokeHandler:nil error:resultError];
  }
}];
}

когда currentToken.userID не равно actualID, будет выброшено FBSDKLoginUserMismatchErrorCode.

Теперь эта проблема появится снова, когда пользователь A войдет в facebook с ошибкой, но у вас нет [FacebookSDKManager logOut] после сбоя, приложение будет кэшировать accessToken для пользователя A, а затем пользователь A изменит учетную запись facebook на пользователя B, когда пользователь B войдет в facebook снова появится эта проблема.

person iCrany    schedule 29.07.2015

Я тоже застрял на этом вопросе на некоторое время. затем я создал объект для FBSDKLoginManager в файле .h и в viewDidLoad файла .m, инициализировал его и установил свойство выхода из системы.

 _fbLogin= [[FBSDKLoginManager alloc]init];    
 [_fbLogin logOut];

Это помогло мне, и надежда поможет вам. Всего наилучшего.

Спасибо

person Kunal Gupta    schedule 21.04.2016

Единый вход

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

Вы можете изменить единый вход в настройках своего приложения https://developers.facebook.com/apps/your-app-id/settings/.

person Neil Japhtha    schedule 31.03.2017

Для меня в Objective-C работало следующее

FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
if ([FBSDKAccessToken currentAccessToken]) {
             [login logOut];
        }

и проблема заключалась в том, что пользователь пытался войти в систему как другой пользователь, как это было предложено @Vineeth Joseph

person Chirag Purohit    schedule 26.06.2018

Проверьте состояние вашей FBSession:

isOpen
Indicates whether the session is open and ready for use.
@property (readonly) BOOL isOpen;
Declared In: FBSession.h

https://developers.facebook.com/docs/reference/ios/3.0/class/FBSession/

person Pablo A.    schedule 02.04.2015
comment
У вас больше нет класса FBSession в v4, он устарел. Вместо этого он заменяется на FBSDKAccessToken и FBSDKLoginManager. См. developers.facebook.com/docs/ios/upgrading-4.x. #логин - person Vinh Nguyen; 03.04.2015
comment
Для более старой версии. Выпущен новый SDK - person Vineeth Joseph; 11.06.2015

304 означает, что ничего не изменилось. Вероятно, вы каким-то образом уже аутентифицированы и поэтому получаете ноль с 304, указывающим, что ничего не изменилось.

person ktv    schedule 02.04.2015
comment
это не код состояния HTTP 304, это FBSDKLoginUserMismatchErrorCode - person Joseph Lin; 29.05.2015