1

我想将图像上传到 Twitter。

我把代码写成

- (void)postImage:(UIImage *)image withStatus:(NSString *)status
{
    NSLog(@"Share on Twitter");

    ACAccountType *twitterType =
    [self.accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];

    SLRequestHandler requestHandler =
    ^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
        if (responseData) {
            NSInteger statusCode = urlResponse.statusCode;
            if (statusCode >= 200 && statusCode < 300) {
                NSDictionary *postResponseData =
                [NSJSONSerialization JSONObjectWithData:responseData
                                                options:NSJSONReadingMutableContainers
                                                  error:NULL];
                NSLog(@"[SUCCESS!] Created Tweet with ID: %@", postResponseData[@"id_str"]);
            }
            else {
                NSLog(@"[ERROR] Server responded: status code %d %@", statusCode,
                      [NSHTTPURLResponse localizedStringForStatusCode:statusCode]);
            }
        }
        else {
            NSLog(@"[ERROR] An error occurred while posting: %@", [error localizedDescription]);
        }
    };

    ACAccountStoreRequestAccessCompletionHandler accountStoreHandler =
    ^(BOOL granted, NSError *error) {
        if (granted) {
            NSArray *accounts = [self.accountStore accountsWithAccountType:twitterType];
            NSURL *url = [NSURL URLWithString:@"https://api.twitter.com"
                          @"/1.1/statuses/update_with_media.json"];
            NSDictionary *params = @{@"status" : status};
            SLRequest *request = [SLRequest requestForServiceType:SLServiceTypeTwitter
                                                    requestMethod:SLRequestMethodPOST
                                                              URL:url
                                                       parameters:params];
            NSData *imageData = UIImageJPEGRepresentation(image, 1.f);
            [request addMultipartData:imageData
                             withName:@"media[]"
                                 type:@"image/jpeg"
                             filename:@"image.jpg"];
            [request setAccount:[accounts lastObject]];
            [request performRequestWithHandler:requestHandler];
        }
        else {
            NSLog(@"[ERROR] An error occurred while asking for user authorization: %@",
                  [error localizedDescription]);
        }
    };

    [self.accountStore requestAccessToAccountsWithType:twitterType
                                               options:NULL
                                            completion:accountStoreHandler];
}

我收到错误

The operation couldn’t be completed. (com.apple.accounts error 6.)
4

1 回答 1

0

你应该使用这个SLComposeViewController类。为此,应按顺序执行多个步骤。首先,应用程序可以可选地检查以验证是否可以将消息发送到指定的社交网络服务。这实质上等同于检查是否已在设备上配置了有效的社交网络帐户并使用isAvailableForServiceType:类方法实现,将以下选项所需的服务类型作为参数传递:

SLServiceTypeFacebook
SLServiceTypeTwitter
SLServiceTypeSinaWeibo

例如,以下代码验证应用程序是否可以使用 Twitter 服务:

if ([SLComposeViewController isAvailableForServiceType:SLServiceTypeTwitter]) 
{
    // Device is able to send a Twitter message
} 

此方法调用是可选的,如果尚未设置指定社交网络的帐户,作曲家将简单地将用户带到可以配置 Twitter 帐户的设备的设置应用程序。下一步是创建SLComposeViewController该类的一个实例并提供一个可选的完成处理程序,当用户取消或用于发送消息时,将调用 Composer 屏幕。接下来,可以在实例上调用一系列方法来使用消息的内容初始化对象,包括消息的初始文本、图像附件和 URL:

  • setInitialTextSLComposeViewController: - 在实例上设置消息的初始文本。
  • addImage: - 添加图像文件作为邮件的附件。
  • addURL: - 将 URL 添加到消息中。该方法自动处理 URL 缩短。上述每个方法都返回一个布尔结果,指示添加内容是否成功。

最后,当消息准备好呈现给用户时,通过调用父视图控制器的 presentViewController: 方法以模态方式呈现 SLComposeViewController 对象:

    SLComposeViewController *composeController = [SLComposeViewController
              composeViewControllerForServiceType:SLServiceTypeTwitter];

    [composeController setInitialText:@"Just found this great website"];
    [composeController addImage:postImage.image];
    [composeController addURL: [NSURL URLWithString: 
              @"http://www.website.com"]];

[self presentViewController:composeController 
          animated:YES completion:nil];

一旦被调用,该方法将向用户呈现作曲家视图,该视图已准备好通过方法调用预先配置的任何文本、图像和 URL 内容。一旦显示,用户可以选择修改消息的文本、取消消息、添加位置数据或发送消息。如果已配置完成处理程序,它将被调用并传递一个值,该值指示用户在作曲家视图中采取的操作。可能的值为:

  • SLComposeViewControllerResultCancelled– 用户通过触摸“取消”按钮取消了作曲会话。
  • SLComposeViewControllerResultDone– 用户通过触摸“发送”按钮发送了撰写的消息。
于 2013-10-25T16:29:47.707 回答