【问题标题】:Linking Parse and Facebook causes Facebook session to close链接 Parse 和 Facebook 会导致 Facebook 会话关闭
【发布时间】:2014-09-29 23:34:27
【问题描述】:

我在我的 iOS 应用程序上使用 Parse 作为后端,我正在尝试使用 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 出现在图片中的位置。
  • @CAbernathy 当用户单击 FBLoginView 时,我想检查他们是否已经创建了 Parse 帐户,如果是,则将他们的 Facebook 链接到他们的 Parse 帐户。我传递给 linkUser 的用户是 PFUser。

标签: ios facebook parse-platform


【解决方案1】:

您的其他应用是否使用 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!");
            }
        }];
    }
}

那么您当前正在将 Facebook 用户对象与不兼容的 PFUser 链接。我建议使用 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] 将返回一个解析用户对象,该对象是根据您的 Facebook 登录创建的。如果应用被删除/重新安装,下次用户进入应用时,FBLoginView会返回一个userid,用于登录解析为现有用户。

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

【讨论】:

  • 我在做后者。当用户单击 FBLoginView 时,他们将登录到 Facebook。然后我检查他们的 Facebook 电子邮件是否属于现有的 Parse 帐户。如果是这样,我想让他们选择在当时和那里将两者联系起来。如果他们当时选择链接他们,我通过 Parse 登录并尝试链接他们的 Facebook 帐户和 Parse 帐户。当我这样做时,Facebook 会话由 PFFacebookUtils isLinkedWithUser 关闭,链接失败。
  • 您正在尝试使用两个不是为协同工作而构建的 facebook 库。 PFFacebookUtils 处理自己的 Facebook 会话,而 FBLoginView 使用不同的 Facebook 会话。如果您使用 Parse 及其 FB 实用程序,请坚持使用。 FBLoginView 可以很好地为您返回用户信息字典,即facebook id、姓名、电子邮件,但它不会让PFFacebookUtils 处理的Facebook 会话知道当前活动会话已创建。因此,使用这两者的最佳方法是创建一个常规解析用户,该用户具有您从 FBLoginView 收到的一些属性。
  • 换句话说,FBLoginView 应该被视为另一个 API,例如如果您使用第三方 oauth 登录。您将获得一个您知道是真实的经过身份验证的用户,但 PFFacebookUtils 不知道它。
  • 嗯,这很有趣。我只是假设 Parse 归 Facebook 所有,因此两者将完全兼容。无论如何,感谢您的帮助!
【解决方案2】:

对于您问题的第一部分,我找到了一种方法,只需将 Facebook 与 Parse 结合使用即可让用户登录我的应用程序。实际上,一旦用户使用它,您就可以检查您的应用程序的数据浏览器并检查身份验证数据文件和配置文件,其中包含我在应用程序中请求的所有 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 集成的应用程序保持一致。单击自定义按钮时是否调用此代码?
  • 我希望使用 FBLoginView 来保持一致性,但我可能不得不采用你的方法。
  • 我确实尝试过,但我遇到了一些问题并以这种方式使用它,它有点简单,很高兴我的评论对你有所帮助!
  • 我正在使用您上面的代码,但我收到解析错误:提供的 Facebook 会话令牌已过期或无效。 (代码:251,版本:1.2.19)。你知道我为什么会收到这个错误吗?
  • 还没有这个错误,你可以尝试注销你的用户,然后再尝试登录吗?还是您的所有用户都会出现这种情况?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-10
  • 2014-04-19
  • 1970-01-01
相关资源
最近更新 更多