iOS iOS SDK 4.0登录错误代码304


68

我刚刚更新了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,我是否缺少某些内容?


显示你得到的错误。
Dheeraj Singh 2015年

Answers:


210

我有一个类似的问题。

初始化后,FBSDKLoginManager我添加了一行来刷新数据和(Facebook)Token:

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

希望这可以帮助。


因此,正像OP所问的那样,“我错过了什么”吗?

是的,下面随处可见的标准示例代码是完全错误的:

-(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调用必须进行。


1
这似乎有点过分。在我的情况下,Adrian999下面的回答(“先关闭然后再打开”)是实际的问题。
达米安2015年

正确的答案 谢谢您为我节省了时间。
Fattie

@JoeBlow Glad听说它有所帮助.. :)
Vineeth Joseph

1
Thnx哥们..您节省了我的时间
M Swapnil

您可能会遇到问题,如果您尝试在登录前注销。如果用户未为您的Facebook应用程序授予电子邮件许可,则使用此方法时,用户将无权授予该许可。因此,最好使用下面介绍的* refreshCurrentAccessToken *方法。
zh。

8

当我更改了Facebook AppID(在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()
    }

7

我遇到了这个问题,它是在运行iOS应用程序时在Xcode中更改FB应用程序详细信息时发生的。您需要从设备上删除该应用程序,然后使用新的FB应用程序设置重新发布。仅重新编译不足以清除旧的FB设置


但这在以下情况下完全没有帮助:您的用户恰巧退出了该应用程序,然后以另一个FB用户身份登录(在浏览器上),然后再次启动该应用程序。
Fattie

5

斯威夫特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())
            }
        })
}

4

您可以使用以下代码来解决您的问题:

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

3

根据文档,304 FBSDKLoginUserMismatchErrorCode “指示由于用户已更改而未能请求新权限”

在提到@ Adrian999的场景中有意义。



2

其实,原因很简单,您可以尝试执行以下步骤轻松地重新出现此错误代码。

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不相等时actualIDFBSDKLoginUserMismatchErrorCode会抛出。

现在,当用户A登录Facebook失败时,此问题将再次出现,但是失败[FacebookSDKManager logOut]后您没有这个问题,该应用程序将缓存用户A的accessToken,然后当用户B再次登录Facebook时,用户A将Facebook帐户更改为用户B。 ,它将重新出现此问题。


2

我也在这个问题上停留了一段时间。然后我在.h文件和.m文件的viewDidLoad中为FBSDKLoginManager创建对象,对其进行初始化并设置注销属性。

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

这对我有所帮助,希望对您也有帮助。祝一切顺利。

谢谢




0

对我而言,在Objective-C中,以下工作

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

和问题是用户试图按照@Vineeth Joseph的建议以其他用户身份登录


-2

检查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/


1
您已FBSession不再在v4中上课,因此已弃用。而是由FBSDKAccessToken和代替FBSDKLoginManager。参见developers.facebook.com/docs/ios/upgrading-4.x#login
Vinh Nguyen

对于较旧的版本。新的SDK发布
比涅斯约瑟夫

-4

304表示什么都没有改变。可能您已经通过某种方式进行了身份验证,因此如果304无效,则表示没有任何变化。


1
它不是HTTP状态代码304,而是FBSDKLoginUserMismatchErrorCode
Joseph Lin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.