2012-04-12 8 views
1

Ich möchte die Facebook API verwenden, um Nutzer in einer iOS-App einzuchecken.Facebook API zum Einchecken von Nutzern in einer iOS-App

Ich frage mich, ob ich die Berechtigungen in der AppDelegate gesetzt haben, aber der Benutzer von einem anderen View-Controller einchecken muss muss ich die Facebook-Instanz in jedem View-Controller zusammen mit den FBRequestDelegate, FBSessionDelegate, FBDialogDelegate Delegate-Methoden zu deklarieren? oder ist es eine einmalige Sache im AppDelegate?

danke für jede Hilfe.

Antwort

2

Ich habe gerade mit genau dem gleichen Problem behandelt. Hier ist meine Lösung:

Ich habe ein FBRequestWrapper die im Grunde enthält folgende Methoden:

#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 

Also das alle Facebook-Zeug ist in dieser Singleton-Klasse verwaltet.

In meinem AppDelegate ich die Authentifizierung aufrufen. Weil meiner Meinung nach die Authentifizierung vor dem Laden aller Controller durchgeführt werden muss.

// 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]; 
} 

Sie können sehen, dass ich auch das AccessToken im NSUserDefaults-Bereich speichern. Weil wir den accessToken als Authentifizierung für unseren Webservice verwenden.

Meine AppDelegate Methode ist die FBSessionDelegate Methode delegieren:

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

Und hier ist die Umsetzung der wichtigsten Verfahren, 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]; 
} 

Hier speichere ich die accesstoken in die NSUserDefaults und laden Sie alle Controller, wenn alles in Ordnung war.

Nun, wenn Sie die Facebook Graph API von jedem Controller außerhalb des AppDelegate zu Zugang möchten, können Sie auch die FBRequestWrapper so verwenden:

- (IBAction)test:(id)sender { 
    // FBRequestWrapper 
    NSString *graphPath = @"me/friends"; 

    [[FBRequestWrapper defaultManager] getFBRequestWithGraphPath:graphPath andDelegate:self]; 
} 

Hier den Code aus dem 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 
+0

danke für Ihre Hilfe! funktioniert der von Ihnen gepostete Code // FACEBOOK requestWrapper = [FBRequestWrapper defaultManager]; in der AppDelegate-Implementierungsdatei oder in der FBRequestWrapper.m gehen? Ich bin ein wenig verwirrt. Danke nochmal :) – hanumanDev

+0

Kein Problem, dieser Code gehört in die AppDelegate.m Datei in die folgende Methode: - (BOOL) Anwendung: (UIApplication *) Anwendung didFinishLaunchingWithOptions: (NSDictionary *) launchOptions. – Prine

+0

danke! und der FBRequestWrapper ist, dass es eine eigene Klasse mit einer .h und .m Datei ist? Ich frage, weil ich mich frage, wie sonst der requestWrapper = [FBRequestWrapper defaultManager]; wird in der Datei AppDelegate.h deklariert oder über die Anweisung FBRequestWrapper.h #import in der Datei AppDelegate.m importiert. – hanumanDev

Verwandte Themen