如何从 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 如何发布到朋友的时间线避免不推荐使用的标题