2012-01-04 104 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