使用社交框架从 Facebook 获取基本信息(id、first_name) - 附上源代码和屏幕截图

Posted

技术标签:

【中文标题】使用社交框架从 Facebook 获取基本信息(id、first_name) - 附上源代码和屏幕截图【英文标题】:Fetching basic information (id, first_name) from Facebook by using Social Framework - source code and screenshots attached 【发布时间】:2013-12-29 20:32:09 【问题描述】:

对于以后的文字游戏,我试图通过使用社交框架来获取有关玩家的非常基本的信息:

身份证 名字 性别 位置

(即没有像 email 这样敏感的东西,而且我不使用 Facebook ios SDK)。

所以在 Xcode 5.0.2 中,我为 iPhone 创建了一个空白的单视图应用程序,并将 Social.framework 添加到 构建阶段 选项卡。

然后我将以下代码添加到ViewController.m:

#import "ViewController.h"
#import <Social/Social.h>
#import <Accounts/Accounts.h>

#define FB_APP_ID @"432298283565593"
//#define FB_APP_ID @"262571703638"

@interface ViewController ()
@property (strong, nonatomic) ACAccountStore *accountStore;
@end

@implementation ViewController

- (void)viewDidLoad

    [super viewDidLoad];

    NSLog(@"Facebook is available: %d", [SLComposeViewController isAvailableForServiceType:SLServiceTypeFacebook]);

    [self getMyDetails];


- (void) getMyDetails 
    if (!_accountStore) 
        _accountStore = [[ACAccountStore alloc] init];
    

    ACAccountType *facebookAccountType = [_accountStore
                                        accountTypeWithAccountTypeIdentifier: ACAccountTypeIdentifierFacebook];
    NSDictionary *options = @
                              ACFacebookAppIdKey: FB_APP_ID,
                              ACFacebookPermissionsKey: @[@"basic_info"];

    [_accountStore requestAccessToAccountsWithType:facebookAccountType
                                           options:options
                                        completion:^(BOOL granted, NSError *error)
    
        if (granted) 
            NSLog(@"Basic access granted");
         else 
            NSLog(@"Basic access denied %@", error);
        
    ];


@end

并创建a new Facebook app,我将de.afarber.MyFacebook指定为iOS Bundle ID

最后在 Apple iTunes Connect 中,我创建了一个新的 App ID,然后创建了一个新应用(带有一个虚拟图标,甚至附有 2 个 iPhone 屏幕截图):

我的 Xcode Info 选项卡和其余的源代码不变:

更新 2:

我已经按照有用的 cmets 的建议更新了源代码,谢谢。

另外,我有another Facebook game,它适用于 Adob​​e AIR 桌面和移动应用程序(自 1-2 年以来)(但现在我尝试学习本机 iOS 编程)并且我尝试了它的 id 262571703638 没有成功。

并且我已按照 Mohit10 的建议将 FacebookAppID 添加到 MyFacebook-Info.plist(在我看来,只有 Facebook SDK 才需要它,而我尝试使用 Social Framework - 但它不会受到伤害......)

现在我得到了调试器的输出:

2013-12-31 11:08:07.584 MyFacebook[3009:70b] Facebook is available: 1
2013-12-31 11:08:07.964 MyFacebook[3009:3903] Basic access granted

我只需要弄清楚,现在如何获取 id、名字、性别、位置(以及是否真的需要 basic_info)...

【问题讨论】:

不确定是否与您看到的错误完全相关,但您请求的权限(id、first_name、gender、location)实际上不是有效的 FB 权限。有关有效权限的列表,请参阅developers.facebook.com/docs/reference/login 我采用了与 php 版本(我的其他应用程序)中相同的字符串,所以我想知道您的意思是什么字符串? 我不确定您的其他应用程序是做什么的,我只知道“id”和“first_name”不是有效的 Facebook 权限,不应传递给 ACFacebookPermissionsKey。诸如“basic_info”、“user_birthday”之类的东西是权限。您设置的参数看起来像您实际发出用户请求时想要的字段(即 &fields=id,gender,first_name,location)。 你是对的,也许我应该试试SLRequest 不要求权限... 【参考方案1】:

借助有用的 cmets(谢谢),我终于能够使用以下代码获取一些信息:

#import "ViewController.h"
#import <Social/Social.h>
#import <Accounts/Accounts.h>

#define FB_APP_ID @"432298283565593"
//#define FB_APP_ID @"262571703638"

@interface ViewController ()
@property (strong, nonatomic) ACAccount *facebookAccount;
@property (strong, nonatomic) ACAccountType *facebookAccountType;
@property (strong, nonatomic) ACAccountStore *accountStore;
@end

@implementation ViewController

- (void)viewDidLoad

    [super viewDidLoad];

    if (NO == [SLComposeViewController isAvailableForServiceType: SLServiceTypeFacebook]) 
        [self showAlert:@"There are no Facebook accounts configured. Please add or create a Facebook account in Settings."];
        return;
    

    [self getMyDetails];


