3

我正在尝试使用 SLRequest 以编程方式将图像(从 iOS 设备)上传到用户的 Twitter 帐户。推文文本已上传到推文中,但图像从未出现。响应状态码为 200。

显然基础工作正常,否则推文根本不会显示在用户的流中,我检查了图像是否找到并且 (NSData) 变量包含预期的字节数。

查看以下代码 - 正如您从注释掉的代码中看到的那样,我尝试了各种不同的修改但没有成功......任何想法/帮助表示赞赏!

- (void) postToTwitter:(NSString *)postMessage withImageNamed:(NSString *)imageName {

    // Get Twitter account
    ACAccountStore *smAccount = [[ACAccountStore alloc] init];
    ACAccountType *smType = [smAccount accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];

    NSDictionary *postOptions = nil;

    // Attempt to post the postMessage
    [smAccount requestAccessToAccountsWithType:smType options:postOptions completion:^(BOOL accessGranted, NSError *error) {

        // Access code block

        if (accessGranted) {

            NSLog(@"Access permitted");

            NSArray *smAccountList = [smAccount accountsWithAccountType:smType];

            if ([smAccountList count] > 0) {

                // Get the first Twitter account
                ACAccount *postingAccount = [smAccountList lastObject];

                // Create the post request
                //SLRequest *postRequest = [SLRequest requestForServiceType:SLServiceTypeTwitter requestMethod:SLRequestMethodPOST URL:[NSURL URLWithString:@"https://api.twitter.com/1.1/statuses/update.json"] parameters:[NSDictionary dictionaryWithObject:postMessage forKey:@"status"]];
                //SLRequest *postRequest = [SLRequest requestForServiceType:SLServiceTypeTwitter requestMethod:SLRequestMethodPOST URL:[NSURL URLWithString:@"https://upload.twitter.com/1.1/media/upload.json"] parameters:nil];
                SLRequest *postRequest = [SLRequest requestForServiceType:SLServiceTypeTwitter requestMethod:SLRequestMethodPOST URL:[NSURL URLWithString:@"https://api.twitter.com/1.1/statuses/update.json"] parameters:nil];

                // Add image to post
                // TODO - Check which to use >
                UIImage *postImage = [UIImage imageNamed:imageName];
                //UIImage *postImage = [UIImage imageWithContentsOfFile:imageName];
                //NSData *imageData = UIImageJPEGRepresentation (postImage, 0.5f); // Set compression

                NSData *imageData = UIImagePNGRepresentation(postImage);

                //[postRequest addMultipartData:imageData withName:@"media" type:@"image/png" filename:@"image.png"];
                [postRequest addMultipartData:imageData withName:@"media[]" type:@"multipart/form-data" filename:@"image.png"];

                // Add text
                [postRequest addMultipartData:[postMessage dataUsingEncoding:NSUTF8StringEncoding] withName:@"status" type:@"multipart/form-data" filename:nil];

                // Execute the post
                [postRequest setAccount:postingAccount];
                [postRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {

                    // Post code block
                    if (error) {

                        NSLog(@"Post failed - %@", error);

                        if (_delegate && [_delegate respondsToSelector:@selector(didNotPost:)])
                            [_delegate didNotPost:self];
                    } else {

                        NSLog(@"Post complete");

                        if (_delegate && [_delegate respondsToSelector:@selector(didPost:)])
                            [_delegate didPost:self];
                    }
                }];
            }
        } else {

            NSLog(@"Access denied - %@", error);

            if (_delegate && [_delegate respondsToSelector:@selector(didNotPost:)])
                [_delegate didNotPost:self];
        }


    } ];
}

这是回应:

(lldb) po urlResponse
<NSHTTPURLResponse: 0x7fb9bf80> { URL: https://api.twitter.com/1.1/statuses/update.json } { status code: 200, headers {
    "Cache-Control" = "no-cache, no-store, must-revalidate, pre-check=0, post-check=0";
    "Content-Disposition" = "attachment; filename=json.json";
    "Content-Encoding" = gzip;
    "Content-Length" = 751;
    "Content-Type" = "application/json;charset=utf-8";
    Date = "Thu, 02 Apr 2015 17:14:20 GMT";
    Expires = "Tue, 31 Mar 1981 05:00:00 GMT";
    "Last-Modified" = "Thu, 02 Apr 2015 17:14:20 GMT";
    Pragma = "no-cache";
    Server = "tsa_b";
    "Set-Cookie" = "lang=en";
    Status = "200 OK";
    "Strict-Transport-Security" = "max-age=631138519";
    "x-access-level" = "read-write";
    "x-connection-hash" = 6f61f3c96ba990931cca3fa950a42b38;
    "x-content-type-options" = nosniff;
    "x-frame-options" = SAMEORIGIN;
    "x-response-time" = 51;
    "x-transaction" = b2c77803db7e996d;
    "x-tsa-request-body-time" = 426;
    "x-twitter-response-tags" = BouncerCompliant;
    "x-xss-protection" = "1; mode=block";
} }
4

2 回答 2

4

在我发布此内容时,不推荐使用 update_with_media。虽然它现在可以工作,但它可能会在未来突然停止 - 这会使您的应用程序在未来不再工作。

在大量阅读 Twitter 的 API 文档之后,我设法在不使用“update_with_media”的情况下使其工作。

上传图片(或视频)所涉及的过程是:

  1. 使用 /media/upload.json SLRequest 首先上传媒体(图像或视频)。使用 nil 参数并使用 SLRequest 的“addMultipartData”方法添加图像。

  2. 在该 SLRequest 上调用 performRequestWithHandler。

  3. 等待来自 twitter 的响应以从 responseData 中获取“Media ID”(将数据转换为 JSON 格式)并将“media_id_string”检索到 NSString。

  4. 使用 /statuses/update.json 启动另一个 SLRequest,并将媒体 ID (key:media_ids) 与状态文本 (key:status) 一起附加到参数字典中。

NSDictionary *parameters = @{@"status": @"See my image:",
                                                    @"media_ids": mediaID };
  1. 在第二个 SLRequest 上调用 performRequestWithHandler 以提交推文。

有关详细代码,请参见我的教程博客:http: //xcodenoobies.blogspot.my/2016/01/how-to-using-slrequest-to-upload-image.html

于 2016-01-13T07:11:08.773 回答
2

所以在经历了很多痛苦之后,我意识到我发布到了错误的 Twitter API。以下修改使这项工作。

SLRequest *postRequest = [SLRequest requestForServiceType:SLServiceTypeTwitter requestMethod:SLRequestMethodPOST URL:[NSURL URLWithString:@"https://api.twitter.com/1.1/statuses/update_with_media.json"] parameters:nil];
于 2015-04-05T17:36:19.463 回答