Управление разрешениями в iOS

При входе в базовом режиме ваше приложение получает доступ к общедоступному профилю человека. Чтобы получить доступ к дополнительной информации профиля или опубликовать контент на Facebook от лица этого пользователя, нужно запросить дополнительные разрешения. Подробнее см. в справке по разрешениям при входе через Facebook.

Ваше приложение должно управлять разрешениями следующим образом:

  • Запросы API Graph. Прежде чем отправлять запросы API Graph, убедитесь в том, что у вас есть необходимые разрешения, а если понадобится, запросите их.

  • Отсутствующие и отозванные разрешения. Если разрешение Facebook отсутствует или отозвано, вам нужно попросить предоставить или восстановить его. Подробнее см. в разделе Обработка ошибок, SDK для iOS.

  • Своевременность запросов. Вы сможете повысить коэффициент конверсии, если будете запрашивать разрешения, только когда они действительно нужны, и предоставите функции, для использования которых не требуются все разрешения.

Запрос при входе

Чтобы запросить разрешения при входе с помощью 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 нужно проверить, доступен ли существующий маркер. Подробнее см. в статье Вход через Facebook для iOS.

Проверка разрешений

Чтобы узнать, какие разрешения у вас уже есть, проверьте 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.
  }];
}

Отклоненные разрешения

Чтобы узнать, отклонил ли кто-то ваш запрос разрешений, изучите FBSDKLoginResult , возвращенный в обратный вызов FBSDKLoginManager или в делегат FBSDKLoginButton :

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 Graph, проверьте объект 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");
    }
}];

Подробнее см. в разделе Обработка ошибок, SDK для iOS.

Запрос дополнительных разрешений

Запросить дополнительные разрешения можно с помощью FBSDKLoginManager . Отклоненные разрешения можно запросить повторно с использованием методов logInWith*: . FBSDKLoginManager определяет повторный запрос по доступности [FBSDKAccessToken currentAcccessToken].

Отзыв разрешений

Вы можете позволить людям отменять или отзывать разрешения, предоставленные вашему приложению. Например, в приложении может быть страница с настройками, где пользователи могут отключить некоторые функции.

Чтобы отозвать разрешения, выполните вызов к конечной точке API Graph.

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

Отзыв входа

Если вы хотите отозвать все права для этого приложения, выполните вызов API Graph, который удалит все разрешения. Используйте код из раздела Отзыв разрешений и измените путь запроса на /me/permissions.


Отзыв разрешений через Graph API Explorer

Для целей тестирования вы можете отменить права на отзыв разрешений без использования своего приложения. Сделать это можно с помощью Graph API Explorer.

  1. Войдите в Graph API Explorer.
  2. Выберите свое приложение.
  3. Нажмите Get Token > Get Access Token.
  4. Чтобы отменить права для выбранного приложения, нажмите Clear .

Отзыв одного разрешения:

  1. Укажите в поле ввода путь /me/permissions/{permission-name} , где {permission-name}— имя разрешения, которое нужно отозвать, например email.
  2. Переключитесь с GET на DELETE.
  3. Нажмите кнопку Submit .
Graph API Explorer