FB Singleton登录

时间:2012-01-04 20:08:37

标签: iphone ios facebook facebook-ios-sdk

我正在创建一个单例来访问所有Facebook方法,我想在这个单例中处理Login对话框。

我在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];
}

这似乎是问题,我的App没有切换到浏览器或FB App登录。 当我在AppDelegate中实现相同的东西时,它可以工作,但是在应用程序启动后立即执行。

2 个答案:

答案 0 :(得分: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 :(得分:1)

尽管您已经接受了自己的解决方案,但是对于原始问题有一个简单的解决方案,可以完成单例中的登录代码。您需要在app代理中添加的唯一内容是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对象所在的地方,而不是你的代表。

注意:我在将网址转发给Facebook之前检查方案。如果您的应用程序具有其接受的其他方案,则只需要此项。

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