通过Facebook iOS Parse.com登录用户

时间:2015-12-30 21:31:41

标签: ios objective-c facebook parse-platform

我正在尝试通过我的parse.com应用程序中的Facebook登录用户。我已经有了所有的id和appdelegate方法。

我在故事板中创建了一个视图,并将其设为facebook登录按钮,然后我将其作为IBAction连接到我的.h文件。

我的代码:

- (IBAction)fblogin:(FBSDKLoginButton *)sender {
    [PFFacebookUtils logInInBackgroundWithReadPermissions:@[@"public_profile", @"email"] block:^(PFUser *user, NSError *error) {
        if (error) {
                   //     NSLog(@"Uh oh. The user cancelled the Facebook login.");
            UIAlertView *alertVeiw = [[UIAlertView alloc] initWithTitle:@"Sorry" message:[error.userInfo objectForKey:@"error"] delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];

            [alertVeiw show];

        } else if (!user) {
            UIAlertView *alertVeiw = [[UIAlertView alloc] initWithTitle:@"Sorry" message:@"You cancelled Login, try again!" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];

            [alertVeiw show];
        }else {
                 //       NSLog(@"User logged in through Facebook!");
           // [self dismissViewControllerAnimated:YES completion:NULL];

            FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:@{@"fields": @"first_name, last_name, email, public_profile"}];
            [request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error)
             {
                 if (error)
                 {
                     UIAlertView *alertVeiw = [[UIAlertView alloc] initWithTitle:@"Sorry" message:[error.userInfo objectForKey:@"error"] delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];

                     [alertVeiw show];

                 } else if ([[error userInfo][@"error"][@"type"] isEqualToString: @"OAuthException"]) { // Since the request failed, we can check if it was due to an invalid session
                     //   NSLog(@"The facebook session was invalidated");
                     [PFFacebookUtils unlinkUserInBackground:[PFUser currentUser]];
                 }
                 else {

                     NSDictionary *userData = (NSDictionary *)result;
                     //   [self requestFacebookUser:user];

                     NSString *name = userData[@"name"];
                     NSString *email = userData[@"email"];

                     user.username = name;
                     user.email = email;
                     [user saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error)
                      {
                          if (error)
                          {
                              UIAlertView *alertVeiw = [[UIAlertView alloc] initWithTitle:@"Sorry" message:[error.userInfo objectForKey:@"error"] delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];

                              [alertVeiw show];

                          }
                          else {
                              // [self dismissViewControllerAnimated:NO completion:nil];
                              //[self.navigationController popToRootViewControllerAnimated:NO];
                              [self performSegueWithIdentifier:@"inbox" sender:self];
                          }
                      }];
                 }
             }];
        }
    }];
}

当我按登录facebook按钮然后我们登录然后没有任何反应时,才会打开faccebook网页。

请帮我逐步正确执行facebook登录。

编辑:

app delegate:

[PFFacebookUtils initializeFacebookWithApplicationLaunchOptions:launchOptions];

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {

    return [[FBSDKApplicationDelegate sharedInstance] application:application
                                                          openURL:url
                                                sourceApplication:sourceApplication
                                                       annotation:annotation];
}

applicationWillEnterForeGround:
[FBSDKAppEvents activateApp];

然后:

与你的(SanitLee)答案一起,我有这些方法:

- (void)loginViewFetchedUserInfo:(FBSDKLoginManager *)loginView
                            user:(FBSDKProfile*)user {

}

-(void)loginButton:(FBSDKLoginButton *)loginButton didCompleteWithResult:(FBSDKLoginManagerLoginResult *)result error:(NSError *)error{
  //  [self performSegueWithIdentifier:@"inbox" sender:self];
}

-(void)loginButtonDidLogOut:(FBSDKLoginButton *)loginButton{

}

-(void)loginButtonClicked{
}

我的视图不在窗口层次结构中也会出现此错误!

1 个答案:

答案 0 :(得分:0)

这是我如何做到的,它对我有用。 首先,在你的m文件中导入:

#import <ParseFacebookUtils/PFFacebookUtils.h>//fb login for parse

然后以下代码应该做你想要的:

