【问题标题】:Posting image to twitter using twitterkit使用 twitterkit 将图像发布到 Twitter
【发布时间】:2015-04-24 18:01:28
【问题描述】:

我正在尝试使用带有自定义 UI 的 Twitter 新 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"];

【问题讨论】:

    标签: ios objective-c twitter


    【解决方案1】:

    我已经想通了。

    首先,您需要将图片发布到 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];
    

    所以你可以把它放在完成块中,它会发布图片和推文。

    【讨论】:

    • 嗨,corgiDataclient 变量是什么?
    • corgiData 是 NSData *imageData = UIImageJPEGRepresentation(image, 0.9);客户端是 TWTRAPIClient *client;
    【解决方案2】:

    大约在 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]);
                    }
                }];
            }];
        }
    

    【讨论】:

      【解决方案3】:

      斯威夫特

      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
      }
      

      【讨论】:

        【解决方案4】:

        Swift 4 最新版

        1) 检查登录是否完成

        let store = TWTRTwitter.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 {
                TWTRTwitter.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", urlString: 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", urlString: 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")
                                }
                            }
                        })
                    }
                }
            }
        }
        
        func nsDataToJson (data: Data) -> AnyObject? {
            do {
                return try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as AnyObject
            } catch let myJSONError {
                print(myJSONError)
            }
            return nil
        }
        

        注意:安装 pod 文件 pod 'TwitterKit'。 您需要在 appdelegate 和 URL Schemes 中设置与登录相关的其他小东西(上面的代码与登录和带有文本的图片相关) p>

        导入 TwitterKit

        【讨论】:

          猜你喜欢
          • 2016-07-14
          • 1970-01-01
          • 2013-01-15
          • 2015-01-21
          • 1970-01-01
          • 2013-05-04
          • 1970-01-01
          • 2012-10-06
          • 2016-09-12
          相关资源
          最近更新 更多