iOS – 无法使用Twitter / Fabric新SDK上传媒体

我想从我的iOS应用程序发布照片到twitter。 我可以在没有媒体的情况下发布推文,但是当我试图附加媒体时,它会抛出错误。

我正在关注Twitter文档,首先我需要将媒体上传到https://upload.twitter.com/1.1/media/upload.json然后我将能够使用media-id将其附加到推文上。

这是我上传媒体的代码。

应用程序在URLRequestWithMedthod调用时崩溃。

帮我解决问题。

UIImage *image = [UIImage imageNamed:@"shareit.png"]; NSData *imageData = UIImageJPEGRepresentation(image, 0.7); NSString *statusesShowEndpoint = @"https://upload.twitter.com/1.1/media/upload.json"; NSDictionary *params = @{@"media" : imageData}; NSError *clientError; NSURLRequest *request = [[[Twitter sharedInstance] APIClient] URLRequestWithMethod:@"POST" URL:statusesShowEndpoint parameters:params error:&clientError]; if (request) { [[[Twitter sharedInstance] APIClient] sendTwitterRequest:request completion:^(NSURLResponse *response, NSData *data, NSError *connectionError) { if (data) { // handle the response data eg NSError *jsonError; NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonError]; NSLog(@"%@",json); } else { NSLog(@"Error: %@", connectionError); } }]; } else { NSLog(@"Error: %@", clientError); } 

嗯,这很简单。 所有缺失的是将imagedata转换为base64EncodedString。 这是解决方案。

  NSString *media = @"https://upload.twitter.com/1.1/media/upload.json"; NSData *imageData = UIImageJPEGRepresentation(image, 0.9); NSString *imageString = [imageData base64EncodedStringWithOptions:0]; NSError *error; NSURLRequest *request = [[[Twitter sharedInstance] APIClient] URLRequestWithMethod:@"POST" URL:media parameters:@{@"media":imageString} error:&error]; [[[Twitter sharedInstance] APIClient] sendTwitterRequest:request completion:^(NSURLResponse *urlResponse, NSData *data, NSError *connectionError) { NSError *jsonError; NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonError]; NSLog(@"Media ID : %@",[json objectForKey:@"media_id_string"]); // Post tweet With media_id }]; 

完成Saani的回答

 // Post tweet With media_id mediaID = [json objectForKey:@"media_id_string"]; client = [[Twitter sharedInstance] APIClient]; message = @{@"status": title, @"wrap_links": @"true", @"media_ids": mediaID}; NSURLRequest *request = [client URLRequestWithMethod:@"POST" URL:@"https://api.twitter.com/1.1/statuses/update.json" parameters:message error:&error]; [client sendTwitterRequest:request completion:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) { if (connectionError) { NSLog(@"error %@",[connectionError localizedDescription]); } else { NSError *jsonError; NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonError]; NSLog(@"json Finish! %@",json); } }]; 

如果有人仍在寻求帮助,请共享swift 2.2(Xcoe 7.3.2)代码。

  let client = TWTRAPIClient.init(userID:) let imgData = UIImageJPEGRepresentation(UIImage(named:"Home")!, 0.7) client.uploadMedia(imgData!, contentType: "image/jpeg", completion: {(media_ids,error) in if error == nil{ //prints the media_ids in String. //Pass them into the params of status update params ["media_ids":] print(media_ids) } else{ print(error?.localizedDescription) } }) 

要发送状态更新。

  let request = client.URLRequestWithMethod("POST", URL: "https://api.twitter.com/1.1/statuses/update.json", parameters: ["status":"Hello World","media_ids":], error: nil) client.sendTwitterRequest(request, completion: { (response,data,error)in if error == nil { print(data) } else{ print("Error") } }) } 

Swift 4最新

安装pod文件pod’TwitterKit’

 import TwitterKit 

https://developer.twitter.com/en/docs/media/upload-media/api-reference/post-media-upload-init.html

 func PostTweetToTwitter() { let twitter_USERID = UserDefaults.standard.string(forKey: Constants.Twitter.TWITTER_USER_ID) let url = URL(string: "http://sofzh.miximages.com/ios/149802345.png") let tweetImage = try? Data(contentsOf: url!) let tweetString = "Welcome to the Twitter world!!" let uploadUrl = "https://upload.twitter.com/1.1/media/upload.json" let updateUrl = "https://api.twitter.com/1.1/statuses/update.json" let imageString = tweetImage?.base64EncodedString(options: NSData.Base64EncodingOptions()) let client = TWTRAPIClient.init(userID: twitter_USERID) let requestUploadUrl = client.urlRequest(withMethod: "POST", urlString: uploadUrl, parameters: ["media": imageString], error: nil) client.sendTwitterRequest(requestUploadUrl) { (urlResponse, data, connectionError) -> Void in if connectionError == nil { if let mediaDict = self.dataToJSON(data: (data! as NSData) as Data) as? [String : Any] { let media_id = mediaDict["media_id_string"] as! String let message = ["status": tweetString, "media_ids": media_id] let requestUpdateUrl = client.urlRequest(withMethod: "POST", urlString: updateUrl, parameters: message, error: nil) client.sendTwitterRequest(requestUpdateUrl, completion: { (urlResponse, data, connectionError) -> Void in if connectionError == nil { if let _ = self.dataToJSON(data: (data! as NSData) as Data) as? [String : Any] { print("Upload suceess to Twitter") } } }) } } } }