如何使用 iPhone 中的 Graph API 在 Facebook 上上传照片?

Posted

技术标签:

【中文标题】如何使用 iPhone 中的 Graph API 在 Facebook 上上传照片?【英文标题】:How to Upload Photos on facebook using Graph API in iPhone? 【发布时间】:2011-10-10 13:08:36 【问题描述】:

我做了一个应用程序,在我的应用程序中我集成了 Facebook 来共享信息。 对于 Facebook 集成,我在应用程序中使用了 Graph API。 现在在我的应用程序中,我想在用户的墙上上传照片。 我已使用此代码将照片上传到用户的墙上。

//上传照片

- (void)uploadPhoto:(id)sender 


NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Image1" ofType:@"jpg"];

NSString *message = [NSString stringWithFormat:@"I think this is a Great Image!"];

NSURL *url = [NSURL URLWithString:@"https://graph.facebook.com/me/photos"];

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
[request addFile:filePath forKey:@"file"];
[request setPostValue:message forKey:@"message"];
[request setPostValue:_accessToken forKey:@"access_token"];
[request setDidFinishSelector:@selector(sendToPhotosFinished:)];
[request setDelegate:self];

[request startAsynchronous];

- (void)sendToPhotosFinished:(ASIHTTPRequest *)request 

// Use when fetching text data
NSString *responseString = [request responseString];

NSMutableDictionary *responseJSON = [responseString JSONValue];
NSString *photoId = [responseJSON objectForKey:@"id"];
NSLog(@"Photo id is: %@", photoId);

NSString *urlString = [NSString stringWithFormat:
                       @"https://graph.facebook.com/%@?access_token=%@", photoId, 
                       [_accessToken stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
NSURL *url = [NSURL URLWithString:urlString];
ASIHTTPRequest *newRequest = [ASIHTTPRequest requestWithURL:url];
[newRequest setDidFinishSelector:@selector(getFacebookPhotoFinished:)];

[newRequest setDelegate:self];
[newRequest startAsynchronous];

但是,我明白了 responseString 是 "error":"message":"Error validate application.","type":"OAuthException"照片 ID 为:(null)

并且图片没有上传到用户的墙上。 所以,请告诉我如何解决它。

【问题讨论】:

正如我在回答中所说,您必须授权 facebook 才能获得有效的访问令牌。您使用的是 ios facebook SDK 吗? developers.facebook.com/docs/guides/mobile/ios 我也有同样的问题,你解决了吗?如果是,请告诉这个错误的原因。 【参考方案1】:

首先你已经授权你的应用通过这样做上传图片(使用FBConnect SDK),你可以签出所有权限here

NSArray* permissions = [NSArray arrayWithObjects:@"publish_stream", @"user_photos", nil];
[facebook authorize:permissions];

下一个问题是 facebook 不允许以这种方式发送的帖子链接到托管在其域上的图片(我知道这真的很烦人,也许值得检查一下自 4 月以来情况是否发生了变化)。我花了很多时间来解决这个问题。我破解它的方法是使用bitly 创建一个重定向 URL(您可以使用他们的 API 以编程方式访问他们的服务,有一个 obj-c 包装器here,尽管我将其更改为异步)并发送该 URL在帖子中。

【讨论】:

【参考方案2】:

可以帮到你

 //facebook post a image on wall
     NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                       userImgView.image, @"picture",
                                       nil];

[facebook requestWithGraphpath:@"me/photos"
                     andParams:params
                 andHttpMethod:@"POST"
                   andDelegate:self];

【讨论】:

facebook是什么数据类型【参考方案3】:

另一种方式是在 Facebook 上发布图片...

NSMutableDictionary *variables = [NSMutableDictionary dictionaryWithCapacity:2];

    //create a UIImage (you could use the picture album or camera too)

    UIImage *picture = [UIImage imageNamed:"yourImageName"];
    //create a FbGraphFile object insance and set the picture we wish to publish on it
    FbGraphFile *graph_file = [[FbGraphFile alloc] initWithImage:picture];

    //finally, set the FbGraphFileobject onto our variables dictionary....
    [variables setObject:graph_file forKey:@"file"];

    [variables setObject:@"write your Message Here" forKey:@"message"];

    //the fbGraph object is smart enough to recognize the binary image data inside the FbGraphFile
    //object and treat that is such.....
    //FbGraphResponse *fb_graph_response = [fbGraph doGraphPost:@"117795728310/photos" withPostVars:variables];
    FbGraphResponse *fb_graph_response = [fbGraph doGraphPost:@"me/photos" withPostVars:variables];

希望,这对你有帮助... :)

【讨论】:

【参考方案4】:

Facebook的API使用OAuth来验证请求。您需要使用可以要求适当的临时/客户端令牌的库,并生成相应的HTTP标头。这是一个相当复杂的过程,它涉及到的请求参数散列和正火。 P>

您不能做到这一点起草自己的手动HTTP请求。 P>

【讨论】:

【参考方案5】:

你可以使用facebook的原生功能

NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys: UIImageJPEGRepresentation(postImage, 1.0), @"source", self.postTextView.text, @"message", nil];
            /* make the API call */

[FBRequestConnection startWithGraphPath:@"/me/photos" parameters:params HTTPMethod:@"POST" completionHandler:^(FBRequestConnection *connection, id result, NSError *error) 


       if (error == nil) 
               NSLog("Success");
       
       else 
               NSLog("Failed");
       

];

使用此代码,您可以发布带有消息的图像。 最好的问候

【讨论】:

以上是关于如何使用 iPhone 中的 Graph API 在 Facebook 上上传照片?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 iPhone SDK 中的 FBconnect 或 Graph API 在 facebook 中评论或喜欢照片?

如何在 iPhone 应用程序中使用 FB Graph 搜索 API

使用 Facebook Graph Api 在 iphone 中解析新闻提要响应

Facebook Graph API:在 iPhone 上恢复会话

如何使用图形 API 在 iphone 中喜欢 facebook 社区

如何使用 Graph API 获取家乡的 facebook 好友列表?