0

我正在尝试使用 FBConnect SDK 连接到 Facebook。用户第一次尝试登录时一切正常:session:didLogin调用委托方法,然后我可以获得更新用户状态和上传图片的扩展权限。但是,当用户点击注销按钮,尝试再次连接时,从第二次开始,这总是导致session:didLoginNEVER 调用。这在会话被缓存(用户单击 FBLoginDialog 中的复选框)和未缓存时都会发生。

我只需要在建立会话时正确识别,以便开始显示用户需要点击以获得扩展权限的按钮。

以下可能性中正确/预期的行为是什么?

session:didLogin1)如果会话被缓存,则不会调用用户第二次登录但会话实际上已连接(即_session.IsConnected必须是YES),无需执行任何其他操作即可建立会话;

session:didLogin2)如果会话被缓存,则不会调用用户第二次登录并且会话未连接,因此需要进一步操作来建立会话(这种情况我应该怎么做?);

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];
}
4

1 回答 1

0

现在它起作用了。这是处理会话的相关代码。我没有展示其他方法,因为会话实例没有在其他地方以任何方式修改。我希望这对其他人有用。

- (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];
}
于 2010-01-13T22:21:29.353 回答