Explorar o código

1.修改Apex Mobile Network,增加Download。

Pen Li %!s(int64=8) %!d(string=hai) anos
pai
achega
15c47f77e5

+ 2 - 0
common/NetworkUtils.h

@@ -25,4 +25,6 @@ typedef void(^progressHandler)(NSURLSessionTask *task,double progress);
 + (NSURLSessionTask *)upload:(NSString *)filePath Params:(NSDictionary *)params ToHost:(NSString *)url Result:(resultHandler)r Progress:(progressHandler)p DecryptHandler:(id(^)(NSString *result))decrypt;
 + (NSURLSessionTask *)upload:(NSString *)filePath Params:(NSDictionary *)params ToHost:(NSString *)url Result:(resultHandler)r Progress:(progressHandler)p DecryptHandler:(id(^)(NSString *result))decrypt;
 
 
 + (NSURLSessionTask *)upload:(NSData *)filedata  FileName:(NSString*) filename Params:(NSDictionary *)params ToHost:(NSString *)urlString Result:(resultHandler)r Progress:(progressHandler)p DecryptHandler:(id (^)(NSString *))decrypt;
 + (NSURLSessionTask *)upload:(NSData *)filedata  FileName:(NSString*) filename Params:(NSDictionary *)params ToHost:(NSString *)urlString Result:(resultHandler)r Progress:(progressHandler)p DecryptHandler:(id (^)(NSString *))decrypt;
+
++ (NSURLSessionDataTask *)downloadFileOffset:(NSUInteger)offset Param:(NSDictionary *)param from:(NSString *)url method:(NSString *)method toPath:(NSString *)path progressHandler:(progressHandler)progressHandler completionHandler:(resultHandler)result;
 @end
 @end

+ 37 - 0
common/NetworkUtils.m

@@ -488,4 +488,41 @@ repeat:
     
     
     return session;
     return session;
 }
 }
+
++ (NSURLSessionDataTask *)downloadFileOffset:(NSUInteger)offset Param:(NSDictionary *)param from:(NSString *)url method:(NSString *)method toPath:(NSString *)path progressHandler:(progressHandler)progressHandler completionHandler:(resultHandler)result {
+    
+    NSURLSession *sessoin = [self standSession];
+    
+    RANetworkTaskDelegate *delegate = (RANetworkTaskDelegate *)sessoin.delegate;
+    delegate.downloadTask = YES;
+    delegate.fileCachePath = path;
+    
+    NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];
+    
+    req.HTTPMethod = method;
+    
+    if (offset > 0) {
+        [req addValue:[NSString stringWithFormat:@"bytes=%ld-",(unsigned long)offset] forHTTPHeaderField:@"Range"];
+    }
+    
+    // 拼接参数
+    if (param && param.allValues.count > 0) {
+        __block NSMutableArray *paramArr = [NSMutableArray array];
+        [param enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
+            [paramArr addObject:[NSString stringWithFormat:@"%@=%@",key,obj]];
+        }];
+        NSString *paramStr = [paramArr componentsJoinedByString:@"&"];
+        
+        req.HTTPBody = [paramStr dataUsingEncoding:NSUTF8StringEncoding];
+    }
+
+    NSURLSessionDataTask *downloadTask = [sessoin dataTaskWithRequest:req];
+    
+    [downloadTask resume];
+        
+    return downloadTask;
+
+    
+}
+
 @end
 @end

+ 3 - 0
common/upload/RANetworkTaskDelegate.h

@@ -15,6 +15,9 @@ typedef void(^progressHandler)(NSURLSessionTask *task,double progress);
 
 
 @interface RANetworkTaskDelegate : NSObject <NSURLSessionDataDelegate>
 @interface RANetworkTaskDelegate : NSObject <NSURLSessionDataDelegate>
 
 
+@property (nonatomic,assign,getter=isDownloadTask) BOOL downloadTask;
+@property (nonatomic,copy) NSString *fileCachePath;
+
 @property (nonatomic,copy) progressHandler p;
 @property (nonatomic,copy) progressHandler p;
 @property (nonatomic,copy) resultHandler r;
 @property (nonatomic,copy) resultHandler r;
 @property (nonatomic,copy) id(^decryptHandler)(NSString *encryptString);
 @property (nonatomic,copy) id(^decryptHandler)(NSString *encryptString);

