当用户退出我的 iOS 应用程序时,下次他们尝试使用 Facebook 登录时,他们应该必须重新输入他们的登录凭据

Posted

技术标签:

【中文标题】当用户退出我的 iOS 应用程序时,下次他们尝试使用 Facebook 登录时,他们应该必须重新输入他们的登录凭据【英文标题】:When a user logs out of my iOS app, the next time they try to login with Facebook, they should have to re-enter their login credentials 【发布时间】:2014-06-13 04:22:20 【问题描述】:

我正在使用 Parse 和 Facebook 框架构建一个 ios 应用程序。

我让用户登录

-(void)updateUserInformation


    FBRequest *request = [FBRequest requestForMe];

    [request startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) 

        if (!error)

            NSDictionary *userDictionary = (NSDictionary *)result;

            NSString *facebookID = userDictionary[@"id"];
            NSURL *pictureURL = [NSURL URLWithString:[NSString stringWithFormat:@"https://graph.facebook.com/%@/picture?type=large&return_ssl_resources=1", facebookID]];

            NSMutableDictionary *userProfile = [[NSMutableDictionary alloc]initWithCapacity:8];
            if (userDictionary[@"name"])
                userProfile[kJFUserProfileNameKey] = userDictionary[@"name"];
            
            if (userDictionary[@"first_name"])
                userProfile[kJFUserProfileFirstNameKey] = userDictionary[@"first_name"];
            
            if (userDictionary[@"location"][@"name"])
                userProfile[kJFUserProfileLocationKey] = userDictionary[@"location"][@"name"];
            
            if (userDictionary[@"gender"])
                userProfile[kJFUserProfileGenderKey] = userDictionary[@"gender"];
            
            if (userDictionary[@"birthday"])
                userProfile[kJFUserProfileBirthdayKey] = userDictionary[@"birthday"];
                NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
                [formatter setDateStyle:NSDateFormatterShortStyle];
                NSDate *date = [formatter dateFromString:userDictionary[@"birthday"]];
                NSDate *now = [NSDate date];
                NSTimeInterval seconds = [now timeIntervalSinceDate:date];
                int age = seconds / 31536000;
                userProfile[kJFUserProfileAgeKey] = @(age);
            
            if (userDictionary[@"interested_in"])
                userProfile[kJFUserProfileInterestedInKey] = userDictionary[@"interested_in"];
            
            if (userDictionary[@"relationship_status"])
                userProfile[kJFUserProfileRelationshipStatusKey] = userDictionary[@"relationship_status"];
            
            if ([pictureURL absoluteString])
                userProfile[kJFUserProfilePictureURL] = [pictureURL absoluteString];
            

            [[PFUser currentUser] setObject:userProfile forKey:kJFUserProfileKey];
            [[PFUser currentUser] saveInBackground];

        

    ];



#pragma mark - from initial login controller



- (IBAction)loginWithFBButtonPressed:(UIButton *)sender 

    NSArray *permissionsArray = @[ @"user_about_me", @"user_relationships", @"user_birthday", @"user_location", @"user_friends"];

    [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
            [self performSegueWithIdentifier:@"loginToMainSegue" sender:self];
            [self updateUserInformation];
        
    ];


登录或注销用户没有问题。但是,当我确实将用户注销并弹出到根视图控制器(带有“使用 facebook 登录”按钮的那个)时,如果我单击该按钮,Facebook 会在 Safari 选项卡上打开,并且最后一个用户的 Facebook 帐户已经处于活动状态。用户无需输入登录信息,而是收到消息“您已经授权 thisApp”以及“取消”和“确定”按钮。

注销按钮发生在 TableViewController 中。

[更新 1]

即使在实施了这些附加方法之后,我的用户仍然可以登录 Facebook。我尝试了 unLink 方法,但这似乎不是我想要的,因为在这样做之后,当我重新登录用户时,该用户的应用内数据不再属于他。

if (indexPath.row == 3) 
    identifier = nil;

    NSLog(@"pressed logout");

    [PFUser logOut];
    [[PFFacebookUtils session]closeAndClearTokenInformation];
    [[PFFacebookUtils session]close];
    [[FBSession activeSession]closeAndClearTokenInformation];
    [[FBSession activeSession]close];
    [FBSession setActiveSession:nil];

    [self.navigationController popToRootViewControllerAnimated:YES];

我需要做什么才能让用户从手机本身退出 Facebook,而不是仅仅从应用程序上的当前会话中退出?

【问题讨论】:

你用什么让用户登录? PFLogInViewController? @godmoney - 检查更新 【参考方案1】:

您好,不知道您使用的是哪个 Facebook sdk,但通常要从 Facebook 注销,您必须清除令牌信息并关闭会话,请参阅 developers.facebook 和以下链接。

http://developers.facebook.com/docs/reference/ios/3.0/class/FBSession/

http://developers.facebook.com/docs/reference/ios/3.0/class/FBSession/#close

[FBSession.activeSession closeAndClearTokenInformation];
[FBSession.activeSession close];
[FBSession setActiveSession:nil];

您还可以检查与您的问题相关的这两个问题:-

Facebook 图形 api 注销不起作用

Facebook iOS SDK 3.1.1“closeAndClearTokenInformation”方法无效

希望对你有帮助

【讨论】:

除了清除token外,还需要清除Safari登录Facebook时存储的cookie。 NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; for(NSHTTPCookie *cookie in [storage cookies]) NSString *domainName = [cookie domain]; NSRange domainRange = [域名 rangeOfString:@"facebook"]; if(domainRange.length > 0) [存储 deleteCookie:cookie]; 我先做什么重要吗? 它仍然让用户保持登录状态----你是否成功地使用了 Parse 后端?【参考方案2】:

在注销之前尝试从 Facebook 取消链接用户对象。

[PFFacebookUtils unlinkUserInBackground:[PFUser currentUser] block:^(BOOL Success,NSError *unlinkError)
                    if(!unlinkError)
                        // User unlinked
                    else
                       // Erro while unlink user
                    
                ];

【讨论】:

【参考方案3】:

您的应用可以选择使用 Facebook 登录,并仅在您的应用上控制登录/注销。

如果需要,他们的 Facebook 帐户的登录是通过代理完成的,但您不能将他们从 Facebook 注销,因为这会影响使用 Facebook 的所有其他应用程序。

如果用户想要退出 Facebook,他们要么使用 Facebook 应用,要么在设备上的“设置”中进行。

【讨论】:

在我的 iOS 模拟器中,在我没有登录 Facebook 的设置下

以上是关于当用户退出我的 iOS 应用程序时,下次他们尝试使用 Facebook 登录时,他们应该必须重新输入他们的登录凭据的主要内容,如果未能解决你的问题,请参考以下文章

iOS 沙盒测试用户帐户无法正常工作

如何在用户退出时暂停我的应用程序,并在他们重新进入应用程序时恢复它?

iOS - 当应用程序被用户强制退出时处理静默推送通知

Javascript - 当用户点击退出按钮时,确认框重定向用户

iPhone:有条件地加载视图

我如何告诉我所有的自动布局约束来更新自己? (例如,当用户更新他们的系统大小/动态类型时)?