使用帐户框架访问 Facebook 时限制权限

Limit permissions when accessing Facebook using Accounts framework

我需要这方面的帮助....

所以我面临的问题是,在从 ACAccount 获取 Facebook 帐户时,警报视图会通知太多权限。当我使用 Facebook 的 ACAccount 登录时,我收到一个警告框。

它说 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”、@“电子邮件”和“喜欢”。警报显示 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.

更新:

查看我的答案以获得解决方案。

修复

此问题的修复涉及将代码添加到视图头文件以及将代码添加到视图文件。下面列出了代码示例。

在视图头文件中添加:

//  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 and over here: https://developers.facebook.com/docs/facebook-login/ios#permissions Facebook 非常值得信赖和信誉。我觉得...

FB SDK 文档中没有任何内容对此进行解释。他们这样做是为了让用户可以使用 Facebook pop UI 并选择他们想要授权的权限。我想 Facebook 的设计理念是为用户提供尽可能多的控制权和透明度。但是使用 OS 弹出窗口隐藏了很多权限。我想显示最少信息是 Apple 的设计理念。这最适合开发人员场景,因为用户通常会在看到应用程序请求如此多的权限时惊慌失措。

无论如何,如果您看一下 FBSDKLoginManager+Internal.h,您可以检查系统登录的功能。进一步挖掘,我发现 FBSDKLoginButton 毫无意义。解决此问题的最佳方法是使用您自己的 FBSDKLoginManager 实例,并将系统帐户类型设置为本机,如果您获得 error code 306,则退回到默认登录机制。

不知何故 ->> 这种方式不显示额外的权限。我不知道怎么办。我所知道的是,现在一切都水到渠成。

此外,您必须为 ACAccountStoreDidChangeNotification 设置一个单独的侦听器,以便处理一些边缘情况。但是,是的,\m/

您不使用 Facebook API 是有原因的吗?通过 iOS APIs 请求访问将要求用户通过 iOS 设置登录 Facebook。如果你用 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
 }];