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

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

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

所以我可以这样使用它:

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

有没有办法做到这一点?

【问题讨论】:

    标签: iphone objective-c ios facebook


    【解决方案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 APIuser objectpermissions 连接来检查用户是否授予您的应用程序权限

    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"]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-04-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-04
          • 1970-01-01
          相关资源
          最近更新 更多