iOS Facebook SDK - 检查权限

Posted

技术标签:

【中文标题】iOS Facebook SDK - 检查权限【英文标题】:iOS Facebook SDK - Check Permissions 【发布时间】:2012-01-13 09:45:45 【问题描述】:

我有一个 Facebook SSO 在我的应用程序上完美运行,使用的是 Facebook Objective-C SDK 的最新版本。 如果用户做“某事”,我需要在应用程序内请求额外的权限。如果用户之前给过我,我不需要询问该权限,所以,我想,在 Facebook SDK 中应该有一个方法

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

所以我可以这样使用它:

if( [facebook checkPermission:@"email"] ) 

有没有办法做到这一点?

【问题讨论】:

【参考方案1】:

这个问题有点老了,但您现在可以在不发出图形请求的情况下检查活动会话的权限。这是在 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:...] 我现在无法测试,但文档另有说明:“在身份验证流程中授予访问令牌的权限。” developers.facebook.com/docs/reference/ios/current/class/… 今天我将我的 Facebook SDK pod 从 3.9.0 更新到 3.15.1,现在 [FBSession activeSession].permissions 返回正确的权限,[FBRequestConnection startWithGraphPath:@"/me/permissions" completionHandler:...] 不再返回它们(现在它返回 status:granted ,权限:已安装)。【参考方案2】:

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

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

同样可以通过FQL查询permissions table来实现

SELECT email FROM permissions WHERE uid = me()

【讨论】:

谢谢,根据您的回答,我尝试使用[facebook requestWithGraphPath:@"me/permissions" andDelegate:self];的方法。实现委托方法它工作得很好。再次感谢您 您能否为您的方法添加代码以确定电子邮件权限是否处于活动状态?如果授予权限,“电子邮件”将是什么?【参考方案3】:

重要提示:这似乎适用于较旧版本的 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
];

【讨论】:

【参考方案4】:

这是我用于检查权限的 FBSDK 4.2.0 代码。传入的字符串是权限的名称,例如“发布操作”

- (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;


【讨论】:

【参考方案5】:

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

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

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

【讨论】:

以上是关于iOS Facebook SDK - 检查权限的主要内容,如果未能解决你的问题,请参考以下文章

Facebook IOS SDK 可选权限

Swift:Facebook SDK,成功登录后检查丢失的权限

Facebook SDK 4.x 权限问题 iOS

适用于 iOS 的 Facebook SDK 的权限

Facebook iOS SDK / FBSDKLoginButton 忽略读取权限

Facebook通过iOS中的Facebook SDK通过应用程序登录?