FB Синглтон Войти

Я создаю синглтон для доступа ко всем методам Facebook и хочу обрабатывать диалоговое окно входа в этот синглтон.

Я следил за руководством по iOS SDK на Facebook, но оно позволяет мне входить в систему только при запуске приложения, а не тогда, когда пользователь нажимает кнопку.

Какая альтернатива

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
return [self.facebook handleOpenURL:url];
}

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
return [self.facebook handleOpenURL:url];
}

Кажется, проблема в том, что мое приложение не переключается на браузер или приложение FB для входа в систему. Когда я реализую то же самое в AppDelegate, это работает, но сразу после запуска приложения.


person btype    schedule 04.01.2012    source источник


Ответы (2)


Я решил это так:

в AppDelegate:

-(void)connectToFacebook{
facebook = [[Facebook alloc] initWithAppId:kAPPID andDelegate:self];

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if ([defaults objectForKey:@"FBAccessTokenKey"] 
    && [defaults objectForKey:@"FBExpirationDateKey"]) {
    facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"];
    facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"];

}

if (![facebook isSessionValid]) {
    [facebook authorize:nil];
}
}

// For 4.2+ support
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
return [facebook handleOpenURL:url]; 
}

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

И в Синглтоне:

- (id)init {
self = [super init];
if (self != nil) {
    NBNAppDelegate *delegate = (NBNAppDelegate *)[[UIApplication sharedApplication] delegate];
    [delegate connectToFacebook];
    facebook =  delegate.facebook;        
}
return self;
}
person btype    schedule 07.01.2012

Хотя вы приняли свое собственное решение как работающее, существует простое решение исходного вопроса, заключающееся в наличии кода входа в синглтон. Единственное, что вам нужно добавить в свой делегат приложения, это openURL (и handleOpenURL для поддержки до версии 4.2). Вот пример:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 
{
    if ([[url scheme] isEqualToString:[NSString stringWithFormat:@"fb%@", facebookAppId]]) {        
        return [[FacebookSingleton sharedFacebook].facebook handleOpenURL:url]; 
    }
}

Все остальное, что вы можете поместить в свой синглтон (включая весь ваш код входа), и вам не нужно загромождать делегат вашего приложения. Затем ваш синглтон реализует код FBSessionDelegate. В этом примере кода предполагается, что вы объявляете свойство в своем синглтоне под названием «facebook». Именно здесь живет объект Facebook, а не в вашем делегате.

Примечание. Я проверяю схему перед отправкой URL-адреса в Facebook. Это нужно только в том случае, если ваше приложение поддерживает другие схемы.

Если кому-то нужен код синглтона, оставьте сообщение, и я тоже могу его опубликовать.

person Joel    schedule 08.05.2012