我正在尝试使用 FBConnect SDK 连接到 Facebook。用户第一次尝试登录时一切正常:session:didLogin
调用委托方法,然后我可以获得更新用户状态和上传图片的扩展权限。但是,当用户点击注销按钮,尝试再次连接时,从第二次开始,这总是导致session:didLogin
NEVER 调用。这在会话被缓存(用户单击 FBLoginDialog 中的复选框)和未缓存时都会发生。
我只需要在建立会话时正确识别,以便开始显示用户需要点击以获得扩展权限的按钮。
以下可能性中正确/预期的行为是什么?
session:didLogin
1)如果会话被缓存,则不会调用用户第二次登录但会话实际上已连接(即_session.IsConnected
必须是YES
),无需执行任何其他操作即可建立会话;
session:didLogin
2)如果会话被缓存,则不会调用用户第二次登录并且会话未连接,因此需要进一步操作来建立会话(这种情况我应该怎么做?);
3)如果会话没有被缓存,那么session:didLogin
会调用用户第二次登录并建立会话;
相关代码如下。请让我知道是否有问题以及您当前实现多个正确登录的最佳实践,而与会话状态(缓存与否)无关。先感谢您。
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
if (self = [super initWithNibName:@"FacebookViewController" bundle:nibBundleOrNil]) {
if (kGetSessionProxy) {
_session = [[FBSession sessionForApplication:kApiKey getSessionProxy:kGetSessionProxy delegate:self] retain];
} else {
_session = [[FBSession sessionForApplication:kApiKey secret:kApiSecret delegate:self] retain];
}
}
return self;
}
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
BOOL resumed = [_session resume];
_loginButton.style = FBLoginButtonStyleWide;
if (_session.isConnected) {
_permissionButton.hidden = NO;
}
else{
_permissionButton.hidden = YES;
}
_statusButton.hidden = YES;
_photoButton.hidden = YES;
if(([_session isConnected] || resumed) && self.name){
_label.text = [NSString stringWithFormat:@"%@ %@", NSLocalizedString(@"Logged in as", nil), self.name];
}
else{
_label.text = [NSString stringWithFormat:@"%@", NSLocalizedString(@"You are not logged in", nil)];
}
}
- (void)session:(FBSession*)session didLogin:(FBUID)uid {
NSLog(@"session:didLogin:");
if(_session && session != _session){
[_session release], _session = nil;
}
if(!_session){
_session = [session retain];
}
_label.text = @"";
_permissionButton.hidden = YES;
_statusButton.hidden = YES;
_photoButton.hidden = YES;
NSString* fql = [NSString stringWithFormat:@"select uid,name from user where uid == %lld", session.uid];
NSDictionary* params = [NSDictionary dictionaryWithObject:fql forKey:@"query"];
[[FBRequest requestWithDelegate:self] call:@"facebook.fql.query" params:params];
}
- (void)dealloc {
[_session.delegates removeObject: self];
[_session release], _session = nil;
[_permissionButton release], _permissionButton = nil;
[_statusButton release], _statusButton = nil;
[_photoButton release], _photoButton = nil;
[name release], name = nil;
[super dealloc];
}