iOS 權限管理

在基本登入期間,應用程式會取得存取用戶公開個人檔案的權限。如需存取其他個人檔案資訊,或代表用戶在 Facebook 發佈內容,您必須要求獲取額外的權限。請參閱使用 Facebook 登入取得權限

您的應用程式應該按以下方式管理權限:

  • Graph API 要求:傳送 Graph 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 {
 // ...
 }
}];

欠缺權限

執行 Graph 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] 可用性的重新要求。

撤銷權限

您可以允許用戶移除或撤銷之前向您應用程式授予的特定權限。例如,您的應用程式可以提供一個設定頁面,以便用戶在此停用特定功能。

透過向 Graph API 端點執行呼叫撤銷權限。

[[[FBSDKGraphRequest alloc] initWithGraphPath:@"me/permissions/email"
       parameters:nil
       HTTPMethod:@"DELETE"]
  startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
  // ...
}];

撤銷登入

您可以透過執行可刪除所有權限的 Graph API 呼叫,撤銷應用程式的所有權限。使用撤銷權限中的程式碼,將要求的路徑變更為 /me/permissions


透過 Graph API 測試工具撤銷權限

出於測試目的,您可能希望在不使用應用程式的情況下就撤銷權限解除授權。您可以使用 Graph API 測試工具完成此操作。

  1. 使用 Graph API 測試工具
  2. 選擇您的應用程式。
  3. 點擊 Get Token > Get Access Token
  4. 點擊 Clear 解除對所選應用程式的授權。

如需撤銷單一權限:

  1. 將路徑輸入欄位設定為 /me/permissions/{permission-name},同時使用您希望為 {permission-name} 移除的權限,例如 email
  2. GET 切換至 DELETE
  3. 點擊 Submit 按鈕。
Graph API 測試工具