정확히 똑같은 문제를 다뤘습니다. 기본적으로 다음과 같은 방법을 포함하는
가 나는 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
도움 주셔서 감사합니다. 당신이 올린 코드는 무엇입니까?// 페이스 북 requestWrapper = [FBRequestWrapper defaultManager]; AppDelegate 구현 파일이나 FBRequestWrapper.m을 방문하십시오. 나는 조금 혼란 스럽다. 다시 고마워요 :) – hanumanDev
아무 문제 없어요,이 코드는 AppDelegate.m 파일에 다음과 같은 방법으로 속해 있습니다 : - (BOOL) application : (UIApplication *) application didFinishLaunchingWithOptions : (NSDictionary *) launchOptions. 덕분에 – Prine
! FBRequestWrapper는 .h 및 .m 파일을 가진 자체 클래스라는 것입니다. requestWrapper = [FBRequestWrapper defaultManager]가 다른 이유가 궁금 해서요. AppDelegate.h 파일에서 선언되거나 AppDelegate.m 파일의 FBRequestWrapper.h #import 지시문을 통해 가져옵니다. – hanumanDev