iOS - 无法使用 Twitter/Fabric 新 SDK 上传媒体
iOS - Unable to Upload media with Twitter/Fabric New SDK
我想从我的 iOS 应用程序 post 一张照片发到 Twitter。我可以 post 一条没有媒体的推文,但是当我尝试附加媒体时它会抛出错误。
我正在关注 Twitter 文档,根据该文档,我首先需要将媒体上传到 https://upload.twitter.com/1.1/media/upload.json,然后我才能使用媒体 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 e.g.
NSError *jsonError;
NSDictionary *json = [NSJSONSerialization
JSONObjectWithData:data
options:0
error:&jsonError];
NSLog(@"%@",json);
}
else {
NSLog(@"Error: %@", connectionError);
}
}];
}
else {
NSLog(@"Error: %@", clientError);
}
其实很简单。所缺少的只是将图像数据转换为 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
}];
完成萨尼人的回答
// 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:<Twitter_User_Id_Here>)
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":<MEDIA_ID>]
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":<Media_Ids_Here>], 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://www.tinyeyeimage.com/picture/Photos/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")
}
}
})
}
}
}
}
我想从我的 iOS 应用程序 post 一张照片发到 Twitter。我可以 post 一条没有媒体的推文,但是当我尝试附加媒体时它会抛出错误。
我正在关注 Twitter 文档,根据该文档,我首先需要将媒体上传到 https://upload.twitter.com/1.1/media/upload.json,然后我才能使用媒体 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 e.g.
NSError *jsonError;
NSDictionary *json = [NSJSONSerialization
JSONObjectWithData:data
options:0
error:&jsonError];
NSLog(@"%@",json);
}
else {
NSLog(@"Error: %@", connectionError);
}
}];
}
else {
NSLog(@"Error: %@", clientError);
}
其实很简单。所缺少的只是将图像数据转换为 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
}];
完成萨尼人的回答
// 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:<Twitter_User_Id_Here>)
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":<MEDIA_ID>]
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":<Media_Ids_Here>], 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://www.tinyeyeimage.com/picture/Photos/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")
}
}
})
}
}
}
}