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, Я что-то пропустил?
Ответы
Ответ 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
Ответ 13
Проверьте состояние своего 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/
Ответ 14
304 указывает, что ничего не изменилось. Вероятно, вы как-то уже прошли аутентификацию, и поэтому получение нулевого значения с 304 указывает на то, что ничего не изменилось.