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

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

и согласно руководству Using Custom Login UIs

-(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, **я что-то упускаю?

Комментарии к вопросу (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); }
       }
}];
}

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

Еще раз повторю - популярный пример кода выше просто не работает (приложение переходит в бесконечный цикл), если пользователь случается сменить аккаунт ФБ. "Выход" вызов должен быть выполнен.

Комментарии (9)

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

if let currentAccessToken = FBSDKAccessToken.currentAccessToken() where currentAccessToken.appID != FBSDKSettings.appID()
    {
        loginManager.logOut()
    }
Комментарии (0)

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

Комментарии (1)

Свифт 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())
            }
        })
}
Комментарии (0)

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

[FBSDKAccessToken refreshCurrentAccessToken:^(FBSDKGraphRequestConnection *connection, id result, NSError *error){}
Комментарии (0)

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

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

Комментарии (0)

Свифт 4.0 и FBSDKCoreKit 4.33

let loginManager = LoginManager()
if let currentAccessToken = AccessToken.current, currentAccessToken.appId != SDKSettings.appId
{
    loginManager.logOut()
}
Комментарии (0)

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

В "войти Facebook нето" может иметь две причины:

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

Код в <код>FBSDKLoginManager.м в< код> есть:

- (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.ID пользователя</код> не равно <код>actualID</код>, в <код>FBSDKLoginUserMismatchErrorCode</код> бросят.

Теперь эта проблема будет появляться, когда пользователь логин facebook не,но у вас нет <код>[FacebookSDKManager выход]</код> после сбой, приложение будет кэшировать маркер доступа для пользователя , и пользователь изменить facebook аккаунт, чтобы пользователь, когда пользователь логин facebook снова,она снова появится эта проблема.

Комментарии (0)

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

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

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

Спасибо

Комментарии (0)

Для меня в Objective-C после работал

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

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

Комментарии (0)

Единого Входа

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

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

Комментарии (0)

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

isOpen
Indicates whether the session is open and ready for use.
@property (readonly) BOOL isOpen;
Declared In: FBSession.h
Комментарии (2)

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

Комментарии (1)