在没有composer iOS的情况下使用Fabric API在Twitter上分享video

video上传通过Twitter的REST API在1月份可用,但没有与框架框架: 链接 !

根据需要使用命令进行3次调用的文档 :INIT,APPEND和FINALIZE。

-(void) shareOnTwitterWithVideo:(NSDictionary*) params{ NSString *text = params[@"text"]; NSData* dataVideo = params[@"video"]; NSString *lengthVideo = [NSString stringWithFormat:@"%d", [params[@"length"] intValue]]; NSString* url = @"https://upload.twitter.com/1.1/media/upload.json"; __block NSString *mediaID; if([[Twitter sharedInstance] session]){ TWTRAPIClient *client = [[Twitter sharedInstance] APIClient]; NSError *error; // First call with command INIT NSDictionary *message = @{ @"status":text, @"command":@"INIT", @"media_type":@"video/mp4", @"total_bytes":lengthVideo}; NSURLRequest *preparedRequest = [client URLRequestWithMethod:@"POST" URL:url parameters:message error:&error]; [client sendTwitterRequest:preparedRequest completion:^(NSURLResponse *urlResponse, NSData *responseData, NSError *error){ if(!error){ NSError *jsonError; NSDictionary *json = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:&jsonError]; mediaID = [json objectForKey:@"media_id_string"]; client = [[Twitter sharedInstance] APIClient]; NSError *error; NSString *videoString = [dataVideo base64EncodedStringWithOptions:0]; // Second call with command APPEND message = @{@"command" : @"APPEND", @"media_id" : mediaID, @"segment_index" : @"0", @"media" : videoString}; NSURLRequest *preparedRequest = [client URLRequestWithMethod:@"POST" URL:url parameters:message error:&error]; [client sendTwitterRequest:preparedRequest completion:^(NSURLResponse *urlResponse, NSData *responseData, NSError *error){ if(!error){ client = [[Twitter sharedInstance] APIClient]; NSError *error; // Third call with command FINALIZE message = @{@"command" : @"FINALIZE", @"media_id" : mediaID}; NSURLRequest *preparedRequest = [client URLRequestWithMethod:@"POST" URL:url parameters:message error:&error]; [client sendTwitterRequest:preparedRequest completion:^(NSURLResponse *urlResponse, NSData *responseData, NSError *error){ if(!error){ client = [[Twitter sharedInstance] APIClient]; NSError *error; // publish video with status NSString *url = @"https://api.twitter.com/1.1/statuses/update.json"; NSMutableDictionary *message = [[NSMutableDictionary alloc] initWithObjectsAndKeys:text,@"status",@"true",@"wrap_links",mediaID, @"media_ids", nil]; NSURLRequest *preparedRequest = [client URLRequestWithMethod:@"POST" URL:url parameters:message error:&error]; [client sendTwitterRequest:preparedRequest completion:^(NSURLResponse *urlResponse, NSData *responseData, NSError *error){ if(!error){ NSError *jsonError; NSDictionary *json = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:&jsonError]; NSLog(@"%@", json); }else{ NSLog(@"Error: %@", error); } }]; }else{ NSLog(@"Error command FINALIZE: %@", error); } }]; }else{ NSLog(@"Error command APPEND: %@", error); } }]; }else{ NSLog(@"Error command INIT: %@", error); } }]; } } 

很好的答案,有一些乐趣把它转换成迅捷,花了我一段时间,所以这是其他人有同样的问题:

 var video: NSData! let strUploadUrl = "https://upload.twitter.com/1.1/media/upload.json" let strStatusUrl = "https://api.twitter.com/1.1/statuses/update.json" func postVideo() { var client = Twitter.sharedInstance().APIClient var text: String = "Testing Video" var videoLength: String = "\(self.video.length)" var mediaID: String = "" var initError: NSError? var message = ["status": text, "command" : "INIT", "media_type" : "video/m4v", "total_bytes" : videoLength] var preparedRequest: NSURLRequest = client.URLRequestWithMethod("POST", URL: self.strUploadUrl, parameters: message, error: &initError) client.sendTwitterRequest(preparedRequest, completion: { (urlResponse: NSURLResponse?, responseData: NSData?, error: NSError?) -> Void in if error == nil { var jsonError: NSError? var json: NSDictionary = (NSJSONSerialization.JSONObjectWithData(responseData!, options: nil, error: &jsonError) as? NSDictionary)! println(json) var mediaID = json.objectForKey("media_id_string") as! String client = Twitter.sharedInstance().APIClient var uploadError: NSError? var videoString = self.video.base64EncodedStringWithOptions(nil) message = ["command" : "APPEND", "media_id" : mediaID, "segment_index" : "0", "media" : videoString] var preparedRequest = client.URLRequestWithMethod("POST", URL: self.strUploadUrl, parameters: message, error: &uploadError) client.sendTwitterRequest(preparedRequest, completion: { (urlResponse: NSURLResponse?, responseData: NSData?, error: NSError?) -> Void in if error == nil { client = Twitter.sharedInstance().APIClient var finalizeError: NSError? message = ["command":"FINALIZE", "media_id": mediaID] var preparedRequest = client.URLRequestWithMethod("POST", URL: self.strUploadUrl, parameters: message, error: &finalizeError) client.sendTwitterRequest(preparedRequest, completion: { (urlResponse: NSURLResponse?, responseData: NSData?, error: NSError?) -> Void in if error == nil { client = Twitter.sharedInstance().APIClient var sendError: NSError? var message = ["status": text, "wrap_links": "true", "media_ids": mediaID] var updateMessage = NSMutableDictionary(dictionary: message) var preparedRequest = client.URLRequestWithMethod("POST", URL: self.strStatusUrl, parameters: message , error: &sendError) client.sendTwitterRequest(preparedRequest, completion: { (urlResponse: NSURLResponse?, responseData: NSData?, error: NSError?) -> Void in }) } else { println("Command FINALIZE failed \n \(error!)") } }) } else { println("Command APPEND failed") } }) } else { println("Command INIT failed") } }) } 
Interesting Posts