如何使用Facebook iOS SDK 4.x“重新申请”电子邮件许可?

我正在整合FacebookSDK 4.x集成与自定义用户界面,并使用以下方法login,并从用户获得电子邮件许可。

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文件:在这个链接给出

 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. 

启用重新authentication

在您select的loginstream程中,我们向您展示了如何使用login对话框和OAuth对某人进行身份validation并向他们请求权限。 要重新进行身份validation,可以使用这些相同的步骤和其他参数来强制执行:

auth_type:此参数指定请求的身份validationfunction(以逗号分隔的列表)。 有效的选项是:https – 检查是否存在安全的Facebook会话,并要求重新validation,如果不存在重新validation – 要求该人无条件地重新validation

 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触发重authentication的示例,使用auth_type reauthenticate:

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

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

=的access_token&USER_ACCESS_TOKEN期满= SECONDS_UNTIL_TOKEN_EXPIRES&AUTH_TYPE =重新validation

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

我通过回顾这个方法解决了问题:

[loginlogInWithReadPermissions:@ [@“email”]处理程序:^(FBSDKLoginManagerLoginResult *结果,NSError *错误)

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

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

如果[FBSDKAccessToken currentAccessToken]不为零,则将被视为该用户的重新授权,并将“rerequest”标志传递给login对话框。

只是问题是我在调用FbSDKLoginManager类的注销方法。 这将清除令牌,并将它作为旧权限不重新请求权限。

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

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