0

FBConnect SDK を使用して Facebook に接続しようとしています。ユーザーが最初にログインしようとすると、すべてが正常に機能します。デリゲート メソッドsession:didLoginが呼び出された後、ユーザーのステータスを更新し、写真をアップロードするための拡張アクセス許可を取得できます。ただし、ユーザーがログアウト ボタンをタップして再度接続しようとすると、2 回目以降は常にsession:didLoginNEVER が呼び出されます。これは、セッションがキャッシュされている場合 (ユーザが FBLoginDialog のチェックボックスをクリックした場合) とキャッシュされていない場合の両方で発生します。

拡張アクセス許可を取得するためにユーザーがタップする必要があるボタンの表示を開始するには、セッションが確立されたときに正しく認識する必要があります。

次の可能性のうち、正しい/予想される動作はどれですか?

1) セッションがキャッシュされている場合、ユーザーの 2 回目のログインはsession:didLogin呼び出されませんが、セッションは実際に接続されており (つまり、接続されている_session.IsConnected必要がありますYES)、セッションを確立するために他に何もする必要はありません。

2) セッションがキャッシュされている場合、ユーザーが 2 回目にログインしたときsession:didLoginに呼び出されず、セッションが接続されないため、セッションを確立するためにさらにアクションが必要になります (この場合はどうすればよいでしょうか?);

3) セッションがキャッシュされていない場合、ユーザーが 2 回目にログインしたとき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 に答える