facebook ios sdk - 使用UIImage发布照片时遇到麻烦

ano*_*yes 10 upload facebook photo ios

对于如何解决我在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];
Run Code Online (Sandbox Code Playgroud)

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

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

我已经测试了这个代码,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];
Run Code Online (Sandbox Code Playgroud)

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

所以,作为测试,我想我会尝试将图像导入到我的项目中并直接访问它.这是我在第一个例子中在线引用的确切图像,所以我知道它应该有效.但即使我尝试这个:

UIImage *newImage = [UIImage imageNamed:@"BaB.png"];
Run Code Online (Sandbox Code Playgroud)

我得到与上面相同的错误消息.

我在Facebook文档中看到"图片"键应该使用URL到图像.但我在网上看到一些例子表明人们正在使用UIImage而不仅仅是一个URL.

显然,我做错了什么,但我不知道它可能是什么.

我会非常感谢有关如何继续的任何指示.

小智 15

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

1)更新到最新的facebook-ios-sdk.
2)使用app id实例化.



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

Run Code Online (Sandbox Code Playgroud)

3)授权应用程序包括publish_stream



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

Run Code Online (Sandbox Code Playgroud)

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];
    }

Run Code Online (Sandbox Code Playgroud)

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];
}
Run Code Online (Sandbox Code Playgroud)

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);
     }

Run Code Online (Sandbox Code Playgroud)

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

祝好运!