当用户退出我的 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 登录时,他们应该必须重新输入他们的登录凭据的主要内容,如果未能解决你的问题,请参考以下文章
如何在用户退出时暂停我的应用程序,并在他们重新进入应用程序时恢复它?