【问题标题】:iOS - Unable to Upload media with Twitter/Fabric New SDKiOS - 无法使用 Twitter/Fabric 新 SDK 上传媒体
【发布时间】:2015-06-15 20:24:20
【问题描述】:

我想通过我的 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 e.g.
             NSError *jsonError;
             NSDictionary *json = [NSJSONSerialization
                                   JSONObjectWithData:data
                                   options:0
                                   error:&jsonError];
             NSLog(@"%@",json);
         }
         else {
             NSLog(@"Error: %@", connectionError);
         }
     }];
}
else {
    NSLog(@"Error: %@", clientError);
}

【问题讨论】:

    标签: ios objective-c twitter twitter-rest-api


    【解决方案1】:

    嗯,这很简单。缺少的只是将图像数据转换为 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
        }];
    

    【讨论】:

    • 这对你真的有用吗?我正在尝试这个并得到 503 服务不可用。如果没有 oauth_* 参数,你是如何让它工作的?
    • @sun 如果没有 oauth_* 参数,它将无法工作。您需要先登录才能使用它。
    • 为我工作,谢谢!
    • 如何处理多个图像?你能帮我解决这个问题吗stackoverflow.com/questions/36559534/…
    【解决方案2】:

    完成萨尼的回答

    // 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);
        }
    }];
    

    【讨论】:

      【解决方案3】:

      如果有人仍在寻求帮助,请分享 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")
              }
          })
      }
      

      【讨论】:

        【解决方案4】:

        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")
                                    }
                                }
        
                            })
                        }
                    }
                }
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-04-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-20
          • 2022-01-05
          • 2023-02-11
          相关资源
          最近更新 更多