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 - 检查权限的主要内容,如果未能解决你的问题,请参考以下文章
Swift:Facebook SDK,成功登录后检查丢失的权限