Я пытаюсь использовать FBConnect SDK для подключения к Facebook. Все работает нормально, когда пользователь пытается войти в систему в первый раз: вызывается метод делегата session:didLogin
, после чего я могу получить расширенное разрешение на обновление статуса пользователя и загрузку изображения. Однако, когда пользователь нажимает кнопку выхода, пытаясь подключиться снова, начиная со второго раза, это всегда приводит к session:didLogin
НИКОГДА не вызывается. Это происходит как тогда, когда сеанс кэшируется (пользователь нажимает флажок в FBLoginDialog), так и когда это не так.
Мне просто нужно правильно распознать, когда сеанс установлен, чтобы начать показывать кнопку, которую пользователь должен нажать, чтобы получить расширенное разрешение.
Каково правильное / ожидаемое поведение среди следующих возможностей?
1) если сеанс кэширован, то второй раз, когда пользователь входит в session:didLogin
, не будет вызываться, но сеанс фактически подключен (т.е. _session.IsConnected
должен быть YES
), и ничего больше не нужно делать для установления сеанса;
2) если сеанс кэширован, то второй раз, когда пользователь входит в session:didLogin
, не будет вызываться и сеанс не будет подключен, поэтому требуются дальнейшие действия для установления сеанса (что мне делать в этом случае?);
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];
}