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

时间:2015-04-07 08:43:23

标签: ios facebook facebook-graph-api 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");
            }
        }
    }];

除非用户拒绝访问“电子邮件”,否则此功能非常有用。我在FacebookSDK文档中看到,我可以重新请求访问用户的电子邮件一次。根据FB文档:在link

中给出
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.

启用重新验证

  

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

     

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

auth_nonce: includes an app generated alphanumeric nonce which can be used to provide replay protection. See how to check an auth_nonce
     

了解更多。

     

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

     

FB.login(function(response){       //原始FB.login代码},{auth_type:'reauthenticate'})

     

请注意,响应正文包含auth_type参数   你指定了,例如:

     

=的access_token&USER_ACCESS_TOKEN放大器;期满= SECONDS_UNTIL_TOKEN_EXPIRES&安培; AUTH_TYPE =重新验证

如何通过iOS SDK将“auth_type = rerequest”传递给Facebook的服务器?有没有特别的方法呢?

2 个答案:

答案 0 :(得分:15)

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

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

我需要在再次请求时传递 auth_type:' rerequest' ,然后我会在此方法的文档中获取说明:

  

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

     

如果[FBSDKAccessToken currentAccessToken]不是零,那就是   作为该用户的重新授权处理并将通过   "再请求"登录登录对话框。

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

答案 1 :(得分:2)

您实际上不需要传递或调用auth_type:rerequest。这已经由facebook完成了。如果您检查FBSDKLoginManager,代码会为您完成。

-(NSDictionary *)logInParametersWithPermissions:(NSSet *)permissions
{
    if ([FBSDKAccessToken currentAccessToken]) 
       {
             loginParams[@"auth_type"] = @"rerequest";
       }
}