- (void) getMyDetails 
    if (! _accountStore) 
        _accountStore = [[ACAccountStore alloc] init];
    

    if (! _facebookAccountType) 
        _facebookAccountType = [_accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];
    

    NSDictionary *options = @ ACFacebookAppIdKey: FB_APP_ID ;

    [_accountStore requestAccessToAccountsWithType: _facebookAccountType
                                           options: options
                                        completion: ^(BOOL granted, NSError *error) 
        if (granted) 
            NSArray *accounts = [_accountStore accountsWithAccountType:_facebookAccountType];
            _facebookAccount = [accounts lastObject];

            NSURL *url = [NSURL URLWithString:@"https://graph.facebook.com/me"];

            SLRequest *request = [SLRequest requestForServiceType:SLServiceTypeFacebook
                                                    requestMethod:SLRequestMethodGET
                                                              URL:url
                                                       parameters:nil];
            request.account = _facebookAccount;

            [request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) 
                NSDictionary *responseDictionary = [NSJSONSerialization JSONObjectWithData:responseData
                                                                                   options:NSJSONReadingMutableContainers
                                                                                     error:nil];
                NSLog(@"id: %@", responseDictionary[@"id"]);
                NSLog(@"first_name: %@", responseDictionary[@"first_name"]);
                NSLog(@"last_name: %@", responseDictionary[@"last_name"]);
                NSLog(@"gender: %@", responseDictionary[@"gender"]);
                NSLog(@"city: %@", responseDictionary[@"location"][@"name"]);
            ];
         else 
            [self showAlert:@"Facebook access for this app has been denied. Please edit Facebook permissions in Settings."];
        
    ];


- (void) showAlert:(NSString*) msg 
    dispatch_async(dispatch_get_main_queue(), ^(void) 
        UIAlertView *alertView = [[UIAlertView alloc]
                                  initWithTitle:@"WARNING"
                                  message:msg
                                  delegate:nil
                                  cancelButtonTitle:@"OK"
                                  otherButtonTitles:nil];
        [alertView show];
    );


@end

这会打印我的数据:

id: 597287941
first_name: Alexander
last_name: Farber
gender: male
city: Bochum, Germany

如果您有任何改进建议,非常欢迎。

【讨论】:

【参考方案2】:

您的代码有一些问题。

ACAccountStore *accountStore 超出范围,它应该是一个实例变量。 您不需要 ACFacebookAudienceKey,这是用于发布的。 你不需要ACFacebookPermissionsKey,因为你想要的属性是available by default

通过这些修复,您的代码仍然不适合我,尽管它确实适用于我的 App ID。我收到以下错误:

"The Facebook server could not fulfill this access request: Invalid application 432298283565593" UserInfo=0x1d5ab670 NSLocalizedDescription=The Facebook server could not fulfill this access request: Invalid application 432298283565593

您应用的 Facebook 配置似乎有问题。

我能看到的唯一区别是我的应用是沙盒的,并且我使用我的开发者帐户登录。祝你好运。

【讨论】:

谢谢,我已经按照(我认为)你的建议更新了源代码......并且还尝试了另一个(已经工作的)Facebook Id 应用程序 - 但错误仍然相同:@ 987654326@。明天我将在我的问题上设置 500 赏金 您是否更新了 BundleID 以匹配有效的 Facebook 应用 ID?在执行此操作之前删除应用程序并进行干净的重建也没有什么坏处,因为 Xcode 可能会感到困惑。【参考方案3】:

由于您没有对 .plist 文件进行任何更改,因此您需要在 .plist 文件中添加您的 FacebookAppID。从中我认为这将有助于您获取用户详细信息,并且您也可以从您的设置中集成它。

【讨论】:

谢谢,但FacebookAppID 不是用于 Facebook iOS SDK(用于FBSession)吗?虽然我正在尝试使用 Apple Social Framework...【参考方案4】:

答案很简单

在 viewDidLoad() 中使用:

accountStore= [[ACAccountStore alloc]init];
facebookAccountType= [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];

NSDictionary *options= @
ACFacebookAudienceKey: ACFacebookAudienceEveryone,
ACFacebookAppIdKey: @"<YOUR FACEBOOK APP ID>",
ACFacebookPermissionsKey: @[@"public_profile"]

                          ;


[accountStore requestAccessToAccountsWithType:facebookAccountType options:options completion:^(BOOL granted, NSError *error) 

    if (granted) 
        NSLog(@"Permission has been granted to the app");
        NSArray *accounts= [accountStore accountsWithAccountType:facebookAccountType];
        facebookAccount= [accounts firstObject];
        [self performSelectorOnMainThread:@selector(facebookProfile) withObject:nil waitUntilDone:NO];

     else 
        NSLog(@"Permission denied to the app");
    
];

/////还有函数 -(void)facebookProfile

NSURL *url = [NSURL URLWithString:@"https://graph.facebook.com/me"];

//////注意你需要的参数被添加为字典 ///完整列表见下文 ////https://developers.facebook.com/docs/graph-api/reference/user

NSDictionary *param=[NSDictionary dictionaryWithObjectsAndKeys:@"picture,id,name",@"fields", nil];

SLRequest *profileInfoRequest= [SLRequest requestForServiceType:SLServiceTypeFacebook requestMethod:SLRequestMethodGET URL:url parameters:param];
profileInfoRequest.account= facebookAccount;


[profileInfoRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) 
    NSLog(@"Facebook status code is : %ld", (long)[urlResponse statusCode]);

    if ([urlResponse statusCode]==200) 

        NSDictionary *dictionaryData= [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableLeaves error:&error];



     else 

    
];



【讨论】:

以上是关于使用社交框架从 Facebook 获取基本信息(id、first_name) - 附上源代码和屏幕截图的主要内容,如果未能解决你的问题,请参考以下文章

使用社交框架从 Facebook 注销

从多个社交网络(Facebook 和 Linkedin...)获取统一配置文件的数据库方案

使用自己的 API 后端处理社交网络身份验证

facebook ios sdk 或苹果社交框架

facebook问题的iOS社交框架

使用 iOS 中的社交框架向 Facebook 朋友发送消息或应用请求