2013-03-21 119 views
0

我正在构建使用Facebook电子邮件的webview ios app。 我GOOGLE了我的问题,所有这些问题的答案都是从这个函数的东西:如何从Facebook提取Facebook电子邮件ios sdk 3.1?

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

是的,您可以使用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应用程序的设置(你可以看到你的应用程序ID在顶部): enter image description here

希望这有助于!

+0

谢谢。这看起来像我想要的,但我无法得到这项工作。看起来,如果(授予)返回false,所以它会变成其他的。然而,我没有得到“有一个错误检索...”日志要么..为什么这将是? – 2013-03-25 07:12:44

+0

@SeungHyunSeanLee,我有同样的错误。要修复它,你应该再次检查你的Facebook应用程序的设置。他们应该像上面的图片一样(确保您的包ID(com.yourcompany.yourapp)是正确的,并且您已启用“Facebook登录”)。还要确保你的self.accountStore被实例化,而不是零! 它适用于我,所以如果您还有其他几个问题 - 我很乐意为您提供帮助。 P.S.如果用户未在iOS设置中登录Facebook或登录,但不允许您的应用在第一次启动时使用FB帐户,则会显示“检索到错误...”。 – 2013-03-25 08:17:26

0

您可以使用+requestForMe为:

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

为了使用FBGraphUser字典,您需要使用我的问题发布的代码。就像我说过的,我正在寻求一种获取Facebook ID的方式,而无需使用该代码 – 2013-03-25 07:09:09

相关问题