1
0
Code Issues Pull Requests Packages Projects Releases Wiki Activity GitHub Gitee
react-native-pushy/ios/RCTPushy/RCTPushyDownloader.mm
2023-03-15 23:27:25 +08:00

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