ios facebook sdk 4.0登录错误代码304

jim*_*jim 64 objective-c ios facebook-sdk-4.0

我刚刚更新了facebook sdk v4.0

并根据使用自定义登录UI的教程

-(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
        }
    }
}];
}
Run Code Online (Sandbox Code Playgroud)

但结果总是为零,错误代码是304,我错过了什么?

Vin*_*eph 204

我遇到了类似的问题.

初始化后,FBSDKLoginManager我添加了一行来清除数据和(Facebook)令牌:

FBSDKLoginManager *loginmanager= [[FBSDKLoginManager alloc]init];    
[loginmanager logOut];
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.


因此,正如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); }
       }
}];
}
Run Code Online (Sandbox Code Playgroud)

你必须这样做:

-(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); }
       }
}];
}
Run Code Online (Sandbox Code Playgroud)

否则,非常简单,如果用户碰巧更改设备上的FB帐户,该应用程序将无法运行.(除非他们因某些原因重新安装应用程序!)

再一次 - 如果用户碰巧更改FB帐户,上面流行的示例代码根本不起作用(应用程序进入无限循环).该logOut调用必须进行.


amo*_*sel 8

当我将Facebook AppID(在Info.plist文件中)从测试Facebook应用程序切换到生产Facebook应用程序时,这发生在我身上.如果你的应用程序将Facebook令牌发送到例如生成JWT的服务器,Facebook SDK仍然会FBSDKAccessToken.currentAccessToken()持久保存fbToken(),除非它被告知要删除它.当用户退出应用程序时,也可能在生产中发生这种情况,注销API请求会将用户注销并重置您的JWT.但即使在发送注销API请求之前,客户端也需要告诉FBSDKLoginManager实例注销.

if let currentAccessToken = FBSDKAccessToken.currentAccessToken() where currentAccessToken.appID != FBSDKSettings.appID()
    {
        loginManager.logOut()
    }
Run Code Online (Sandbox Code Playgroud)


小智 7

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


Abh*_*ain 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())
            }
        })
}
Run Code Online (Sandbox Code Playgroud)


小智 -4

304 表示没有任何改变。也许你已经通过了身份验证,因此得到 nil 和 304 表明没有任何改变。