FBConnect: session: didLogin никогда не вызывался, начиная со второго раза, когда пользователь пытается войти в систему?

Я пытаюсь использовать 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];
}

person Massimo Cafaro    schedule 13.01.2010    source источник


Ответы (1)


Теперь это работает. Вот соответствующий код, обрабатывающий сеанс. Я не показываю другие методы, потому что экземпляр сеанса нигде не изменяется. Я надеюсь, что это может быть полезно другим людям.

- (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)viewDidLoad {

   [_session resume];

   ...

}



- (void)dealloc {
    [_session.delegates removeObject: self];
    [_session release], _session = nil;

        ...

    [super dealloc];
}
person Massimo Cafaro    schedule 13.01.2010
comment
Хм, не было ли других изменений кода по вашему вопросу? У меня тот же код, что и в вашем ответе, но все еще сессия: didLogin: не срабатывает после возврата к моему представлению совместного доступа в Facebook. Вы используете @ property / @ synthesize с _session? Что-нибудь еще вы могли изменить? - person Growth Mindset; 14.01.2010
comment
Других изменений кода нет; _session НЕ является свойством, поэтому в коде не появляется @ property / @ synthesize. Больше я ничего не менял, потому что получение разрешения, обновление статуса и загрузка изображения уже работали нормально. - person Massimo Cafaro; 14.01.2010
comment
Вы представляете свой взгляд на Facebook с другой точки зрения? Или это единственное представление, с которым вы работаете? Я представляю свое представление Facebook с другого представления и задаюсь вопросом, нужно ли что-то еще, что мне нужно сделать, чтобы получить session: didLogin: для запуска после возврата в представление FB. - person Growth Mindset; 15.01.2010
comment
Да, я показываю контроллер представления Facebook, начиная с другого. Помимо шагов, которые я изложил в своем ответе, я больше ничего не делаю. - person Massimo Cafaro; 15.01.2010