facebook - iOS Facebook 原生登录(不带 Facebook SDK)

标签 facebook ios6 ios7 acaccountstore

我正在尝试使用 native (iOS 6-7x) 库从我的应用中授权用户使用 Facebook。登录成功后,我想将身份验证 token 传递给我的服务器。

下面的代码工作正常,除非用户没有在操作系统中设置他们的 Facebook 帐户。在这种情况下,我收到以下错误:

Error Domain=com.apple.accounts Code=6 "The operation couldn’t be completed. (com.apple.accounts error 6.)

-(void) initFacebookLogin
{
    LRAppDelegate *appDelegate = [[UIApplication sharedApplication]delegate];

    if (appDelegate.accountStore == nil)
        appDelegate.accountStore = [[ACAccountStore alloc] init];

    __block ACAccount *facebookAccount = nil;

    ACAccountType *facebookAccountType = [appDelegate.accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];

    NSArray * permissions = @[@"publish_stream", @"publish_actions", @"email"];

    NSMutableDictionary *options = [[NSMutableDictionary alloc] initWithObjectsAndKeys:FACEBOOK_APP_ID, ACFacebookAppIdKey, permissions, ACFacebookPermissionsKey, ACFacebookAudienceOnlyMe, ACFacebookAudienceKey, nil];

    [appDelegate.accountStore requestAccessToAccountsWithType:facebookAccountType
        options: options
        completion: ^(BOOL granted, NSError *error) {

           if ( granted )
           {
               NSArray *accounts = [appDelegate.accountStore accountsWithAccountType:facebookAccountType];

               facebookAccount = [accounts lastObject];

               ACAccountCredential* accountCredential = [facebookAccount credential];

               NSString* token = [accountCredential oauthToken];

               NSLog( @"token=%@", token );
           }
           else {
               // WHAT DO I DO HERE???
               // Error Domain=com.apple.accounts Code=6 "The operation couldn’t be completed. (com.apple.accounts error 6.)"
               NSLog(@"%@", [error description]);
           }
       }];
}

我还需要使用 Facebook SDK 来要求用户登录吗?我可以使用另一个 iOS native 库来提示用户在 iOS 中设置 Facebook 访问权限吗?

或者,是否有更好的方法来简化 Facebook 身份验证(如果用户已经在操作系统中登录,则不要求用户登录)?

最佳答案

你应该看看这里的 Facebook 文档(有一个简单的登录示例):

https://developers.facebook.com/docs/ios/ios-sdk-tutorial/authenticate/

在我看来,我会使用 Facebook SDK 来执行登录,您可以这样做:

/* Constants */
#define K_FACEBOOK_REQUEST_CREDENTIALSURL @"me/?fields=id,location,name,username,bio,picture,gender,website,birthday,email"
#define K_FACEBOOK_PERMISSIONS @[@"user_about_me",@"user_birthday",@"email"]

/* Facebook Keys */
#define K_FACEBOOK_REQUEST_ID @"id"
#define K_FACEBOOK_REQUEST_USERNAME @"username"
#define K_FACEBOOK_REQUEST_LOCATION @"location"
#define K_FACEBOOK_REQUEST_FULLNAME @"name"
#define K_FACEBOOK_REQUEST_BIO @"bio"
#define K_FACEBOOK_REQUEST_WEBSITE @"website"
#define K_FACEBOOK_REQUEST_EMAIL @"email"
#define K_FACEBOOK_REQUEST_BIRTHDAY @"birthday"
#define K_FACEBOOK_REQUEST_GENDER @"gender"

- (void)initWithLoginFacebook
{
  [PFFacebookUtils logInWithPermissions:K_FACEBOOK_PERMISSIONS block:^(PFUser *user, NSError *error) {
    if (!user) {
        if (!error) 
          NSLog("ERROR_CAUSE_AUTH_USERCANCELLED");
        else 
          NSLog("ERROR_CAUSE_AUTH_FAILEDLOGIN");
    } else if (user.isNew) {
        FBRequest *request = [FBRequest requestForMe];
        [request startWithCompletionHandler:^(FBRequestConnection *connection,id result,NSError *error) {
            if (error) 
              NSLog("ERROR_CAUSE_AUTH_FAILEDLOGIN");
            else 
              [self requestLoginFacebook:result];
        }];
    } else
        NSLog("User logged and not new!");
  }];
}

- (void)requestLoginFacebook:(id)result
 {
    NSDictionary *userData = (NSDictionary *)result;
    // Do something with the data... For example
    NSString *facebookId = userData[K_FACEBOOK_REQUEST_ID];
    NSString *name = userData[K_FACEBOOK_REQUEST_FULLNAME];
    NSString *username = [userData[K_FACEBOOK_REQUEST_USERNAME] lowercaseString];
    NSString *bio = userData[K_FACEBOOK_REQUEST_BIO];
    NSString *website = userData[K_FACEBOOK_REQUEST_WEBSITE];
    NSString *location = userData[K_FACEBOOK_REQUEST_LOCATION][@"name"];
    NSString *gender = userData[K_FACEBOOK_REQUEST_GENDER];
    NSString *birthday = userData[K_FACEBOOK_REQUEST_BIRTHDAY];
    NSString *email = userData[K_FACEBOOK_REQUEST_EMAIL];
    NSString *profileImage = [NSString stringWithFormat:@"https://graph.facebook.com/%@/picture?width=180&height=180",userData[@"id"]];

}

您必须在 appDelegate 和 .plist 文件中配置 Facebook SDK。

只有当用户在设备设置中设置了 Facebook 帐户时,您的代码才能正常工作。

我.

关于facebook - iOS Facebook 原生登录(不带 Facebook SDK),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19853865/

相关文章:

objective-c - 如何解决 Objective-C 中的 "NSInternalInconsistencyException"错误?

ios7 empty autolayout布局已经模棱两可

javascript - 如何通过 javascript api 在 Facebook 上发布多张照片?

ios - AVAudioPlayer 只播放自定义音频文件一秒

android - 应用程序在开始 Facebook Activity 时强制关闭

ios - XCode 4.5 - 架构 armv7 的 undefined symbol

iphone - facebook uri 方案在 iOS6 上不再起作用吗?

iphone - 在 iOS 6 和 iOS 7 中更改不同的 UIImage 颜色

iphone - Facebook 给出安全警告 : Please treat the URL above as you would your password and do not share it with anyone

android - iOS\Android Facebook SDK - 获取好友列表,有些没有用户名