Я'только что обновил 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, **я что-то упускаю?
У меня была похожая проблема.
После инициализации 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); }
}
}];
}
В противном случае, очень просто, приложение не будет работать если пользователь изменение аккаунтов на устройстве. (Если они по какой-то причине повторно установить приложение!)
Еще раз повторю - популярный пример кода выше просто не работает (приложение переходит в бесконечный цикл), если пользователь случается сменить аккаунт ФБ. "Выход" вызов должен быть выполнен.
Это случилось со мной, когда я изменил код 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()
}
У меня было такое, это произошло при изменении данных приложения FB в Xcode во время работы приложения iOS. Вам нужно удалить приложение с устройства, а затем опубликовать его заново с новыми настройками приложения FB. Просто перекомпиляции недостаточно, чтобы очистить старые настройки FB.
Свифт 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())
}
})
}
Согласно документам, 304 FBSDKLoginUserMismatchErrorCode
"и указывает на отсутствие нового разрешения, поскольку пользователь был изменен на".
Смысла в сценарии @Adrian999 упомянул.
Свифт 4.0 и FBSDKCoreKit 4.33
let loginManager = LoginManager()
if let currentAccessToken = AccessToken.current, currentAccessToken.appId != SDKSettings.appId
{
loginManager.logOut()
}
Свифт 4.0, 4.2, 5.0
FBSDKLoginManager().logOut()
На самом деле, причина очень простая, вы можете попробовать следующий шаг, чтобы легко появится этот код ошибки.
В "войти Facebook нето" может иметь две причины:
- вы получите информацию пользователей от facebook не получится.
- вы получите информацию пользователей от успеха 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 снова,она снова появится эта проблема.
Я тоже застрял на этой проблеме на некоторое время. затем я создал объект для FBSDKLoginManager в .файл H И в метод viewDidLoad из .файл м , инициализировать его и установите свойство "выход".
_fbLogin= [[FBSDKLoginManager alloc]init];
[_fbLogin logOut];
Это помогло мне и надеюсь, поможет вам. Все самое лучшее.
Спасибо
Для меня в Objective-C после работал
FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
if ([FBSDKAccessToken currentAccessToken]) {
[login logOut];
}
и вопрос был пользователь пытался войти в качестве другого пользователя, как предложил @Vineeth Джозеф
Единого Входа
Я've также обнаружили, что эта проблема происходит, если у вас есть приложение, которое не требует единый вход (т. е. приложение, которое разные пользователи будут создавать контент и делиться с одного устройства).
Вы можете изменить один знак в меню настроек https://developers.facebook.com/apps/your-app-id/settings/.
Проверьте состояние вашей 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/