在iOS上使用Facebook Graph API

这是我在StackOverflow的第一篇文章,但我用了很长一段时间…

我的问题基本上是简单的,我想在用户的墙上分享一个UITextView(mShareText)的内容,而不提示任何对话框。 基本上,用户必须在UITextView上填写消息,然后单击“ ”UIButton。 简单不是吗?

我已经下载了Facebook iOS SDK并将其复制到我的项目中。 我在控制器的头文件中包含了“ FBConnect.h ”和“ Facebook.h ”,并创build了一个var: Facebook* facebook ;控制器还实现了下面的代理:FBSessionDelegate,FBRequestDelegate。

在我的控制器的实现文件,我有一个IBAction当用户点击“后”UIButton触发。

 - (IBAction)onShareByFBPressed:(id)sender { NSLog(@"onShareByFBPressed"); // Facebook settings NSMutableDictionary* params = [[NSMutableDictionary alloc] initWithCapacity:3]; [params setObject:mShareText.text forKey:@"message"]; [params setObject:@"http://www.example.com" forKey:@"link"]; [params setObject:@"https://www.example.com/myImg.jpg" forKey:@"picture"]; [facebook requestWithGraphPath:@"me/feed" andParams:params andHttpMethod:@"POST" andDelegate:self]; [params release]; } 

我在我的viewdidload上实现了这个:

 - (void)viewDidLoad { NSLog(@"viewDidLoad"); [super viewDidLoad]; (...) // Test facebook facebook = [[Facebook alloc] initWithAppId:@"XXXXXXXXXXX" andDelegate:self]; NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; if ([defaults objectForKey:@"FBAccessTokenKey"] && [defaults objectForKey:@"FBExpirationDateKey"]) { facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"]; facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"]; NSLog(@"AccessToken: %@ ExpirationDate: %@", facebook.accessToken, facebook.expirationDate); }else{ NSLog(@"No AccessToken or ExpirationDate"); } if (![facebook isSessionValid]) { [facebook authorize:[NSArray arrayWithObjects:@"publish_stream", nil]]; } } 

由于代表们的不同,我必须执行不同的方法:

 // Pre 4.2 support - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url { return [facebook handleOpenURL:url]; } // For 4.2+ support - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { return [facebook handleOpenURL:url]; } - (void)fbDidLogin { NSLog(@"fbDidLogin"); NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults setObject:[facebook accessToken] forKey:@"FBAccessTokenKey"]; [defaults setObject:[facebook expirationDate] forKey:@"FBExpirationDateKey"]; [defaults synchronize]; } - (void)fbSessionInvalidated{ NSLog(@"fbSessionInvalidated"); } - (void)fbDidLogout{ NSLog(@"fbDidLogout"); } - (void)fbDidExtendToken:(NSString*)accessToken expiresAt:(NSDate*)expiresAt{ NSLog(@"fbDidExtendToken"); } - (void)fbDidNotLogin:(BOOL)cancelled{ NSLog(@"fbDidNotLogin"); } - (void)request:(FBRequest *)request didReceiveResponse:(NSURLResponse *)response{ NSLog(@"didReceiveResponse: %@", response); } - (void)request:(FBRequest *)request didFailWithError:(NSError *)error{ NSLog(@"didFailWithError: %@", [error description]); UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Share on Facebook" message:@"An error occured" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; [alert release]; } 

不幸的是,每次我尝试触发我的“onShareByFBPressed”方法,我在日志中得到以下错误:

 2012-02-17 13:02:06.401 Mixtapes[935:707] didFailWithError: Error Domain=facebookErrDomain Code=10000 "The operation couldn't be completed. (facebookErrDomain error 10000.)" UserInfo=0x1f6f60 {error=<CFBasicHash 0x1f6660 [0x3ec6d630]>{type = mutable dict, count = 3, entries => 2 : <CFString 0x1f64a0 [0x3ec6d630]>{contents = "type"} = <CFString 0x1f6b10 [0x3ec6d630]>{contents = "OAuthException"} 3 : <CFString 0x1f6ab0 [0x3ec6d630]>{contents = "message"} = <CFString 0x1f6a10 [0x3ec6d630]>{contents = "An active access token must be used to query information about the current user."} 6 : <CFString 0x1f6e60 [0x3ec6d630]>{contents = "code"} = 2500 } } 

任何人都可以告诉我什么是我的执行错误?

非常感谢。

最好的祝福。

编辑:@Adil

感谢您的build议。 它实际上有些作品。

有时我得到以下错误:

 didFailWithError: Error Domain=facebookErrDomain Code=10000 "The operation couldn't be completed. (facebookErrDomain error 10000.)" UserInfo=0xa17e0d0 {error=<CFBasicHash 0xa171e10 [0x3ec6d630]>{type = mutable dict, count = 3, entries => 2 : <CFString 0xa179d10 [0x3ec6d630]>{contents = "type"} = <CFString 0xa17a280 [0x3ec6d630]>{contents = "OAuthException"} 3 : <CFString 0x6127710 [0x3ec6d630]>{contents = "message"} = <CFString 0xa178db0 [0x3ec6d630]>{contents = "Error validating access token: Session is invalid. This could be because the application was uninstalled after the session was created."} 6 : <CFString 0xa17e020 [0x3ec6d630]>{contents = "code"} = 190 } } 

谢谢你的帮助

这里的问题是:

被授权的Facebook是AppDelegate的facebook对象,而不是你的ViewController的Facebook。

解:

而是为每个ViewController或您需要的地方分配新的Facebook对象。 你应该让你的应用程序delegate的财产。 喜欢这个:

在appDelegate.h中

 @property(nonatomic, retain) Facebook *facebook; 

并在appDelegate.m中综合它,现在把Facebook的初始化

 - (BOOL)application:(UIApplication *)ap didFinishLaunchingWithOptions:(NSDictionary *)op { // other code.... facebook = [[Facebook alloc] initWithAppId:@"XXXXXXXXXXX" andDelegate:self]; NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; if ([defaults objectForKey:@"FBAccessTokenKey"] && [defaults objectForKey:@"FBExpirationDateKey"]) { facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"]; facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"]; NSLog(@"AccessToken: %@ ExpirationDate: %@", facebook.accessToken, facebook.expirationDate); }else{ NSLog(@"No AccessToken or ExpirationDate"); } return true; } 

现在你想在哪里使用它,写下这样的东西:

 - (void)viewDidLoad { [super viewDidLoad]; //... AppDelegate *app = (AppDelegate *)[[UIApplication sharedApplication] delegate]; facebook = app.facebook; if (![facebook isSessionValid]) { [facebook authorize:[NSArray arrayWithObjects:@"publish_stream", nil]]; } } 

尝试取消您的应用程序的授权,然后再次授权