Facebook Api在iOS应用程序中检入用户

我正在寻找使用Facebook Api来检查iOS应用程序中的用户。

我想知道如果我有在AppDelegate中设置的权限,但希望用户检查从不同的视图控制器我必须在每个视图控制器与FBRequestDelegate,FBSessionDelegate,FBDialogDelegate委托方法声明Facebook实例吗? 还是在AppDelegate中是一次性的事情?

谢谢你的帮助。

我刚刚处理完全相同的问题。 这是我的解决scheme:

我创build了一个基本上包含以下方法的FBRequestWrapper

#import <Foundation/Foundation.h> #import "Facebook.h" #define FB_APP_ID @"xx" #define FB_APP_SECRET @"xx" @interface FBRequestWrapper : NSObject <FBRequestDelegate, FBSessionDelegate> { Facebook *facebook; BOOL isLoggedIn; } @property (nonatomic, retain) Facebook *facebook; @property (nonatomic, assign) BOOL isLoggedIn; + (id) defaultManager; - (void) setIsLoggedIn:(BOOL) _loggedIn; - (void) FBSessionBegin:(id) _delegate; - (void) FBLogout; - (void) getFBRequestWithGraphPath:(NSString*) _path andDelegate:(id) _delegate; - (void) sendFBRequestWithGraphPath:(NSString*) _path params:(NSMutableDictionary*) _params andDelegate:(id) _delegate; @end 

所以所有的Facebook东西都在这个Singleton类中pipe理。

在我的AppDelegate我调用身份validation 。 因为在我看来,加载所有控制器之前必须完成authentication。

 // FACEBOOK requestWrapper = [FBRequestWrapper defaultManager]; BOOL loggedIn = [requestWrapper isLoggedIn]; // if the user is not currently logged in begin the session if (!loggedIn) { [requestWrapper FBSessionBegin:(id)self]; } else { NSLog(@"Is already logged in!"); } // Check if the access token is already there. In that case the user is already authenticated with facebook. // Directly load the controllers and do not wait till facebook has returned back the access_token if([[NSUserDefaults standardUserDefaults] objectForKey:@"access_token"] != nil && [[NSUserDefaults standardUserDefaults] objectForKey:@"exp_date"] != nil) { [self loadControllers]; } 

您可以看到,我也将accessToken存储在NSUserDefaults空间中。 因为我们使用accessToken作为我们web服务的authentication。

我的AppDelegate方法委托FBSessionDelegate方法:

 @interface AppDelegate : UIResponder <UIApplicationDelegate, UITabBarControllerDelegate, FBSessionDelegate> 

这里是执行最重要的方法fbDidLogin

 - (void) fbDidLogin { NSLog(@"AccessToken: %@", requestWrapper.facebook.accessToken); [[NSUserDefaults standardUserDefaults] setObject:requestWrapper.facebook.accessToken forKey:@"access_token"]; [[NSUserDefaults standardUserDefaults] setObject:requestWrapper.facebook.expirationDate forKey:@"exp_date"]; [[NSUserDefaults standardUserDefaults] synchronize]; [self loadControllers]; } 

在这里,我将accesstoken存储在NSUserDefaults中,如果一切正常,请加载所有的控制器。

