在iOS上使用Facebook的图形API [英] Using Facebook Graph API on iOS

查看:194
本文介绍了在iOS上使用Facebook的图形API的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我的第一个计算器后,但我用这个很长一段时间...

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