在iOS上使用Facebook的图形API [英] Using Facebook Graph API on iOS
问题描述
这是我的第一个计算器后,但我用这个很长一段时间...
This is my first post on StackOverflow but i use this for a long time...
我的问题是基本的简单,我想分享一个 UITextView的(mShareText)的含量
用户的墙上没有任何提示对话框。基本上,用户必须填写在的UITextView
的消息,然后点击一个<大骨节病>后骨节病>的UIButton。简单是不是?
My problem is basically simple, I want to share the content of a UITextView(mShareText)
on the user's wall without prompting any Dialog. Basically, the user has to fill its message on the UITextView
and then click on a "post" UIButton. Simple isn't it ?
我已经下载了Facebook的iOS版SDK并将它复制到我的项目。我已经包括了 FBConnect.h
,并在我的控制器的头文件 Facebook.h
,并创建了一个变种: Facebook的Facebook的*
;,该控制器还实现了以下代表:FBSessionDelegate,FBRequestDelegate
I've downloaded the Facebook iOS SDK and copied it into my project. I've included "FBConnect.h
" and "Facebook.h
" on my controller's header file and created a var : Facebook* facebook
;, the controller also implements the following delegates : FBSessionDelegate, FBRequestDelegate.
在我的控制器的实现文件中,我有一个IBAction为触发,当用户点击发布的UIButton。
On my controller's implementation file, I've a IBAction triggered when the user clicks on the "post" 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.mysite.com" forKey:@"link"];
[params setObject:@"https://www.mysite.com/myImg.jpg" forKey:@"picture"];
[facebook requestWithGraphPath:@"me/feed"
andParams:params
andHttpMethod:@"POST"
andDelegate:self];
[params release];
}
我已经在我的viewDidLoad中实现这一点:
I've implemented this on my 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]];
}
}
下面是由于代表不同的方法,我不得不实施
Here are different methods I had to implement due to the delegates :
// 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];
}
可惜的是,每次我尝试触发我的onShareByFB pressed的方法,我在日志中出现以下错误:
Unfortunatelly, everytime I try to trigger my "onShareByFBPressed" method, I got the following error on the log:
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
}
}
谁能告诉我有什么错我的执行?
Can anyone tell me what's wrong with my implementation ??
非常感谢。
最好的问候。
编辑:
@Adil
@Adil
谢谢你的建议。它的实际工作somethimes。
Thanks for your proposal. It actually works somethimes.
有时候,我得到了以下错误:
Sometimes i got the following error :
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
}
}
感谢您的帮助。
推荐答案
这里的问题是:
这是authororized Facebook的是的AppDelegate
的Facebook对象,而不是你的的ViewController
的Facebook。
The facebook which is authororized is AppDelegate
's facebook object, not your ViewController
's facebook.
解决方案:
而不是分配每的ViewController
或你需要新的的Facebook
对象。
你应该让你的应用程序委托
的属性。像这样的:
Instead allocating new Facebook
object for every ViewController
or where you needed.
you should make a property of your application delegate
. like this:
在appDelegate.h
in appDelegate.h
@property(nonatomic, retain) Facebook *facebook;
和合成它在appDelegate.m现在把Facebook的初始化在
and synthesize it in appDelegate.m and now put initialization of Facebook in
- (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;
}
现在你想使用它,这样写在哪里:
now where do you want to use it, write something like this:
- (void)viewDidLoad
{
[super viewDidLoad];
//...
AppDelegate *app = (AppDelegate *)[[UIApplication sharedApplication] delegate];
facebook = app.facebook;
if (![facebook isSessionValid]) {
[facebook authorize:[NSArray arrayWithObjects:@"publish_stream", nil]];
}
}
这篇关于在iOS上使用Facebook的图形API的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!