【问题标题】:Post multiple images using SLComposeViewController on Facebook/ Twitter?在 Facebook/Twitter 上使用 SLComposeViewController 发布多张图片?
【发布时间】:2025-12-29 14:20:23
【问题描述】:

我是一名 iOS 开发人员,目前正在使用 SLComposeViewController 在 Facebook/Twitter 上分享帖子。我的问题是我必须在一个帖子中发布多张图片。

我已经这样做了:

SLComposeViewController* mySLComposerSheet = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter];
[mySLComposerSheet setInitialText:textTobeShared];
mySLComposerSheet addURL:[NSURL URLWithString:@"http://click-labs.com/"]];
for(int count=0;count<imageArray.count;count++)
        if([mySLComposerSheet addImage:[UIImage imageWithData:[imageArray objectAtIndex:count]]]) 

在上面的代码中,imageArray 是我要发布的图像数组。

当我在 Facebook 上执行此操作时,所有图片都作为单独的帖子发布。

在 Twitter 的情况下,addImage 方法仅对第一张图像返回 true,而在其他图像的情况下返回 false。所以只发了一张图。

所以我想知道如何实现我的目标,是否可以在一条推文中发布多张图片。

【问题讨论】:

  • 在推特中,每条推文只能发布一张图片。推特上没有专辑之类的东西。
  • 你确定没有办法在 twitter 中实现这一点。是否有任何关于此问题的可用文档。
  • 如果你是推特用户,那么你就会知道这一点。每条推文(其他术语的帖子)都会有一张与之关联的图片。
  • 其实我是推特新手,所以我不知道。
  • @girish_vr 查看此 Twitter 博客文章。应该已经可以了。 blog.twitter.com/2014/photos-just-got-more-social

标签: ios objective-c iphone ios7 ios5


【解决方案1】:

我认为您需要先创建一个相册。

这是link to the facebook album API 文档。

- (void)shareToFacebook {
if (FBSession.activeSession.isOpen) {
    NSLog(@"SESSION IS OPEN");

    [self createFacebookAlbum];
} else {
    NSLog(@"SESSION IS NOT OPEN");
    NSArray* permissions = [NSArray arrayWithObject:@"email"];
    [FBSession openActiveSessionWithReadPermissions:permissions allowLoginUI:YES completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {
        [self sessionStateChanged:session state:state error:error];

        if (error) {
            /* handle failure */
            NSLog(@"error:%@, %@", error, [error localizedDescription]);
            UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"There was a problem with your Facebook permissions." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];
            [alert show];
        }
        else if (state == FBSessionStateClosed || state == FBSessionStateClosedLoginFailed ) {
            [FBSession.activeSession closeAndClearTokenInformation];
        }
        else if (state == FBSessionStateOpenTokenExtended || state == FBSessionStateOpen) {
            if(!self.presentedFacebookSheet) {
                [self performSelector:@selector(reauthorizeAndContinuePostToFacebook) withObject:nil afterDelay:0.5];
                self.presentedFacebookSheet = YES;
            }
        }
        }];
    }
}

- (void)reauthorizeAndContinuePostToFacebook {
    NSArray *permissions = [NSArray arrayWithObjects:@"publish_actions", nil];

    [[FBSession activeSession] requestNewPublishPermissions:permissions defaultAudience:FBSessionDefaultAudienceFriends completionHandler:^(FBSession *session, NSError *error) {
        [self shareToFacebook];
    }];
}

- (void)createFacebookAlbum {
    NSMutableDictionary* parameters = [NSMutableDictionary dictionary];
    [parameters setObject:@"Test name" forKey:@"name"];
    [parameters setObject:@"Test message" forKey:@"message"];

    FBRequest* request = [FBRequest requestWithGraphPath:@"me/albums" parameters:parameters HTTPMethod:@"POST"];

    NSLog(@"creating facebook album");
    FBRequestConnection *connection = [[FBRequestConnection alloc] init];
    [connection addRequest:request
         completionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
             if (!error) {
                 NSString* albumId = [result objectForKey:@"id"];
                 NSLog(@"OK %@", albumId);
             }
             else {
                 NSLog(@"Error: %@",error.userInfo);
             }
         }];
    [connection start];
}

- (void)sessionStateChanged:(FBSession *)session state:(FBSessionState) state error:(NSError *)error {
    switch (state) {
        case FBSessionStateOpen:
        {
            [[FBRequest requestForMe] startWithCompletionHandler:
             ^(FBRequestConnection *connection,
               NSDictionary<FBGraphUser> *user,
               NSError *error) {
                 if (error) {
                     //error
                 }
                 else {
                     NSLog(@"User session found");
                 }
             }];
        }
            break;
        case FBSessionStateClosed:
        case FBSessionStateClosedLoginFailed:
            [FBSession.activeSession closeAndClearTokenInformation];
            break;
        default:
            break;
    }
}

【讨论】:

  • 难道不能用 SLComposeViewController 来做同样的事情
  • 有趣的是,在这篇文章中,问题/要求完全相反。 *.com/questions/14514179/…
  • 是的,我刚刚看到了这个问题。但这是在单张图片帖子的情况下。