+ 103 - 1
common/upload/RANetworkTaskDelegate.m

@@ -8,11 +8,73 @@
 
 
 #import "RANetworkTaskDelegate.h"
 #import "RANetworkTaskDelegate.h"
 
 
+
+@interface JLFileStream : NSObject
+
+@property (nonatomic,copy) NSString *filePath;
+@property (nonatomic,strong) NSInputStream *inputStream;
+@property (nonatomic,strong) NSOutputStream *outputStream;
+
+@end
+
+@implementation JLFileStream
+
+#pragma mark - life
+
++ (instancetype)jl_fileStreamOfPath:(NSString *)path {
+    
+    JLFileStream *stream = [[JLFileStream alloc] init];
+    stream.filePath = path;
+    
+    return stream;
+}
+
+- (void)setFilePath:(NSString *)filePath {
+    _filePath = filePath;
+    
+    if (!filePath) {
+        return;
+    }
+    
+    if (_outputStream) {
+        [_outputStream close];
+    }
+    
+    _outputStream = [NSOutputStream outputStreamToFileAtPath:self.filePath append:YES];
+    [_outputStream open];
+    
+}
+
+#pragma mark - out put stream
+
+- (void)jl_writeData:(NSData *)data {
+    
+    [self writeData:data toPath:self.filePath];
+    
+}
+
+- (void)writeData:(NSData *)data toPath:(NSString *)path {
+    
+    [self.outputStream write:data.bytes maxLength:data.length];
+    
+}
+
+- (void)jl_closeWriter {
+    
+    [self.outputStream close];
+    
+}
+
+@end
+
+
 @interface RANetworkTaskDelegate ()
 @interface RANetworkTaskDelegate ()
 
 
 @property (nonatomic,strong) NSMutableData *recvData;
 @property (nonatomic,strong) NSMutableData *recvData;
 //@property (nonatomic,strong) NSMutableDictionary *result;
 //@property (nonatomic,strong) NSMutableDictionary *result;
 
 
+@property (nonatomic,strong) JLFileStream *fileStream;
+
 @end
 @end
 
 
 @implementation RANetworkTaskDelegate
 @implementation RANetworkTaskDelegate
@@ -60,6 +122,10 @@
 //
 //
 //
 //
     
     
+    if (self.isDownloadTask) {
+        [self.fileStream jl_closeWriter];
+    }
+    
 
 
     printf("net work complete\n");
     printf("net work complete\n");
     if (self.r) {
     if (self.r) {
@@ -102,6 +168,36 @@
     
     
     NSLog(@"Delegate recv response: %@",response);
     NSLog(@"Delegate recv response: %@",response);
     
     
+    if (self.isDownloadTask) {
+        
+        // 文件保存地址
+        if (!self.fileCachePath) {
+            self.fileCachePath = NSTemporaryDirectory();
+        }
+        NSString *desPath = self.fileCachePath;
+        NSError *err;
+        BOOL isDir = NO;
+        [[NSFileManager defaultManager] fileExistsAtPath:desPath isDirectory:&isDir];
+        if (isDir) {
+            
+            desPath = [self.fileCachePath stringByAppendingPathComponent:response.suggestedFilename];
+        }
+        
+        // 如果文件存在
+        if ([[NSFileManager defaultManager] fileExistsAtPath:desPath]) {
+            
+            [[NSFileManager defaultManager] removeItemAtPath:desPath error:&err];
+            if (err) {
+                completionHandler(NSURLSessionResponseCancel);
+                return;
+            }
+        }
+        
+        self.fileCachePath = desPath;
+        
+        self.fileStream = [JLFileStream jl_fileStreamOfPath:self.fileCachePath];
+    }
+    
 //    self.result.response = response;
 //    self.result.response = response;
     completionHandler(NSURLSessionResponseAllow);
     completionHandler(NSURLSessionResponseAllow);
     
     
@@ -109,7 +205,13 @@
 
 
 - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data {
 - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data {
     
     
-    [self.recvData appendData:data];
+    if (!self.isDownloadTask) {
+        [self.recvData appendData:data];
+    } else {
+        
+        [self.fileStream jl_writeData:data];
+
+    }
 }
 }
 
 
 @end
 @end