【问题标题】:How to extract facebook email from facebook ios sdk 3.1?如何从 facebook ios sdk 3.1 中提取 facebook 电子邮件?
【发布时间】: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 进程?

【问题讨论】:

    标签: ios facebook facebook-ios-sdk


    【解决方案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 帐户,则会显示“检索时出错...”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-18
    相关资源
    最近更新 更多