Подтвердить что ты не робот

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, Я что-то пропустил?

4b9b3361

Ответ 1

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

После инициализации 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 должен быть выполнен.

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

Swift 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())
            }
        })
}

Ответ 6

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

Имеют смысл в сценарии @Adrian999.

Ответ 7

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

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

  • вы получаете информацию о пользователе из фейсбука.
  • вы получаете информацию о пользователе от успеха 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 будет бросать.

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

Ответ 8

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

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

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

Спасибо

Ответ 9

Swift 4.0 и FBSDKCoreKit 4.33

let loginManager = LoginManager()
if let currentAccessToken = AccessToken.current, currentAccessToken.appId != SDKSettings.appId
{
    loginManager.logOut()
}

Ответ 10

swift 4.0, 4.2, 5.0

FBSDKLoginManager().logOut()

Ответ 11

Единый вход

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

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

Ответ 12

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

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

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

Ответ 14

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