iOS 权限管理

在基本登录期间,您的应用会收到用户公开资料的访问权限。如需访问其他个人主页信息或代表用户向 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 探索工具撤销权限

出于测试目的,您可能需要使用除自己应用以外的工具以撤销权限。您可以使用图谱 API 探索工具实现。

  1. 访问图谱 API 探索工具
  2. 选择应用。
  3. 点击 Get Token > Get Access Token
  4. 点击 Clear 取消对选定应用的授权。

如需撤销单个权限:

  1. 将路径输入字段设置为 /me/permissions/{permission-name},同时将想要删除的权限填入 {permission-name},例如,email
  2. GET 切换为 DELETE
  3. 点击 Submit 按钮。
图谱 API 探索工具