使用 Parse iOS 登录 Facebook 和 twitter 只能使用一次

Posted

技术标签:

【中文标题】使用 Parse iOS 登录 Facebook 和 twitter 只能使用一次【英文标题】:Facebook and twitter login with Parse iOS only works once 【发布时间】:2014-12-30 09:41:25 【问题描述】:

我在 Parse SDK 中使用 twitter 和 Facebook 登录。对于每个应用程序启动,我可以登录每个服务一次,但是当我使用 [PFUser logOut] 注销时,我无法再次登录。 [PFFacebookUtils logInWithPermissions] 块永远不会被用户或错误调用。

我的 (Facebook) 登录代码是:

- (IBAction)facebookLogin:(id)sender 
    NSArray *permissionsArray = @[ @"user_about_me" ];

    // Login PFUser using Facebook
    [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 = @"Uh oh. The user cancelled the Facebook login.";
             else 
                NSLog(@"Uh oh. An error occurred: %@", error);
                errorMessage = [error localizedDescription];
            
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Log In Error"
                                                            message:errorMessage
                                                           delegate:nil
                                                  cancelButtonTitle:nil
                                                  otherButtonTitles:@"Dismiss", nil];
            [alert show];
         else 
            if (user.isNew) 
                NSLog(@"User with facebook signed up and logged in!");
             else 
                NSLog(@"User with facebook logged in!");
            
        
    ];

我的登出码是:

- (IBAction)loginButton:(id)sender 
    if([PFUser currentUser]) 
        [PFUser logOut];        
        NSLog(@"User is %@", [PFUser currentUser]);
        NSLog(@"Facebook session is %@", [PFFacebookUtils session]);
        NSLog(@"Facebook session is %@", FBSession.activeSession.observationInfo);
     else 
        [self performSegueWithIdentifier:@"loginScreenSegue" sender:self];
    

一切都记录下来(空)。

我认为由于 Twitter 的行为是相同的,它可能与我的 AppDelegate 中的 OAuth 相关方法有关:

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


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

但是已经做了很多研究,似乎没有遗漏任何东西......

我在 AppDelegate 中也有这些:

- (void)applicationWillResignActive:(UIApplication *)application 
    [[PFFacebookUtils session] close];


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


- (void)applicationDidBecomeActive:(UIApplication *)application 
    [FBAppCall handleDidBecomeActiveWithSession:[PFFacebookUtils session]];

任何帮助都将非常感激!

【问题讨论】:

您使用的是匿名用户吗? 首先,您在 LOGIN 方法中调用注销用户,这与您要实现的目标相反。此外,每次应用退出活动状态时,您都会关闭会话 - 这发生在屏幕锁定和主页按钮上。你确定你想要那个逻辑吗? @soulshined - 谢谢,我没有使用匿名用户,我将其关闭。 @Ivan - 我的登录按钮是一个切换按钮 - 所以当登录按钮更改为“注销”并且当用户注销时,它将对登录视图控制器执行模态 segue - 谢谢对于关闭会话 cmets,我在疲惫和绝望时将其添加到 applicationWillResignActive! 【参考方案1】:

在您的注销方法中,您应该清除 Facebook 会话令牌,如下所示:

[[FBSession activeSession]closeAndClearTokenInformation];

这将清除活动 Facebook 会话的令牌。

【讨论】:

谢谢 - 我已经添加了这一点,但没有区别。我只是尝试使用 ParseUI 而不是我自己的登录视图控制器,但问题完全相同,这让我认为它是外部的东西或 appDelegate 中的东西。【参考方案2】:

好的,我终于解决了这个问题。问题是在我在 Twitter 上的应用设置中,权限设置为“只读”,而不是“读写”。

更改此设置解决了 facebook 和 twitter 的问题。

【讨论】:

以上是关于使用 Parse iOS 登录 Facebook 和 twitter 只能使用一次的主要内容,如果未能解决你的问题,请参考以下文章

Facebook 使用 Parse SDK 登录(iOS 9、Xcode 7.1、Swift 2.1)

通过 Facebook iOS Parse.com 登录用户

调用 Parse Facebook 登录时的 SIGABRT 信号

iOS:使用 Parse 获取 Facebook 的用户数据

使用 Parse.com iOS 获取 Facebook 好友

在 Parse ios SDK 中重新授权 Facebook 应用程序