管理權限: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 測試工具