2012-01-13 114 views
8

我有一个Facebook SSO在我的应用程序上完美工作,使用Facebook Objective-C SDK的最新版本。 如果用户做“某事”,我需要在应用程序内请求额外的权限。我不需要问这个权限,如果用户之前把它给我,所以,我想,在Facebook的SDK应该有一个方法iOS Facebook的SDK - 检查权限

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

这样我就可以这样使用它:

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

有没有办法做到这一点?

回答

22

这个问题有点老,但你现在可以检查活动会话没有发出图形请求的权限。以下是HelloFacebookSample中的完成方法:

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

只需将“publish_actions”替换为“email”即可。

+0

'[FBSession activeSession]。权限“将返回您请求的权限,而不是活动权限。或者至少这是我所看到的。请参阅下面的答案。你需要'[FBRequestConnection startWithGraphPath:@“/ me/permissions”completionHandler:...]'。 – 2014-07-02 19:50:51

+1

我现在无法测试,但文档中另有说明:“在身份验证流程中授予访问令牌的权限。” https://developers.facebook.com/docs/reference/ios/current/class/FBSession/ – 2014-07-04 15:31:17

+0

今天我将我的Facebook SDK pod从3.9.0更新到3.15.1,现在'[FBSession activeSession] .permissions'返回正确的权限和'[FBRequestConnection startWithGraphPath:@“/ me/permissions”completionHandler:...]'不再返回它们(现在它返回{status:granted,permission:installed})。 – 2014-07-07 11:48:59

7

SDK不检查特定权限提供了直接的方法,但你可以检查用户是否通过检查Graph APIuser objectpermissions联系获准申请

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

同样可以FQL查询上permissions table

实现
SELECT email FROM permissions WHERE uid = me() 
+1

谢谢你,根据你的答案,我尝试使用方法'[facebook requestWithGraphPath:@“me/permissions”andDelegate:self];'。实现委托方法,它完美的工作。再次感谢您 – 2012-01-13 11:24:32

+1

您可以为您的方法添加代码以确定电子邮件许可是否有效?如果授予许可,将会发送什么电子邮件? – Smikey 2012-02-29 13:47:15

0

重要提示:对于较旧版本的Facebook SDK(例如3.9.0),这似乎是正确的。在3.15.0中,它不再以这种方式工作。正如RaphaëlAgneau在回答中所说,你应该使用[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; 
} 
} 
0

对于SDK 4+你获得权限,这些2种方式:

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

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