iOS Facebook SDK - 检查权限

8

我在我的应用程序中使用最新版本的Facebook Objective-C SDK,已经完美地实现了Facebook SSO。 如果用户在应用程序内进行“某些操作”,我需要请求额外的权限。如果用户之前已经授权给我该权限,那么我就不需要再次请求。因此,我猜测,在Facebook SDK中应该有一个方法可以实现这个功能。

-(BOOL) checkPermission:(NSString*) permission;

所以我可以像这样使用它:
if( [facebook checkPermission:@"email"] ) {

有没有办法做到这一点?
5个回答

22

这个问题有点老,但是现在你可以在不进行图形请求的情况下检查活动会话具有哪些权限。以下是在HelloFacebookSample中完成此操作的方法:

if ([FBSession.activeSession.permissions indexOfObject:@"publish_actions"] == NSNotFound) {
    // permission does not exist
} else {
    // permission exists
}

只需将 "publish_actions" 替换为 "email"。


[FBSession activeSession].permissions 返回的是你请求的权限,而不是当前的活动权限。至少这是我看到的。请参见下面的答案。你需要使用 [FBRequestConnection startWithGraphPath:@"/me/permissions" completionHandler:...] - Ferran Maylinch
1
我现在无法进行测试,但文档中说:“在身份验证流程期间授予访问令牌的权限。” https://developers.facebook.com/docs/reference/ios/current/class/FBSession/ - Raphaël Agneau de Selve
今天我将我的Facebook SDK pod从3.9.0更新到了3.15.1,现在[FBSession activeSession].permissions返回正确的权限,而[FBRequestConnection startWithGraphPath:@"/me/permissions" completionHandler:...]不再返回它们(现在返回{status:granted, permission:installed})。 - Ferran Maylinch

7

SDK没有提供直接检查特定权限的方法,但您可以通过检查user对象中的permissions连接来检查用户是否授予了您的应用程序权限,在Graph API中。

GET https://graph.facebook.com/me/permissions

可以通过在permissions上使用FQL查询来实现相同的效果。

SELECT email FROM permissions WHERE uid = me()

1
谢谢,根据您的回答,我尝试使用方法 [facebook requestWithGraphPath:@"me/permissions" andDelegate:self];。实现委托方法后,它完美地工作了。再次感谢您。 - Giorgio Marziani de Paolis
1
你能否添加代码来确定电子邮件权限是否已激活?如果授权被批准,'email'将是什么? - Smikey

0

对于SDK 4+,您有以下两种获取权限的方式:

[[FBSDKAccessToken currentAccessToken] hasGranted:@"user_photos"]

或者

[[[FBSDKAccessToken currentAccessToken] permissions] containsObject:@"user_photos"]

0

重要提示:这似乎是针对旧版本的Facebook SDK(例如3.9.0)而言。在3.15.0中,它不再以这种方式工作。您应该像Raphaël Agneau在他的答案中所说的那样使用[session.permissions]

您必须使用以下方法,因为[FBSession activeSession].permissions似乎返回您请求的权限,而不是实际的权限。

[FBRequestConnection startWithGraphPath:@"/me/permissions"
                      completionHandler:^(FBRequestConnection *c, id result, NSError *error) {
  if (!error) {
    NSDictionary *permissions= [(NSArray *)[result data] objectAtIndex:0];
    if (![permissions objectForKey:@"publish_actions"]) {
      // Ok, continue with your logic
    } else {
      // Permission not found, maybe request it (see below)
    }
  } else {
    // Treat error
  }
}];

更多信息请参见此处:

https://developers.facebook.com/docs/facebook-login/ios/v2.0#permissions-checking

如果找不到权限,您可能想以这种方式请求它:
[session requestNewPublishPermissions:PERMISSIONS_YOU_WANT
                      defaultAudience:FBSessionDefaultAudienceFriends
                    completionHandler:^(FBSession* session, NSError* error) {

    // Try again the /me/permissions above
}];

0

这是我用于检查权限的 FBSDK 4.2.0 代码。传递的字符串是权限名称,例如 "publish_actions"。

- (void) checkForPermission:(NSString *)permission granted:(void (^)(void))sBlock denied:(void (^)(void))fBlock {

  if ([FBSDKAccessToken currentAccessToken]) {

    [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me/permissions" parameters:nil] startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {

        BOOL hasPermission = NO;

        if (!error) {

            NSArray *permissions = [result objectForKey:@"data"];

            for (NSDictionary *dict in permissions) {

                if ([[dict objectForKey:@"permission"] isEqualToString:permission]) {

                    if ([[dict objectForKey:@"status"] isEqualToString:@"granted"]) {

                        hasPermission = YES;
                    }
                }
            }
         }

        if (hasPermission) {

            (sBlock) ? sBlock() : sBlock;

        } else {

            (fBlock) ? fBlock() : fBlock;
        }
     }];

  } else {

    (fBlock) ? fBlock() : fBlock;
}
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接