2012-04-12 3 views
1

Facebook API를 사용하여 iOS 앱에서 사용자를 체크인하려고합니다.Facebook Api가 iOS 앱에서 사용자를 확인합니다.

AppDelegate에서 사용 권한을 설정했는데 사용자가 다른보기 컨트롤러에서 체크인해야하는지 궁금 해서요 FBRequestDelegate, FBSessionDelegate, FBDialogDelegate 대리자 메서드와 함께 모든보기 컨트롤러에서 Facebook 인스턴스를 선언해야합니까? 아니면 AppDelegate에서 한 번일까요?

도움을 주셔서 감사합니다.

답변

2

정확히 똑같은 문제를 다뤘습니다. 기본적으로 다음과 같은 방법을 포함하는

가 나는 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 

그래서 모든 페이스 북 물건이 싱글 톤 클래스에서 관리됩니다.

에서 AppDelegate 나는 인증을 호출합니다. 내 생각에 인증은 모든 컨트롤러를로드하기 전에 수행되어야합니다.

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

또한 NSUserDefaults 공간에 accessToken을 저장할 수 있습니다. 우리는 웹 서비스에 대한 인증으로서 accessToken을 사용하고 있기 때문입니다.

내 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 및 모든 컨트롤러 괜찮 았으면로드하십시오. FBRequestWrapper.m에서

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

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

코드 :

이제 당신은 AppDelegate에 외부의 어떤 컨트롤러에서 액세스 페이스 북 그래프 API 광고 당신은 또한 같은 FBRequestWrapper를 사용하려는 경우

#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

도움 주셔서 감사합니다. 당신이 올린 코드는 무엇입니까?// 페이스 북 requestWrapper = [FBRequestWrapper defaultManager]; AppDelegate 구현 파일이나 FBRequestWrapper.m을 방문하십시오. 나는 조금 혼란 스럽다. 다시 고마워요 :) – hanumanDev

+0

아무 문제 없어요,이 코드는 AppDelegate.m 파일에 다음과 같은 방법으로 속해 있습니다 : - (BOOL) application : (UIApplication *) application didFinishLaunchingWithOptions : (NSDictionary *) launchOptions. 덕분에 – Prine

+0

! FBRequestWrapper는 .h 및 .m 파일을 가진 자체 클래스라는 것입니다. requestWrapper = [FBRequestWrapper defaultManager]가 다른 이유가 궁금 해서요. AppDelegate.h 파일에서 선언되거나 AppDelegate.m 파일의 FBRequestWrapper.h #import 지시문을 통해 가져옵니다. – hanumanDev

관련 문제