在基本登入期間,應用程式會取得存取用戶公開個人檔案的權限。如需存取其他個人檔案資訊,或代表用戶在 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 測試工具完成此操作。
Get Token
> Get Access Token
。Clear
解除對所選應用程式的授權。如需撤銷單一權限:
/me/permissions/{permission-name}
,同時使用您希望為 {permission-name}
移除的權限,例如 email
。GET
切換至 DELETE
。Submit
按鈕。