在基本登录期间,您的应用会收到用户公开资料的访问权限。如需访问其他个人主页信息或代表用户向 Facebook 发布内容,则必须请求其他权限,详情请参阅 Facebook 登录的相关权限。
您的应用应该按照以下方式管理权限:
图谱 API 请求 - 发送图谱 API 请求前,应检查必要的权限并在需要时请求这些权限。
缺失和撤销的权限 - 您的应用需要处理 Facebook 发送的缺失或撤销权限错误,方法包括:请求权限并重试。请参阅 iOS 版 SDK 错误处理。
合宜请求 - 仅请求需要的权限并在无需请求所有权限时亦提供应用功能,这些举措有助提升转化量。
如需通过 FBSDKLoginButton
在登录时请求权限,应设置 permissions
属性:
let loginButton = FBLoginButton() loginButton.permissions = ["public_profile", "email"]
如果您正在使用自定义“登录”按钮,而不是 FBSDKLoginButton
,则您可以使用 LoginManager
执行登录:
override func viewDidLoad() { super.viewDidLoad() ... loginButton.addTarget(self, action: #selector(loginButtonClicked), for: .touchUpInside) } @objc func loginButtonClicked() { let loginManager = LoginManager() loginManager.logIn(permissions: ["email"], from: self) { result, error in // Process result or error } }
调用 loginManager
之前,应检查当前口令的可用性。请参阅 iOS 版 Facebook 登录
如需检查当前权限,请检查 FBSDKAccessToken
。
if ([[FBSDKAccessToken currentAccessToken] hasGranted:@"email"]) { // TODO: publish content. } else { FBSDKLoginManager *loginManager = [[FBSDKLoginManager alloc] init]; [loginManager logInWithPublishPermissions:@[@"email"] fromViewController:self handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) { //TODO: process error or result. }]; }
检查返回至 FBSDKLoginManager
回调或 FBSDKLoginButton
委托的 FBSDKLoginResult
,了解用户是否拒绝权限请求:
FBSDKLoginManager *loginManager = [[FBSDKLoginManager alloc] init]; [loginManager logInWithPublishPermissions:@[@"email"] fromViewController:self handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) { if ([result.declinedPermissions containsObject:@”email”]) { // TODO: do not request permissions again immediately. Consider providing a NUX // describing why the app want this permission. } else { // ... } }];
请求图谱 API 时,您可以检查 NSError
对象,了解是否有权限错误:
[[[FBSDKGraphRequest alloc] initWithGraphPath:@"me/feed" parameters:@{ @"message" : @"This is a status update" } HTTPMethod:@"POST"] startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { if ([error.userInfo[FBSDKGraphRequestErrorGraphErrorCode] isEqual:@200]) { NSLog(@"permission error"); } }];
如需获取更多信息,请参阅 iOS 版 SDK 错误处理。
使用 FBSDKLoginManager
请求额外权限,或使用 logInWith*:
方法请求之前已拒绝的权限。FBSDKLoginManager
可通过 [FBSDKAccessToken currentAcccessToken]
的可用性了解是否是重复请求。
您可以允许用户移除或撤销之前向应用授予的特定权限。例如,您可以为应用构建一个设置页面,方便用户停用特定的功能。
通过调用图谱 API 端点撤销权限。
[[[FBSDKGraphRequest alloc] initWithGraphPath:@"me/permissions/email" parameters:nil HTTPMethod:@"DELETE"] startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { // ... }];
您可以撤销应用的所有权限,方法是调用图谱 API 删除所有权限。使用撤销权限部分所述的代码,并将请求的路径更改为 /me/permissions
。
出于测试目的,您可能需要使用除自己应用以外的工具以撤销权限。您可以使用图谱 API 探索工具实现。
Get Token
> Get Access Token
。Clear
取消对选定应用的授权。如需撤销单个权限:
/me/permissions/{permission-name}
,同时将想要删除的权限填入 {permission-name}
,例如,email
。GET
切换为 DELETE
。Submit
按钮。