在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]]; } }
尝试取消您的应用程序的授权,然后再次授权