使用twitterkit将图像发布到Twitter

我正在尝试使用Twitters新的TwitterKit与自定义用户界面发布图片和推文。 他们提供的唯一文件是如何与他们的意见。

所以我可以弄清楚如何在没有图像的情况下做到这一点

NSMutableDictionary *message = [[NSMutableDictionary alloc] initWithObjectsAndKeys:[params objectForKey:@"description"],@"status",@"true",@"wrap_links", nil]; NSURLRequest* request = [twAPIClient URLRequestWithMethod:@"POST" URL:@"https://api.twitter.com/1.1/statuses/update.json" parameters:message error:nil]; [twAPIClient sendTwitterRequest:request completion:^(NSURLResponse* response, NSData* data, NSError* connectionError){ }]; 

但是他们的URLRequestWithMethod方法是不可变的。 我将如何添加一个图像。 你以前用SLRequest来做

 [postRequest addMultipartData:UIImageJPEGRepresentation(image, 0.5) withName:@"media" type:@"image/jpeg" filename:@"image.png"]; 

我已经知道了。

首先,您需要将图像发布到Twitter。

 NSString *media = @"https://upload.twitter.com/1.1/media/upload.json"; NSData *imageData = UIImageJPEGRepresentation(image, 0.9); NSString *imageString = [corgiData base64EncodedStringWithOptions:0]; NSURLRequest *request = [client URLRequestWithMethod:@"POST" URL:media parameters:@{@"media":imageString} error:&requestError]; [[[Twitter sharedInstance] APIClient] sendTwitterRequest:request completion:^(NSURLResponse *urlResponse, NSData *data, NSError *connectionError) { }]; 

然后在响应对象中使用media_id_string并将其添加到我的问题中的代码的参数。

所以

 NSMutableDictionary *message = [[NSMutableDictionary alloc] initWithObjectsAndKeys:[params objectForKey:@"description"],@"status",@"true",@"wrap_links",mediaIDString, @"media_ids", nil]; NSURLRequest* request = [twAPIClient URLRequestWithMethod:@"POST" URL:@"https://api.twitter.com/1.1/statuses/update.json" parameters:message error:nil]; [twAPIClient sendTwitterRequest:request completion:^(NSURLResponse* response, NSData* data, NSError* connectionError){ NSDictionary *responseDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&parsingError]; }]; 

请注意来自第一个请求的响应的media_ids对象

 NSMutableDictionary *message = [[NSMutableDictionary alloc] initWithObjectsAndKeys:[params objectForKey:@"description"],@"status",@"true",@"wrap_links",[responseDict objectForKey:@"media_id_string"], @"media_ids", nil]; 

所以你可以把它放在完成块内,它会发布图像和鸣叫。

截至2016年4月,Fabric的TwitterKit 2.0(或更新版本)公开了一种新的方法uploadMedia来覆盖媒体上传部分。 这里有一些objc代码适用于我。

 (earlier) self.userID = [[Twitter sharedInstance] sessionStore].session.userID; - (void)tweetImage:(UIImage*)image { NSAssert([NSThread currentThread].isMainThread && self.userID, @"Twitterkit needs main thread, with self.userID set"); if (!self.userID) return; NSString *tweetStr = @"Look at me! I'm tweeting! #hashtag"; TWTRAPIClient *twitterClient = [[TWTRAPIClient alloc] initWithUserID:self.userID]; NSData *imgData = UIImageJPEGRepresentation(image, 0.6f); if (!imgData) { NSAssert(false, @"ERROR: could not make nsdata out of image"); return; } [twitterClient uploadMedia:imgData contentType:@"image/jpeg" completion:^(NSString * _Nullable mediaID, NSError * _Nullable error) { if (error) { NSAssert(false, @"ERROR: error uploading collage to twitter"); return; } NSError *urlerror = nil; NSURLRequest *request = [twitterClient URLRequestWithMethod:@"POST" URL:@"https://api.twitter.com/1.1/statuses/update.json" parameters:@{ @"status":tweetStr, @"media_ids":mediaID } error:&urlerror]; if (urlerror) { NSAssert(false, @"ERROR creating twitter URL request: %@", urlerror); return; } [twitterClient sendTwitterRequest:request completion:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) { if (!connectionError && ((NSHTTPURLResponse*)response).statusCode != 200) { DDLogInfo(@"TwitterHelper tweetImage: non-200 response: %d. Data:\n%@", (int)((NSHTTPURLResponse*)response).statusCode, [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); } }]; }]; } 

迅速

 func post (tweetString: String, tweetImage: NSData) { 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.base64EncodedStringWithOptions(NSDataBase64EncodingOptions()) let request = Twitter.sharedInstance().APIClient.URLRequestWithMethod("POST", URL: uploadUrl, parameters: ["media": imageString], error: nil) Twitter.sharedInstance().APIClient.sendTwitterRequest(request, completion: { (urlResponse, data, connectionError) -> Void in if let mediaDict = self.nsdataToJSON(data!) { let validTweetString = TweetValidator().validTween(tweetString) let message = ["status": validTweetString, "media_ids": mediaDict["media_id_string"]] let request = Twitter.sharedInstance().APIClient.URLRequestWithMethod("POST", URL: updateUrl, parameters: message, error:nil) Twitter.sharedInstance().APIClient.sendTwitterRequest(request, completion: { (response, data, connectionError) -> Void in }) } }) } func nsdataToJSON (data: NSData) -> AnyObject? { do { return try NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers) } catch let myJSONError { print(myJSONError) } return nil } 

Swift 3最新

1)检查login是否完成

 let store = Twitter.sharedInstance().sessionStore if let store = store.session() { print("signed in as \(String(describing: store.authToken))"); print("signed in as \(String(describing: store.authTokenSecret))"); let postImage = UIImage(named: "testImage") let imageData = UIImagePNGRepresentation(postImage!) as Data? self.post(tweetString: "Test post image", tweetImage: (imageData! as NSData) as Data, withUserID: store.userID) } else { Twitter.sharedInstance().logIn(completion: { (session, error) in if (session != nil) { print("login first time in twitter as \(String(describing: session?.userName))"); } else { print("error: \(String(describing: error?.localizedDescription))"); } }) } 

2)用文字上传图片

 func post(tweetString: String, tweetImage: Data ,withUserID :String) { 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: withUserID) let requestUploadUrl = client.urlRequest(withMethod: "POST", url: uploadUrl, parameters: ["media": imageString], error: nil) client.sendTwitterRequest(requestUploadUrl) { (urlResponse, data, connectionError) -> Void in if connectionError == nil { if let mediaDict = self.nsDataToJSON(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", url: updateUrl, parameters: message, error: nil) client.sendTwitterRequest(requestUpdateUrl, completion: { (urlResponse, data, connectionError) -> Void in if connectionError == nil { if let _ = self.nsDataToJSON(data: (data! as NSData) as Data) as? [String : Any] { print("Upload suceess to Twitter") } } }) } } } } 

注意:安装pod文件窗口“TwitterKit”

导入TwitterKit