mirror of
				https://gitcode.com/gh_mirrors/re/react-native-pushy.git
				synced 2025-10-31 13:23:12 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			84 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			84 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| #import "RCTPushyDownloader.h"
 | |
| 
 | |
| @interface RCTPushyDownloader()<NSURLSessionDelegate>
 | |
| 
 | |
| @property (copy) void (^progressHandler)(long long, long long);
 | |
| @property (copy) void (^completionHandler)(NSString*, NSError*);
 | |
| @property (copy) NSString *savePath;
 | |
| @end
 | |
| 
 | |
| @implementation RCTPushyDownloader
 | |
| 
 | |
| + (void)download:(NSString *)downloadPath savePath:(NSString *)savePath
 | |
| progressHandler:(void (^)(long long receivedBytes, long long totalBytes))progressHandler
 | |
| completionHandler:(void (^)(NSString *path, NSError *error))completionHandler
 | |
| {
 | |
|     NSAssert(downloadPath, @"no download path");
 | |
|     NSAssert(savePath, @"no save path");
 | |
| 
 | |
|     RCTPushyDownloader *downloader = [RCTPushyDownloader new];
 | |
|     downloader.progressHandler = progressHandler;
 | |
|     downloader.completionHandler = completionHandler;
 | |
|     downloader.savePath = savePath;
 | |
| 
 | |
|     [downloader download:downloadPath];
 | |
| }
 | |
| 
 | |
| - (void)dealloc
 | |
| {
 | |
| }
 | |
| 
 | |
| - (void)download:(NSString *)path
 | |
| {
 | |
|     NSURL *url = [NSURL URLWithString:path];
 | |
|     
 | |
|     NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
 | |
|     NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig
 | |
|                                                           delegate:self
 | |
|                                                      delegateQueue:nil];
 | |
|     
 | |
|     NSURLSessionDownloadTask *task = [session downloadTaskWithURL:url];
 | |
|     [session downloadTaskWithURL:url];
 | |
|     [task resume];
 | |
| }
 | |
| 
 | |
| #pragma mark - session delegate
 | |
| 
 | |
| - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
 | |
|       didWriteData:(int64_t)bytesWritten
 | |
|  totalBytesWritten:(int64_t)totalBytesWritten
 | |
| totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
 | |
| {
 | |
| #ifdef DEBUG
 | |
|     NSLog(@"download progress, %lld, %lld, %lld", bytesWritten, totalBytesWritten, totalBytesExpectedToWrite);
 | |
| #endif
 | |
|     
 | |
|     if (self.progressHandler) {
 | |
|         self.progressHandler(totalBytesWritten ,totalBytesExpectedToWrite);
 | |
|     }
 | |
| }
 | |
| 
 | |
| - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
 | |
| didFinishDownloadingToURL:(NSURL *)location
 | |
| {
 | |
|     NSData *data = [NSData dataWithContentsOfURL:location];
 | |
|     NSError *error;
 | |
|     [data writeToFile:self.savePath options:NSDataWritingAtomic error:&error];
 | |
|     if (error) {
 | |
|         if (self.completionHandler) {
 | |
|             self.completionHandler(nil, error);
 | |
|             self.completionHandler = nil;
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
 | |
| didCompleteWithError:(NSError *)error
 | |
| {
 | |
|     if (self.completionHandler) {
 | |
|         self.completionHandler(self.savePath, error);
 | |
|     }
 | |
| }
 | |
| 
 | |
| @end
 | 
