如何从 facebook ios sdk 3.1 中提取 facebook 电子邮件?

Posted

技术标签:

【中文标题】如何从 facebook ios sdk 3.1 中提取 facebook 电子邮件?【英文标题】:How to extract facebook email from facebook ios sdk 3.1? 【发布时间】:2013-03-21 09:11:17 【问题描述】:

我正在构建一个使用 facebook 电子邮件的webview ios app。 我用谷歌搜索了我的问题,所有这些答案都来自这个函数:

   NSArray *permissions = [NSArray arrayWithObjects:@"email", nil];
    return [FBSession openActiveSessionWithReadPermissions:permissions
                                              allowLoginUI:allowLoginUI
                                         completionHandler:^(FBSession *session, FBSessionState state, NSError *error) 
                                             [self sessionStateChanged:session state:state error:error];
                                         ];

但我想要的不是来自这个的 facebook 电子邮件地址。 有什么办法吗?

如果我使用此功能,我必须登录两次,这有点烦人。 如果除此之外没有其他方法可以获取电子邮件地址,有没有办法避免两次login 进程?

【问题讨论】:

【参考方案1】:

您可以为此使用+requestForMe

-(void)getUserEmail

    [[FBRequest requestForMe] startWithCompletionHandler:^(FBRequestConnection *connection, NSDictionary <FBGraphUser> *user, NSError *error)
            if (!error) 
                NSString *email = [user objectForKey:@"email"];
                NSLog(@"email : %@", email);
            
        ];

【讨论】:

为了使用 FBGraphUser 字典,您需要使用我在问题中发布的代码。就像我说的那样,我正在寻求一种无需使用该代码即可获取 facebook id 的方法【参考方案2】:

是的,您可以使用 iOS 6 内置的 Facebook 帐户接收电子邮件(实际上不使用 FB SDK)。如果用户已经在 iOS 设置中登录 Facebook,那么他只会在第一次被提示允许您的应用程序访问 FB 帐户。

首先,将其添加到您的界面中:

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

@property (nonatomic, strong) ACAccountStore *accountStore;
@property (nonatomic, strong) ACAccount *facebookAccount;

然后用这个来实现:

- (void)getFacebookPermissions

    if ([SLComposeViewController isAvailableForServiceType:SLServiceTypeFacebook]) 
        // we have facebook account in ios settings
        NSLog(@"Facebook account exists");

        ACAccountType *facebookTypeAccount = [self.accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];

        [self.accountStore requestAccessToAccountsWithType:facebookTypeAccount
                                                   options:@ACFacebookAppIdKey: *YOUR_FACEBOOK_APP_ID_HERE!*, ACFacebookPermissionsKey: @[@"email"]
                                                completion:^(BOOL granted, NSError *error) 
                                                    if (granted) 
                                                        self.facebookAccount = [[self.accountStore accountsWithAccountType:facebookTypeAccount] lastObject];

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

                                                        SLRequest *meRequest = [SLRequest requestForServiceType:SLServiceTypeFacebook
                                                                                                  requestMethod:SLRequestMethodGET
                                                                                                            URL:meURL
                                                                                                     parameters:nil];

                                                        meRequest.account = self.facebookAccount;

                                                        [meRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) 
                                                            if (error) 
                                                                NSLog(@"[ERROR] %@", [error localizedDescription]);
                                                                // or do some error handling
                                                             else 
                                                                NSError *jsonError;
                                                                NSDictionary *responseJSON = [NSJSONSerialization JSONObjectWithData:responseData
                                                                                                                             options:NSJSONReadingAllowFragments
                                                                                                                               error:&jsonError];
                                                                if (jsonError)
                                                                
                                                                    NSLog(@"[FB PARSING ERROR] %@", [error localizedDescription]);
                                                                 else 
                                                                    // here it is!
                                                                    NSString *email = [responseJSON objectForKey:@"email"];
                                                                
                                                            

                                                        ];


                                                     else 
                                                        if (error) 
                                                            NSLog(@"[ERROR] %@", [error localizedDescription]);

                                                        
                                                        else
                                                        
                                                            NSLog(@"Access to Facebook was not granted. Please go to the device settings and allow access for *YOUR_APP_NAME*");
                                                        
                                                    
                                                ];
     else 
        NSLog(@"There was an error retrieving your Facebook account, make sure you have an account setup in Settings and that access is granted for *YOUR_APP_NAME*");
    


不要忘记创建 AccountStore 的实例并弱链接 Social 和 Accounts 框架。

附:以下是您的 Facebook 应用程序的设置(您可以在顶部看到您的应用程序 ID):

希望这会有所帮助!

【讨论】:

谢谢。这似乎是我想要的,但我无法完成这项工作。似乎 if(granted) 返回 false 所以它去了。但是我也没有收到“检索时出错...”日志。为什么会这样? @SeungHyunSeanLee,我遇到了同样的错误。要修复它,您应该再次检查您的 Facebook 应用程序的设置。它们应该像上面的图片一样(确保您的捆绑 ID (com.yourcompany.yourapp) 是正确的并且您启用了“Facebook 登录”)。还要确保您的 self.accountStore 已实例化,而不是 nil!它对我有用,所以如果您还有其他问题 - 我很乐意为您提供帮助。附:如果用户没有在 iOS 设置中登录 Facebook,或者如果他登录但不允许您的应用在首次启动时使用 FB 帐户,则会显示“检索时出错...”。

以上是关于如何从 facebook ios sdk 3.1 中提取 facebook 电子邮件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 facebook iOS SDK 3.1 中发布到朋友的墙上?

如何使用 FB SDK 3.1 和 iOS<6 预览 facebook 状态更新?

使用 Facebook for iOS SDK 3.1 如何发布到朋友的时间线避免不推荐使用的标题

Facebook SDK 3.1 - 验证访问令牌时出错

iOS Facebook SDK 3.1 的设置按钮不起作用

Facebook iOS SDK 3.1 - 发送私人消息