2012-01-04 84 views
1

我正在创建一个单例以访问所有Facebook方法,并且想要处理此单例中的登录对话框。FB Singleton登录

我遵循Facebook上的iOS SDK教程,但它只允许我在应用程序启动时登录,而不是在用户按下按钮时登录。

请告诉我替代

- (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中实现相同的东西时,它可以工作,但在应用程序启动后立即生效。

回答

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; 
} 
1

虽然你接受了自己的解决方案为工作,有一个简单的解决方案到完成在单身人士登录代码的原始问题。你需要在你的应用程序委托中唯一需要的是openURL(和4.2版本的handleOpenURL支持)。这里有一个例子:

- (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之前,我检查了方案。如果你的应用程序有其他可以接受的方案,你只需要这个。

如果有人想要单身代码,请留言,我也可以发布。

+0

我绝对有兴趣看到单身代码队友。 – 2012-05-26 20:28:39

+0

在这里,你走了。 http://pastebin.com/Gz9Sm7Ww – Joel 2012-05-26 21:12:29