在基本登入期間,應用程式會取得用戶公開個人檔案的存取權限。如需存取其他個人檔案資訊或代表用戶在 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
按鈕。