Ограничить разрешения при доступе к Facebook с использованием структуры учетных записей
Мне нужна помощь в этом...
Итак, проблема, с которой я сталкиваюсь, заключается в том, что при получении учетной записи Facebook из ACAccount представление предупреждения сообщает слишком много разрешений. Я получаю окно предупреждения, когда я использую логин ACAccount для facebook.
В нем говорится APP_NAME would like to access your basic profile info and list of friends
Это отображается даже тогда, когда мои разрешения установлены пустым массивом.
NSArray * FB_PERMISSIONS = @[];
// or FB_PERMISSIONS = @[@"public_profile", @"likes", @"email"];
// It does not matter what the array is -> The alert has extra sentences.
ACAccountType *FBaccountType= [_accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];
NSString *key = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"FacebookAppID"];;
NSDictionary *dictFB = [NSDictionary dictionaryWithObjectsAndKeys:key,ACFacebookAppIdKey,FB_PERMISSIONS,ACFacebookPermissionsKey, nil];
[_accountStore requestAccessToAccountsWithType:FBaccountType options:dictFB completion:
Что я пытаюсь сделать здесь?
Мне просто нужно "public_profile", "email" и "нравится". Предупреждение сообщает APP_NAME would like to access your profile, and likes on your behalf. In addition, APP_NAME would like to access your basic profile info and list of friends
Почему это второе предложение? Как я могу избавиться от него? Я вижу несколько приложений, где вторая строка, в которой говорится об основном профиле и списке друзей, не отображается.
Ожидаемый результат:
APP_NAME would like to access your profile and likes.
Update:
Проверьте мой ответ для решения.
Ответы
Ответ 1
В документах FB SDK ничего не говорится об этом. Они сделали это так, чтобы пользователи могли использовать пользовательский интерфейс Pop Pop Facebook и выбирать разрешения, которые они хотят разрешить. Я думаю, что философия дизайна Facebook заключается в том, чтобы дать пользователю больше контроля и прозрачности. Но при всплывающем меню ОС скрывается множество разрешений. Я думаю, это философия Apple, чтобы показать минимальную информацию. Это лучше всего подходит для сценариев разработчиков, поскольку пользователи обычно выходят из себя, когда видят так много разрешений, задаваемых приложением.
В любом случае, если вы посмотрите FBSDKLoginManager+Internal.h
, вы можете проверить возможности входа в систему. Дальше копая, я обнаружил, что FBSDKLoginButton бессмыслен. Лучший способ сделать это - использовать свой собственный экземпляр FBSDKLoginManager и установить тип учетной записи системы как native, а если вы получите error code 306
, вернитесь к механизму входа по умолчанию.
Как-то → > Этот способ не показывает дополнительных разрешений. Я понятия не имею, как это сделать. Все, что я знаю, это то, что теперь все встает на свои места.
Кроме того, вам нужно будет настроить отдельный прослушиватель для ACAccountStoreDidChangeNotification
, чтобы вы могли привязать некоторые кромки. Но да,\m/
Ответ 2
Исправление
Исправление этой проблемы связано с добавлением кода в файл заголовка представления, а также добавлением кода в файл вида. Примеры кода приведены ниже.
В файл заголовка представления добавьте:
// ViewController.h
#import <FBSDKLoginKit/FBSDKLoginKit.h>
@interface ViewController : UIViewController
@property (weak, nonatomic) IBOutlet FBSDKLoginButton *loginButton;
@end
И в файл вида добавьте:
loginButton.readPermissions =
@[@"public_profile", @"email", @"likes"];
Обратите внимание, что комментарий в первом примере был только для справки.
Почему это произошло?
Причина, по которой возникла ваша проблема, заключалась в том, что по умолчанию для платформы учетных записей и Facebook API подразумевается каждое разрешение. Это требует от вас более конкретного кода. Я уверен, что вы должны сделать первый пример кода, который должен был попасть в ваш заголовочный файл. Я понимаю, что приведенный выше код не является тем, что вы поместите в файл, над которым работаете, но он просто дает вам общее представление об этом.
Все еще запутано?
Если вы все еще смущены, прокомментируйте ниже, и я попытаюсь обновить свой ответ. Было бы очень полезно, если бы вы могли отправить код, который вы делали, с массивами, заполненными не пустым. Если бы я был неясен, скажите мне, и я сделаю все возможное, чтобы помочь. Извините, если есть какие-либо неудобства!
Источники
В основном, я нашел информацию здесь: https://developers.facebook.com/docs/facebook-login/permissions/overview и здесь: https://developers.facebook.com/docs/facebook-login/ios#permissions
Facebook очень заслуживает доверия и заслуживает доверия. Я думаю...
Ответ 3
Есть ли причина, по которой вы не используете API Facebook? Запрос доступа через API iOS потребует, чтобы пользователь был зарегистрирован в Facebook через настройки iOS. Если вы сделаете тот же запрос с Facebook API, он сможет определить, зарегистрирован ли пользователь через настройки, приложение FB или Safari. И если пользователь не войдет в систему, он попросит их сделать это (в отличие от просто ошибки и указания им сделать это с помощью настроек)
Версия 4.X:
https://developers.facebook.com/docs/facebook-login/ios/permissions
FBSDKLoginManager *loginManager = [[FBSDKLoginManager alloc] init];
[loginManager logInWithReadPermissions:@[@"public_profile", @"likes", @"email"]
fromViewController:self
handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
//TODO: process error or result
}];
Версия 3.X
[FBSession openActiveSessionWithReadPermissions: @[@"public_profile", @"likes", @"email"]
allowLoginUI:YES
completionHandler:
^(FBSession *session, FBSessionState state, NSError *error) {
// Handle completion by calling AppDelegate
}];