iOS Facebook SDK — проверка разрешений

У меня есть Facebook SSO, который отлично работает в моем приложении, используя последнюю версию Facebook Objective-C SDK. Мне нужно запросить дополнительное разрешение внутри приложения, если пользователь делает «что-то». Мне не нужно спрашивать это разрешение, если пользователь дал мне его раньше, поэтому, я думаю, в Facebook SDK должен быть метод

-(BOOL) checkPermission:(NSString*) permission;

поэтому я могу использовать его так:

if( [facebook checkPermission:@"email"] ) {

Есть ли способ сделать это?


person Giorgio Marziani de Paolis    schedule 13.01.2012    source источник


Ответы (5)


Этот вопрос немного устарел, но теперь вы можете проверить, какие разрешения имеет активный сеанс, не делая запрос графика. Вот как это делается в HelloFacebookSample:

if ([FBSession.activeSession.permissions indexOfObject:@"publish_actions"] == NSNotFound) {
    // permission does not exist
} else {
    // permission exists
}

Просто замените «publish_actions» на «email».

person Raphaël Agneau de Selve    schedule 03.07.2013
comment
[FBSession activeSession].permissions возвращает запрошенные вами разрешения, а не активные. Или, по крайней мере, это то, что я видел. Смотрите мой ответ ниже. Вам нужно [FBRequestConnection startWithGraphPath:@"/me/permissions" completionHandler:...]. - person Ferran Maylinch; 02.07.2014
comment
Я не могу проверить прямо сейчас, но документация говорит об обратном: разрешения, предоставленные токену доступа во время потока аутентификации. developers.facebook.com/docs/reference/ios/current/class / - person Raphaël Agneau de Selve; 04.07.2014
comment
Сегодня я обновил свой модуль Facebook SDK с 3.9.0 до 3.15.1, и теперь [FBSession activeSession].permissions возвращает правильные разрешения, а [FBRequestConnection startWithGraphPath:@"/me/permissions" completionHandler:...] больше их не возвращает (теперь он возвращает {статус: предоставлено, разрешение: установлено}). - person Ferran Maylinch; 07.07.2014

SDK не предоставляет прямого метода для проверки конкретных разрешений, но вы можете проверить, предоставил ли пользователь разрешение вашему приложению, проверив permissions соединение user объект в Graph API

GET https://graph.facebook.com/me/permissions

То же самое можно сделать с помощью запроса FQL на permissions таблица

SELECT email FROM permissions WHERE uid = me()
person Juicy Scripter    schedule 13.01.2012
comment
Спасибо, на основании вашего ответа попробовал методом [facebook requestWithGraphPath:@"me/permissions" andDelegate:self];. Реализация метода делегата работает отлично. Еще раз спасибо - person Giorgio Marziani de Paolis; 13.01.2012
comment
Не могли бы вы добавить код для вашего метода, чтобы определить, было ли разрешение электронной почты активным или нет? Какой будет электронная почта, если разрешение будет предоставлено? - person Smikey; 29.02.2012

ВАЖНО: похоже, это верно для более старой версии Facebook SDK (например, 3.9.0). В 3.15.0 это больше не работает. Вы должны использовать [session.permissions], как говорит Рафаэль Аньо в своем ответе.

Вы должны использовать следующий метод, потому что [FBSession activeSession].permissions, похоже, возвращает запрошенные вами разрешения, а не настоящие.

[FBRequestConnection startWithGraphPath:@"/me/permissions"
                      completionHandler:^(FBRequestConnection *c, id result, NSError *error) {
  if (!error) {
    NSDictionary *permissions= [(NSArray *)[result data] objectAtIndex:0];
    if (![permissions objectForKey:@"publish_actions"]) {
      // Ok, continue with your logic
    } else {
      // Permission not found, maybe request it (see below)
    }
  } else {
    // Treat error
  }
}];

Смотрите здесь для получения дополнительной информации:

https://developers.facebook.com/docs/facebook-login/ios/v2.0#permissions-checking

Если разрешение не найдено, вы можете запросить его следующим образом:

[session requestNewPublishPermissions:PERMISSIONS_YOU_WANT
                      defaultAudience:FBSessionDefaultAudienceFriends
                    completionHandler:^(FBSession* session, NSError* error) {

    // Try again the /me/permissions above
}];
person Ferran Maylinch    schedule 02.07.2014

Вот мой код для FBSDK 4.2.0 для проверки разрешений. Передаваемая строка является именем разрешения, например. "опубликовать_действия"

- (void) checkForPermission:(NSString *)permission granted:(void (^)(void))sBlock denied:(void (^)(void))fBlock {

  if ([FBSDKAccessToken currentAccessToken]) {

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

        BOOL hasPermission = NO;

        if (!error) {

            NSArray *permissions = [result objectForKey:@"data"];

            for (NSDictionary *dict in permissions) {

                if ([[dict objectForKey:@"permission"] isEqualToString:permission]) {

                    if ([[dict objectForKey:@"status"] isEqualToString:@"granted"]) {

                        hasPermission = YES;
                    }
                }
            }
         }

        if (hasPermission) {

            (sBlock) ? sBlock() : sBlock;

        } else {

            (fBlock) ? fBlock() : fBlock;
        }
     }];

  } else {

    (fBlock) ? fBlock() : fBlock;
}
}
person Tyler White    schedule 01.07.2015

Для SDK 4+ у вас есть два способа получить разрешения:

[[FBSDKAccessToken currentAccessToken] hasGranted:@"user_photos"]

or

[[[FBSDKAccessToken currentAccessToken] permissions] containsObject:@"user_photos"]
person Pochi    schedule 24.06.2016