如何使用Facebook iOS SDK 4.x"重新请求"电子邮件权限?

Pre*_*ani 14 facebook facebook-graph-api ios facebook-sdk-4.0

我正在整合FacebookSDK 4.x与自定义UI的集成,并使用以下方法登录并获得用户的电子邮件权限.

FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
    [login logInWithReadPermissions:@[@"email"] handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
        if (error){
            NSLog(@"%@",[error localizedDescription]);            
        }
        else if (result.isCancelled){
            NSLog(@"Cancled");
        }
        else
        {
            if ([result.grantedPermissions containsObject:@"email"])
            { 
                NSLog(@"Granted all permission");
                if ([FBSDKAccessToken currentAccessToken])
                {
                    [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:nil] startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error)
                    {
                        if (!error)
                        {
                            NSLog(@"%@",result);
                        }
                    }];
                }
            }
            else
            {
                NSLog(@"Not granted");
            }
        }
    }];
Run Code Online (Sandbox Code Playgroud)

除非用户拒绝访问"电子邮件",否则这很有效.我在FacebookSDK文档中看到,我可以重新请求访问用户的电子邮件一次.根据FB文档:在此链接中给出

If someone has declined a permission for your app, the login dialog won't let your app re-request the permission unless you pass auth_type=rerequest along with your request.
Run Code Online (Sandbox Code Playgroud)

启用重新身份验证

在您选择的登录流程中,我们向您展示了如何使用登录对话框和OAuth对某人进行身份验证并从中请求权限.要重新进行身份验证,您可以使用这些相同的步骤和其他参数来强制执行:

auth_type:此参数指定请求的身份验证功能(以逗号分隔的列表).有效选项包括:https - 检查是否存在安全的Facebook会话,并要求重新验证(如果不存在重新验证) - 要求此人无条件地重新进行身份验证

auth_nonce: includes an app generated alphanumeric nonce which can be used to provide replay protection. See how to check an auth_nonce
Run Code Online (Sandbox Code Playgroud)

更多.

以下是使用JavaScript SDK的示例,该SDK使用auth_type of reauthenticate触发重新身份验证:

FB.login(函数(响应){//原始FB.login代码},{auth_type:'reauthenticate'})

请注意,响应的主体包含您指定的auth_type参数,例如:

=的access_token&USER_ACCESS_TOKEN期满= SECONDS_UNTIL_TOKEN_EXPIRES&AUTH_TYPE =重新验证

如何通过iOS SDK将"auth_type = rerequest"传递给Facebook的服务器?那有什么特别的方法吗?

Pre*_*ani 15

我通过回忆方法解决了问题:

[login logInWithReadPermissions:@ [@"email"] handler:^(FBSDKLoginManagerLoginResult*result,NSError*error)

我需要再次请求时传递auth_type:'rerequest',我在这个方法的文档中得到它我得到描述:

在要求读取权限时使用此方法.您应该只在需要时请求权限并向用户解释该值.您可以检查result.declinedPermissions,以便在用户拒绝权限时向用户提供更多信息.

如果[FBSDKAccessToken currentAccessToken]不是nil,则将其视为该用户的重新授权,并将"rerequest"标志传递给登录对话框.

只是问题是我正在调用FbSDKLoginManager类的logout方法.这将清除令牌,它将把它作为旧权限而不是重新请求的权限.

  • 实际上我没有明确地向facebook发送'重新请求'但是当你登录并且再次调用[login logInWithReadPermissions:@ [@"email"]处理程序:^(FBSDKLoginManagerLoginResult*结果,NSError*错误)方法时作为'重新请求'.所以只是在一段时间之后回想一下这个方法是肯定的,但是在调用这个方法之前你不能调用logout方法.希望它会帮助你:) (3认同)