如何使用Facebook iOS SDK检索Facebook响应

我正在使用iPhone的iOS iOS SDK。 我初始化Facebook实例

facebook = [[Facebook alloc] initWithAppId:kAppId]; 

然后我login:

 [facebook authorize:permissions delegate:self]; 

login到Facebook之后,我正在执行以下操作以获取用户configuration文件信息:

 [facebook requestWithGraphPath:@"me" andDelegate:self]; NSMutableData *response = [fbRequest responseText]; unsigned char *firstBuffer = [response mutableBytes]; NSLog(@"Got Facebook Profile: : \"%s\"\n", (char *)firstBuffer); 

但是我在控制台上看到以下内容:

 Got Facebook Profile: "(null)" 

我做错了什么,我也相信,Facebook的反应是一个JSONstring,我期待得到一个JSONstring的持有。

我想可能是我应该把它变成维基,并告诉人们我是如何做到这一点的。 因为很多人都面临着类似的问题。

我做的第一件事是。

在Facebook.m类中,我在下面的方法中添加了以下语句

 (void)authorizeWithFBAppAuth:(BOOL)tryFBAppAuth safariAuth:(BOOL)trySafariAuth trySafariAuth = NO; 

这可以防止Safarilogin页面打开,但它会popup一个屏幕在应用程序本身。 然后我为Facebook创build了一个辅助类,头文件代码在这里。

 #import <UIKit/UIKit.h> #import "FBConnect.h" @interface FaceBookHelper : UIViewController <FBRequestDelegate, FBDialogDelegate, FBSessionDelegate>{ Facebook *facebook; NSArray *permissions; } @property(readonly) Facebook *facebook; - (void)login; -(void)getUserInfo:(id)sender; - (void)getUserFriendList:(id)sender; -(void)postToFriendsWall; 

.m文件。

 static NSString* kAppId = @"xxx"; #define ACCESS_TOKEN_KEY @"fb_access_token" #define EXPIRATION_DATE_KEY @"fb_expiration_date" @implementation FaceBookHelper @synthesize facebook; ////////////////////////////////////////////////////////////////////////////////////////////////// // UIViewController /** * initialization */ - (id)init { if (self = [super init]) { facebook = [[Facebook alloc] initWithAppId:kAppId]; facebook.sessionDelegate = self; permissions = [[NSArray arrayWithObjects: @"email", @"read_stream", @"user_birthday", @"user_about_me", @"publish_stream", @"offline_access", nil] retain]; [self login]; } return self; } /////////////////////////////////////////////////////////////////////////////////////////////////// // NSObject - (void)dealloc { [facebook release]; [permissions release]; [super dealloc]; } /////////////////////////////////////////////////////////////////////////////////////////////////// // private /** * Login. */ - (void)login { // only authorize if the access token isn't valid // if it *is* valid, no need to authenticate. just move on if (![facebook isSessionValid]) { [facebook authorize:permissions delegate:self]; } } /** * This is the place only where you will get the hold on the accessToken * **/ - (void)fbDidLogin { NSLog(@"Did Log In"); NSLog(@"Access Token is %@", facebook.accessToken ); NSLog(@"Expiration Date is %@", facebook.expirationDate ); // Store the value in the NSUserDefaults NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults setObject:facebook.accessToken forKey:ACCESS_TOKEN_KEY]; [defaults setObject:facebook.expirationDate forKey:EXPIRATION_DATE_KEY]; [defaults synchronize]; // This is the best place to login because here we know that user has already logged in [self getUserInfo:self]; //[self getUserFriendList:self]; //[self postToFriendsWall]; } - (void)fbDidNotLogin:(BOOL)cancelled { NSLog(@"Failed to log in"); } - (void)getUserInfo:(id)sender { [facebook requestWithGraphPath:@"me" andDelegate:self]; } - (void)getUserFriendList:(id)sender { [facebook requestWithGraphPath:@"me/friends" andDelegate:self]; } //////////////////////////////////////////////////////////////////////////////// // FBRequestDelegate /** * Called when the Facebook API request has returned a response. This callback * gives you access to the raw response. It's called before * (void)request:(FBRequest *)request didLoad:(id)result, * which is passed the parsed response object. */ - (void)request:(FBRequest *)request didReceiveResponse:(NSURLResponse *)response { NSLog(@"Inside didReceiveResponse: received response"); //NSLog(@"Status Code @", [response statusCode]); NSLog(@"URL @", [response URL]); } /** * Called when a request returns and its response has been parsed into * an object. The resulting object may be a dictionary, an array, a string, * or a number, depending on the format of the API response. If you need access * to the raw response, use: * * (void)request:(FBRequest *)request * didReceiveResponse:(NSURLResponse *)response */ - (void)request:(FBRequest *)request didLoad:(id)result { NSLog(@"Inside didLoad"); if ([result isKindOfClass:[NSArray class]]) { result = [result objectAtIndex:0]; } // When we ask for user infor this will happen. if ([result isKindOfClass:[NSDictionary class]]){ //NSDictionary *hash = result; NSLog(@"Birthday: %@", [result objectForKey:@"birthday"]); NSLog(@"Name: %@", [result objectForKey:@"name"]); } if ([result isKindOfClass:[NSData class]]) { NSLog(@"Profile Picture"); //[profilePicture release]; //profilePicture = [[UIImage alloc] initWithData: result]; } NSLog(@"request returns %@",result); //if ([result objectForKey:@"owner"]) {} }; /** * Called when an error prevents the Facebook API request from completing * successfully. */ - (void)request:(FBRequest *)request didFailWithError:(NSError *)error { //[self.label setText:[error localizedDescription]]; }; //////////////////////////////////////////////////////////////////////////////// // FBDialogDelegate /** * Called when a UIServer Dialog successfully return. */ - (void)dialogDidComplete:(FBDialog *)dialog { //[self.label setText:@"publish successfully"]; } @end 

感谢这个提示Yogesh!

facebook.m中,您还可以在授权方法中设置safariAuth参数。

 - (void)authorize:(NSArray *)permissions delegate:(id<FBSessionDelegate>)delegate { ... [self authorizeWithFBAppAuth:YES safariAuth:NO]; }