При повторном входе в систему вызов Facebook API iOS завершается неудачно, но isSessionValid - ДА - PullRequest
3 голосов
/ 12 июля 2011

У меня странная проблема с мобильным API fb.Я использую последнюю версию git.

В моем приложении пользователь может войти в Facebook при запуске приложения.Если пользователь не имеет допустимого сеанса (например, не вошел в систему, проверен с загруженными FBCredentials в пользовательских значениях по умолчанию), вызывается код авторизации facebook.Пользователь входит в систему, и он возвращается в мое приложение (новый токен + время, сохраненное в настройках пользователя по умолчанию).После этого я вызываю простой запрос / me.Я получаю данные с Facebook, все в порядке.

Но теперь вот в чем загвоздка: пользователь закрывает приложение (все еще вошел в систему).Пользователь снова открывает приложение.Мое приложение проверяет, есть ли у пользователя допустимый сеанс (опять же, проверяется с помощью загруженных FBCredentials в пользовательских значениях по умолчанию), и возвращает YES (то, что я ожидал).Но на этот раз вызов API сразу после входа / запуска приложения ничего не возвращает!Все остальные вызовы API ничего не возвращают.

Если пользователь выходит из приложения ([facebook logout: self];), а затем снова входит в систему, вызовы API работают.Поэтому я предполагаю, что мои коды не работают с учетными данными загрузки при запуске приложения.

Вот мой контроллер, который отвечает за fb connect.

//
//  FacebookController.h
//

#import <Foundation/Foundation.h>

#import "FBConnect.h"

@interface FacebookController : NSObject <FBRequestDelegate, FBSessionDelegate> {
    Facebook *facebook;
    NSArray *permissions;

}

@property(nonatomic, retain) Facebook *facebook;

+ (FacebookController *)instance;
- (void)loginToFacebook;
- (void)loggedIn;
- (void)logoutOfFacebook;

@end

И реализация:

//
//  FacebookController.m
//

#import "FacebookController.h"
#import "MyAppAppDelegate.h"

static NSString* FBAppId = @"...";

@interface FacebookController()

    - (void)loadFBCredentials;
    - (void)saveFBCredentials;

@end


@implementation FacebookController

@synthesize facebook;

+ (FacebookController *)instance {
    static FacebookController *instance = nil;
    if (!instance) {
        instance = [[FacebookController alloc] init];
    }
    return instance;
}

- (id)init {
    self = [super init];
    if (!facebook) {
        facebook = [[Facebook alloc] initWithAppId:FBAppId];
        [self loadFBCredentials];
    }
    return self;
}

// Show the authorization dialog.
- (void)loginToFacebook {
    if (![facebook isSessionValid]) {
        [facebook authorize:permissions delegate:self];
    } else {
        [self loggedIn];
    }
}

// Show the authorization dialog.
- (void)logoutOfFacebook {
    [facebook logout:self];
}

- (void)loggedIn {
    // Api call.
    [facebook requestWithGraphPath:@"/me" andDelegate:self];
}

// Called when the user has logged in successfully.
- (void)fbDidLogin {
    // Save Credentials.
    [self saveFBCredentials];
    [self loggedIn];
}

- (void)request:(FBRequest *)request didReceiveResponse:(NSURLResponse *)response {

}

- (void)request:(FBRequest *)request didFailWithError:(NSError *)error {

}

- (void)request:(FBRequest *)request didLoad:(id)result {
    NSLog(@"Got request");
    if ([result isKindOfClass:[NSDictionary class]]) {
        NSLog(@"count : %d ", [result count]);
        NSArray* resultArray = [result allObjects];

        NSLog(@"count : %d ", [result count]);
        result = [resultArray objectAtIndex:0];
    }
}

// Called when the request logout has succeeded.
- (void)fbDidLogout {   
    [self saveFBCredentials];

    [(MyAppAppDelegate *)[UIApplication sharedApplication].delegate showModalLoginView:YES]; 
}

- (void)loadFBCredentials {
    NSLog(@"Loading.");
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    if ([defaults objectForKey:@"FBAccessTokenKey"] 
        && [defaults objectForKey:@"FBExpirationDateKey"]) {
        facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"];
        facebook.expirationDate = (NSDate *) [defaults objectForKey:@"FBExpirationDateKey"];
    }
}

- (void)saveFBCredentials {
    NSLog(@"Saving.");
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:[facebook accessToken] forKey:@"FBAccessTokenKey"];
    [defaults setObject:[facebook expirationDate] forKey:@"FBExpirationDateKey"];
    [defaults synchronize];
}

- (void)dealloc {
    [facebook release];
    [super dealloc];
}

@end

1 Ответ

0 голосов
/ 12 июля 2011

Запрос разрешения offline_access и использование ключа токена доступа, сгенерированного по порядку, чтобы избежать недопустимого сценария сеанса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...