链接Parse和Facebook导致Facebook会话关闭

3

我正在使用Parse作为我的iOS应用程序后端,我试图使用FBLoginView让用户使用Facebook登录。

我还尝试将用户的Facebook帐户链接到他们的Parse帐户。当我尝试使用以下代码将用户链接到他们的FB时:

if (![PFFacebookUtils isLinkedWithUser:user]) {
    [PFFacebookUtils linkUser:user permissions:nil block:^(BOOL succeeded, NSError *error) {        if (succeeded) {            NSLog(@"Woohoo, user logged in with Facebook!");        }    }];
}

我收到了一个错误消息,告诉我Facebook会话无效。我已经确定上面的代码似乎关闭了Facebook会话(当我注释掉这段代码时,会话不会关闭),并给我带来了错误。有没有人遇到过这个错误?


只是为了明确,您传递给linkUser方法的用户是Parse帐户用户还是Facebook用户?我也试图理解FBLoginView在哪里发挥作用。 - C Abernathy
当用户点击FBLoginView时,我想检查他们是否已经创建了Parse帐户,如果是,则将其Facebook链接到其Parse帐户。 我传递给linkUser的用户是PFUser。 - moneymango
2个回答

0

你的其他应用程序是否使用Parse作为后端?

PFFacebookUtils中存储的用户状态与从FBLoginView返回的用户不同。

如果你的代码看起来像这样:

#pragma mark FBLoginViewDelegate {
- (void)loginViewFetchedUserInfo:(FBLoginView *)loginView
                        user:(id<FBGraphUser>)user {

    // link current user
    NSLog(@"User: %@", user);

    if (![PFFacebookUtils isLinkedWithUser:user]) {
        [PFFacebookUtils linkUser:user permissions:nil block:^(BOOL succeeded, NSError *error) {
            if (succeeded) {
                NSLog(@"Woohoo, user logged in with Facebook!");
            }
        }];
    }
}

那么您当前正在链接一个与PFUser不兼容的Facebook用户对象。我建议使用FBLoginView返回的数据,并以常规方式创建一个解析用户:

#pragma mark FBLoginViewDelegate {
- (void)loginViewFetchedUserInfo:(FBLoginView *)loginView
                            user:(id<FBGraphUser>)user {

    // link current user
    NSLog(@"User: %@", user);

    NSString *username = user[@"email"];
    NSString *password = user[@"id"];

    [PFUser logInWithUsernameInBackground:username password:password block:^(PFUser *user, NSError *error) {
        NSLog(@"User: %@", user);
        if (error.code == 101) {
            // sign up
            PFUser *user = [PFUser user];
            user.username = username;
            user.password = password;
            [user signUpInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
                NSLog(@"Error: %@", error);
            }];
        }
    }];
}

现在,[PFUser currentUser]将返回一个Parse用户对象,该对象是基于您的Facebook登录创建的。如果应用程序被删除/重新安装,则下次用户进入应用程序时,FBLoginView将返回一个userid,该userid将用于作为现有用户登录到解析中。

编辑:我遇到的类似问题是,如果我的手机在iOS设置中集成了Facebook,则使用FBLogin、PFFacebookUtils和任何其他最近的Facebook应用程序登录会出现问题。这似乎与苹果集成Facebook和新的Facebook SDK有关。这很烦人,但我目前必须告诉我的用户从设置中删除他们的Facebook信息,然后他们可以使用PFFacebookUtils或上述过程进行登录。希望这个问题能尽快得到解决。


我正在进行后续操作。当用户点击FBLoginView时,他们会登录到Facebook。然后,我会检查他们的Facebook电子邮件是否属于现有的Parse帐户。如果是,我想给他们在那里立即将两者链接的选项。如果他们选择在那时链接它们,我会通过Parse登录并尝试链接他们的Facebook帐户和Parse帐户。当我这样做时,PFFacebookUtils isLinkedWithUser会关闭Facebook会话,并且链接失败。 - moneymango
1
你正在尝试使用两个不兼容的Facebook库。PFFacebookUtils处理自己的Facebook会话,而FBLoginView使用不同的Facebook会话。如果您正在使用Parse及其FB实用程序,请坚持使用它。FBLoginView适用于返回用户信息字典,例如Facebook ID、姓名、电子邮件,但它不会让PFFacebookUtils处理的Facebook会话知道当前已创建了活动会话。因此,您最好做的是创建一个常规的Parse用户,该用户具有从FBLoginView接收到的某些属性。 - mitrenegade
换句话说,FBLoginView 应该像使用第三方 OAuth 登录一样对待,你会得到一个已认证的真实用户,但 PFFacebookUtils 并不知道它。 - mitrenegade
嗯,那很有趣。我只是假设由于Parse是Facebook拥有的,所以两者应该是完全兼容的。无论如何,感谢您的帮助! - moneymango

-1
对于你问题的第一部分,我找到了一种方法,可以通过使用Parse和Facebook来登录用户进入我的应用程序。实际上,一旦用户使用这个功能,你可以检查应用程序的数据浏览器,并检查所请求的身份验证数据字段和个人资料字段,其中包含所有我在应用程序中请求的fb数据。
这是我用来使用fb进行登录的代码,还没有将之前的用户与fb账号链接起来。
 - (IBAction)loginButtonTouchHandler:(id)sender  {
// The permissions requested from the user
NSArray *permissionsArray = @[ @"user_about_me", @"user_relationships", @"user_birthday", @"user_location"];

// Login PFUser using Facebook
[PFFacebookUtils logInWithPermissions:permissionsArray block:^(PFUser *user, NSError *error) {
    //[_activityIndicator stopAnimating]; // Hide loading indicator

    if (!user) {
        if (!error) {
            NSLog(@"Uh oh. The user cancelled the Facebook login.");
        } else {
            NSLog(@"Uh oh. An error occurred: %@", error);
        }
    } else if (user.isNew) {
        NSLog(@"User with facebook signed up and logged in!");
        //Go to your next view

    } else {
        NSLog(@"User with facebook logged in!");
        //Go to your next view
    }
}];

}

希望这能帮到你!


我正在尝试使用FBLoginView来使我的应用程序与其他利用Facebook集成的应用程序保持一致。当自定义按钮被点击时,这段代码会被调用吗? - moneymango
我本来希望使用FBLoginView以保持一致性,但我可能不得不采取你的方法。 - moneymango
我尝试过,但遇到了一些问题,所以使用了这种方式。这样做更简单,很高兴我的评论能帮助到你! - Jorge Vicente Mendoza
我正在使用您上面的代码,但是出现了解析错误:提供的Facebook会话令牌已过期或无效。(代码:251,版本:1.2.19)。您知道为什么会出现这个错误吗? - moneymango
没有遇到过这个错误,你可以尝试注销用户,然后再尝试登录吗?或者这是所有用户都会出现的问题吗? - Jorge Vicente Mendoza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接