现在,如果你想 AppDelegate之外的任何控制器访问Facebook Graph API,你也可以使用FBRequestWrapper:

 - (IBAction)test:(id)sender { // FBRequestWrapper NSString *graphPath = @"me/friends"; [[FBRequestWrapper defaultManager] getFBRequestWithGraphPath:graphPath andDelegate:self]; } 

这里来自FBRequestWrapper.m的代码:

 #import "FBRequestWrapper.h" static FBRequestWrapper *defaultWrapper = nil; @implementation FBRequestWrapper @synthesize isLoggedIn, facebook; + (id) defaultManager { if (!defaultWrapper) defaultWrapper = [[FBRequestWrapper alloc] init]; return defaultWrapper; } - (void) setIsLoggedIn:(BOOL) _loggedIn { isLoggedIn = _loggedIn; if (isLoggedIn) { [[NSUserDefaults standardUserDefaults] setObject:facebook.accessToken forKey:@"access_token"]; [[NSUserDefaults standardUserDefaults] setObject:facebook.expirationDate forKey:@"exp_date"]; [[NSUserDefaults standardUserDefaults] synchronize]; } else { [[NSUserDefaults standardUserDefaults] setObject:@"" forKey:@"access_token"]; [[NSUserDefaults standardUserDefaults] setObject:@"" forKey:@"exp_date"]; [[NSUserDefaults standardUserDefaults] synchronize]; } } - (void) FBSessionBegin:(id) _delegate { if (facebook == nil) { facebook = [[Facebook alloc] initWithAppId:FB_APP_ID andDelegate:_delegate]; [facebook setSessionDelegate:_delegate]; NSString *token = [[NSUserDefaults standardUserDefaults] objectForKey:@"access_token"]; NSDate *exp = [[NSUserDefaults standardUserDefaults] objectForKey:@"exp_date"]; if (token != nil && exp != nil && [token length] > 2) { isLoggedIn = YES; facebook.accessToken = token; facebook.expirationDate = [NSDate distantFuture]; [self setIsLoggedIn:isLoggedIn]; NSLog(@"Access token: %@", facebook.accessToken); } } if(![facebook isSessionValid]) { NSArray *permissions = [NSArray arrayWithObjects:@"offline_access", @"read_friendlists", @"user_about_me", nil]; // if no session is available login [facebook authorize:permissions]; } } - (void) FBLogout { [[NSUserDefaults standardUserDefaults] setObject:@"" forKey:@"access_token"]; [[NSUserDefaults standardUserDefaults] setObject:@"" forKey:@"exp_date"]; [[NSUserDefaults standardUserDefaults] synchronize]; [facebook logout:self]; } // Make simple requests - (void) getFBRequestWithGraphPath:(NSString*) _path andDelegate:(id) _delegate { if (_path != nil) { [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES]; if (_delegate == nil) _delegate = self; if(isLoggedIn) { NSLog(@"is logged in in the get method"); } else { NSLog(@"Is NOT logged in the get metthod"); } [facebook requestWithGraphPath:_path andDelegate:_delegate]; } } // Used for publishing - (void) sendFBRequestWithGraphPath:(NSString*) _path params:(NSMutableDictionary*) _params andDelegate:(id) _delegate { if (_delegate == nil) _delegate = self; if (_params != nil && _path != nil) { [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES]; [facebook requestWithGraphPath:_path andParams:_params andHttpMethod:@"POST" andDelegate:_delegate]; } } #pragma mark - #pragma mark FacebookSessionDelegate - (void)fbDidLogin { isLoggedIn = YES; [[NSUserDefaults standardUserDefaults] setObject:facebook.accessToken forKey:@"access_token"]; [[NSUserDefaults standardUserDefaults] setObject:facebook.expirationDate forKey:@"exp_date"]; [[NSUserDefaults standardUserDefaults] synchronize]; } - (void)fbDidNotLogin:(BOOL)cancelled { isLoggedIn = NO; } - (void)fbDidLogout { [[NSUserDefaults standardUserDefaults] setObject:@"" forKey:@"access_token"]; [[NSUserDefaults standardUserDefaults] setObject:@"" forKey:@"exp_date"]; [[NSUserDefaults standardUserDefaults] synchronize]; isLoggedIn = NO; } #pragma mark - #pragma mark FBRequestDelegate - (void)request:(FBRequest *)request didFailWithError:(NSError *)error { [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO]; //NSLog(@"ResponseFailed: %@", error); } - (void)request:(FBRequest *)request didLoad:(id)result { [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO]; //NSLog(@"Parsed Response: %@", result); } /** * Called after the access token was extended. If your application has any * references to the previous access token (for example, if your application * stores the previous access token in persistent storage), your application * should overwrite the old access token with the new one in this method. * See extendAccessToken for more details. */ - (void)fbDidExtendToken:(NSString*)accessToken expiresAt:(NSDate*)expiresAt { NSLog(@"Fb did extend token.. NOT IMPLEMENTED YET!"); } /** * Called when the current session has expired. This might happen when: * - the access token expired * - the app has been disabled * - the user revoked the app's permissions * - the user changed his or her password */ - (void)fbSessionInvalidated { NSLog(@"Fb session invalidated.. NOT IMPLEMENTED YET!"); } @end