facebook ios sdk - 使用 UIImage 发布照片时遇到问题

Posted

技术标签:

【中文标题】facebook ios sdk - 使用 UIImage 发布照片时遇到问题【英文标题】:facebook ios sdk - trouble posting photo using UIImage 【发布时间】:2011-10-02 00:35:29 【问题描述】:

如果我有任何关于如何处理我在 Facebook 上发布图片的问题的建议,我将不胜感激。

下面的代码和我预期的一样工作:

NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                 @"http://myserver/img.png", @"picture",
                 @"My Testing", @"name",
                 @"Enter some text...",  @"message",
                 nil];

[appDelegate.facebook dialog:@"feed" andParams:params andDelegate:self];

但是,我真的很想使用从相机拍摄的图像。我已经在我的应用程序中设置了代码来执行此操作,并将图像放在屏幕上。所以,我试着这样做:

CGRect contextRect  = CGRectMake(0, 0, 320, 436);
UIGraphicsBeginImageContextWithOptions(contextRect.size, YES, 1);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

我已经测试了这段代码,newImage 是一个有效的 UIImage,我可以按照我的预期放置和操作它。但是,当我尝试将其集成到 Facebook 对话框中时,如下所示:

NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                 newImage, @"picture",
                 @"My Testing", @"name",
                 @"Enter some text...",  @"message",
                 nil];

[appDelegate.facebook dialog:@"feed" andParams:params andDelegate:self];

我在控制台中收到这两条荒谬的消息: -[UIImage 长度]:无法识别的选择器发送到实例 0x1c9420 CoreAnimation:忽略异常:-[UIImage 长度]:无法识别的选择器发送到实例 0x1c9420

因此,作为测试,我想尝试将图像导入我的项目并直接访问它。这是我在第一个示例中在线引用的确切图像,所以我知道它应该可以工作。但即使我尝试这个:

UIImage *newImage = [UIImage imageNamed:@"BaB.png"];

我收到与上述相同的错误消息。

我在 Facebook 文档中看到“图片”键应该使用图像的 URL。但是我在网上看到了一些例子,表明人们使用的是 UIImage 而不仅仅是 URL。

很明显,我做错了什么,但我不知道它可能是什么。

我将非常感谢任何关于如何进行的指示。

【问题讨论】:

【参考方案1】:

概述该过程的总结答案...关键点是在图形调用中包含 access_token,因为 facebook-ios-sdk 不会自动执行此操作:

1) 更新到最新的 facebook-ios-sdk。 2)用应用程序ID实例化。



      self.facebook = [[Facebook alloc] initWithAppId:kApplicationFBID]; 

3) 授权app,包括publish_stream



  NSArray * neededPermissions = [[[NSArray alloc] initWithObjects:@"user_about_me", @"publish_stream", @"user_photos", nil] autorelease];
  [facebook authorize:neededPermissions delegate:appDelegate];

4) 确保应用委托 fBDidLogin 捕获并存储访问令牌和过期用户默认值(用于以后登录过程的优化)。



    -(void)fbDidLogin 
        DebugLog(@"New Access Token: %@", [facebook accessToken] );
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        [defaults setObject:[facebook accessToken] forKey:@"FBAccessTokenKey"];
        [defaults setObject:[facebook expirationDate] forKey:@"FBExpirationDateKey"];
        [defaults synchronize];
    

5) 确认有效的访问令牌(非零且未过期)...否则按照上述重新授权应用程序。 6) 将图像捕获到 UIImage 并调用它,注意添加 access_token 的关键。这将为您的应用程序自动创建一个相册,并将图像放在那里并根据我的测试将其张贴在墙上。



-(void)postImageToAlbum:(UIImage *)image 
  NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
    image, @"source", 
    @"caption desc", @"message",             
    nil];
  [facebook requestWithGraphpath:[NSString stringWithFormat:@"/me/photos?access_token=%@", self.facebook.accessToken]
  andParams:params andHttpMethod:@"POST" andDelegate:self];

7) 在 FBRequestDelegate 方法中检查 id 结果


    -(void)request:(FBRequest *)request didLoad:(id)result 
        NSLog(@"Request didLoad: %@ ", [request url ]);
        if ([result isKindOfClass:[NSArray class]]) 
            result = [result objectAtIndex:0];
        
        if ([result isKindOfClass:[NSDictionary class]])

        
        if ([result isKindOfClass:[NSData class]]) 
        
        NSLog(@"request returns %@",result);
     

8) 不要使用测试用户帐户进行测试...目前它将验证测试帐户并提供访问令牌,但是当您尝试使用图形 api 时,它会返回意外错误。如果您在 dev.facebook.com 中使用网络版本与本机应用程序设置,您可能会没事,因为据说您可以创建测试用户并将他们与应用程序相关联,但我还没有尝试过。

祝你好运!

【讨论】:

这很棒 - 感谢您的帮助 在 Facebook.m 的第 166 行或附近,SDK 将 access_token 添加到传入的参数中,使开发人员无需将访问令牌作为参数或URL 的一部分。

以上是关于facebook ios sdk - 使用 UIImage 发布照片时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

ios 应用程序的用户是不是可以使用 facebook-sdk 在 facebook 上喜欢 URL?

facebook-ios-SDK 问题

在 Facebook-Ios-Sdk 中关闭 Facebook 会话

如何在使用 facebook-ios-sdk 的应用中实现聊天

Facebook iOS SDK:使用 Facebook 登录失败

使用 facebook SDK for ios 6 实现 Facebook 注销