- (IBAction)loginButtonTouchHandler:(id)sender {          
  NSArray *permissionsArray = @[ @"user_about_me", @"user_relationships", @"user_birthday", @"user_location"];
  [MBProgressHUD showHUDAddedTo:self.view animated:YES];
  [PFFacebookUtils logInWithPermissions:permissionsArray block:^(PFUser *user, NSError *error) {
  if (!user) {
     NSString *errorMessage = nil;
     if (!error) {
        NSLog(@"Uh oh. The user cancelled the Facebook login.");
        errorMessage = NSLocalizedString(@"Uh oh. The user cancelled the Facebook login.", nil);
     } else {
        NSLog(@"Uh oh. An error occurred: %@", error);
        errorMessage = [error localizedDescription];
     }
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Log In Error", nil) message:errorMessage delegate:nil cancelButtonTitle:nil otherButtonTitles:NSLocalizedString(@"Dismiss", nil), nil];
     [MBProgressHUD hideHUDForView:self.view animated:YES];
     [alert show];  
  } else {
     if (user.isNew) {
        NSLog(@"User with facebook signed up and logged in!");
        [self _loadData];               
     } else {
        NSLog(@"User with facebook logged in!");
     }
     [MBProgressHUD hideHUDForView:self.view animated:YES];
     [self _presentNextViewControllerAnimated:YES];
  } 
  }];
}

- (void)_presentNextViewControllerAnimated:(BOOL)animated {
  PAWWallViewController *wallViewController = [[PAWWallViewController alloc] initWithNibName:nil bundle:nil];
  [(UINavigationController *)self.presentingViewController pushViewController:wallViewController animated:NO];
  [self.presentingViewController dismissModalViewControllerAnimated:YES];
}

- (void)_loadData {
  FBRequest *request = [FBRequest requestForMe];
  [request startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
  if (!error) {
     PFUser *user = [PFUser currentUser];
     NSDictionary *userData = (NSDictionary *)result;
     NSString *facebookID = userData[@"id"];
     NSString *name = userData[@"name"];
     NSString *email = userData[@"email"];
     NSString *location = userData[@"location"][@"name"];
     NSString *gender = userData[@"gender"];
     NSString *birthday = userData[@"birthday"];
     NSString *relationship = userData[@"relationship_status"];
     NSString *facebookLink = [NSString stringWithFormat:@"Facebook.com/%@", facebookID];
     NSURL *pictureURL = [NSURL URLWithString:[NSString stringWithFormat:@"https://graph.facebook.com/%@/picture?type=large&return_ssl_resources=1", facebookID]];  
     NSLog(@"facebookID --> %@", facebookID);
     NSLog(@"name --> %@", name);
     NSLog(@"email --> %@", email);
     //for profile image
     NSURLRequest *urlRequest = [NSURLRequest requestWithURL:pictureURL];
     // Run network request asynchronously
     [NSURLConnection sendAsynchronousRequest:urlRequest queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response,     NSData *data, NSError *connectionError) {
     if (connectionError == nil && data != nil) {
        PFFile *userImageFile = [PFFile fileWithName:@"userImage.jpg" data:data];
        if (userImageFile) [user setObject:userImageFile forKey:kPAWParseUserImageKey];
     }

     [user setObject:facebookID forKey:kPAWParseUsernameKey]; //initially use fb id as username to avoid duplication
     [user setObject:name forKey:kPAWParseRealnameKey];
     [user setObject:facebookLink forKey:kPAWParseFacebookKey];

     [user saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
     if (!error) {
        if (succeeded) {
           NSLog(@"fb user saved successfully");
        }
     } else {
        NSLog(@"fb user saved unsuccessfully");
     }
     }];
   }];

   } else if ([[[[error userInfo] objectForKey:@"error"] objectForKey:@"type"]
                isEqualToString: @"OAuthException"]) {
        NSLog(@"The facebook session was invalidated");

        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Log out of Spotpost?", nil) message:nil delegate:self cancelButtonTitle:NSLocalizedString(@"Log out", nil) otherButtonTitles:NSLocalizedString(@"Cancel", nil), nil];
        [alertView show];

   } else {
     NSLog(@"Some other error: %@", error);
   }
   }];
}

以下是我在app delegate中配置的方式:

#import <ParseFacebookUtils/PFFacebookUtils.h> //fb login for parse
....
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  ...
  [PFFacebookUtils initializeFacebook]; //fb login for parse 
  return YES;
}

- (void)applicationDidBecomeActive:(UIApplication *)application {
  ....
  [FBAppCall handleDidBecomeActiveWithSession:[PFFacebookUtils session]]; //fb login for parse
}

- (BOOL)application:(UIApplication *)application
        openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
     annotation:(id)annotation {
  return [FBAppCall handleOpenURL:url
              sourceApplication:sourceApplication
                    withSession:[PFFacebookUtils session]];
}


- (void)applicationWillTerminate:(UIApplication *)application {
  [[PFFacebookUtils session] close];
}