我正在构建一个使用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
进程两次?
答案 0 :(得分:0)
是的,您可以使用内置Facebook帐户的iOS 6(实际上不使用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的实例,并且弱链接社交和帐户框架。
P.S。以下是您的Facebook App的设置(您可以在顶部看到您的App ID):
希望这有帮助!
答案 1 :(得分:0)
您可以使用+requestForMe
:
-(void)getUserEmail
{
[[FBRequest requestForMe] startWithCompletionHandler:^(FBRequestConnection *connection, NSDictionary <FBGraphUser> *user, NSError *error){
if (!error) {
NSString *email = [user objectForKey:@"email"];
NSLog(@"email : %@", email);
}
}];
}