Procházet zdrojové kódy

1.备份代码开始暂存

huangxiaodong před 9 měsíci
rodič
revize
c2e1caa725

+ 20 - 0
创维盒子/双子星云手机.xcodeproj/project.pbxproj

@@ -816,6 +816,10 @@
 		6BB5732E2C7DC7A300713351 /* customUploadOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 6BB5732C2C7DC7A300713351 /* customUploadOperation.m */; };
 		6BB5732F2C7DC7A300713351 /* customUploadOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 6BB5732B2C7DC7A300713351 /* customUploadOperation.h */; };
 		6BB573302C7DC7A300713351 /* customUploadOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 6BB5732C2C7DC7A300713351 /* customUploadOperation.m */; };
+		6BB573342C8076F000713351 /* nasBackupsManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 6BB573322C8076E000713351 /* nasBackupsManager.h */; };
+		6BB573352C8076F000713351 /* nasBackupsManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 6BB573332C8076E000713351 /* nasBackupsManager.m */; };
+		6BB573362C8076F500713351 /* nasBackupsManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 6BB573322C8076E000713351 /* nasBackupsManager.h */; };
+		6BB573372C8076F500713351 /* nasBackupsManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 6BB573332C8076E000713351 /* nasBackupsManager.m */; };
 		6BB852282C4F7FE600570BF6 /* playingAudioGif.gif in Resources */ = {isa = PBXBuildFile; fileRef = 6BB852272C4F7FE500570BF6 /* playingAudioGif.gif */; };
 		6BB852292C4F7FE600570BF6 /* playingAudioGif.gif in Resources */ = {isa = PBXBuildFile; fileRef = 6BB852272C4F7FE500570BF6 /* playingAudioGif.gif */; };
 		6BBB35D92AE7645200E4A59B /* RunInBackground.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = 6BBB35D62AE7645200E4A59B /* RunInBackground.mp3 */; };
@@ -1973,6 +1977,8 @@
 		6BB573262C7DC36600713351 /* nasMixUploadManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = nasMixUploadManager.m; sourceTree = "<group>"; };
 		6BB5732B2C7DC7A300713351 /* customUploadOperation.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = customUploadOperation.h; sourceTree = "<group>"; };
 		6BB5732C2C7DC7A300713351 /* customUploadOperation.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = customUploadOperation.m; sourceTree = "<group>"; };
+		6BB573322C8076E000713351 /* nasBackupsManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = nasBackupsManager.h; sourceTree = "<group>"; };
+		6BB573332C8076E000713351 /* nasBackupsManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = nasBackupsManager.m; sourceTree = "<group>"; };
 		6BB852272C4F7FE500570BF6 /* playingAudioGif.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = playingAudioGif.gif; sourceTree = "<group>"; };
 		6BBB35D62AE7645200E4A59B /* RunInBackground.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; path = RunInBackground.mp3; sourceTree = "<group>"; };
 		6BBB35DB2AE76AD800E4A59B /* AudioSessionObject.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AudioSessionObject.h; sourceTree = "<group>"; };
@@ -3123,6 +3129,7 @@
 		6B5D86632C227C4A008D25EA /* NAS */ = {
 			isa = PBXGroup;
 			children = (
+				6BB573312C8076A600713351 /* nasBackupsManager */,
 				6B9773982C637BFB00213317 /* nasUploadManager */,
 				6B238C8B2C60AA1B00C5AC2F /* nasDownloadManager */,
 				6B8A5ADD2C3BCB2700E40B19 /* recenFile */,
@@ -3349,6 +3356,15 @@
 			path = UploadManager;
 			sourceTree = "<group>";
 		};
+		6BB573312C8076A600713351 /* nasBackupsManager */ = {
+			isa = PBXGroup;
+			children = (
+				6BB573322C8076E000713351 /* nasBackupsManager.h */,
+				6BB573332C8076E000713351 /* nasBackupsManager.m */,
+			);
+			path = nasBackupsManager;
+			sourceTree = "<group>";
+		};
 		6BBB35D42AE7645200E4A59B /* BackgroundKeepAlive */ = {
 			isa = PBXGroup;
 			children = (
@@ -3863,6 +3879,7 @@
 				6B5BE5932BFCA5FA00A1B9B3 /* videoPlayViewController.h in Headers */,
 				1868201D2AB97BE1005702A6 /* TipsQRCodeViewController.h in Headers */,
 				6B5B60602B3BC8DE009A2AE2 /* fileTransferPopView.h in Headers */,
+				6BB573342C8076F000713351 /* nasBackupsManager.h in Headers */,
 				181E85002A8F6B1800292B96 /* LogoSelectView.h in Headers */,
 				6B8A5AE02C3BCC0E00E40B19 /* lastFileModel.h in Headers */,
 				6B5B60762B3E665E009A2AE2 /* filePathCreatPopView.h in Headers */,
@@ -4138,6 +4155,7 @@
 				6B5BE5952BFCA5FA00A1B9B3 /* videoPlayViewController.h in Headers */,
 				6BD506AA2B9576A4006E7CB0 /* TipsQRCodeViewController.h in Headers */,
 				6BD506AB2B9576A4006E7CB0 /* fileTransferPopView.h in Headers */,
+				6BB573362C8076F500713351 /* nasBackupsManager.h in Headers */,
 				6BD506AC2B9576A4006E7CB0 /* LogoSelectView.h in Headers */,
 				6B8A5AE32C3BCC0E00E40B19 /* lastFileModel.h in Headers */,
 				6BD506AD2B9576A4006E7CB0 /* filePathCreatPopView.h in Headers */,
@@ -4897,6 +4915,7 @@
 				6B34DC682BF1FFB1002DD1EF /* imageCollectionViewCell.m in Sources */,
 				6BD5075D2B9576A4006E7CB0 /* JSONModelClassProperty.m in Sources */,
 				6BD5075E2B9576A4006E7CB0 /* uploadFileManager.m in Sources */,
+				6BB573372C8076F500713351 /* nasBackupsManager.m in Sources */,
 				6BD5075F2B9576A4006E7CB0 /* QRCodeScanForChangeDeviceViewController.m in Sources */,
 				6BD507602B9576A4006E7CB0 /* AJPhotoListCell.m in Sources */,
 				6B6ABEEF2BFF5B2F00480BAC /* receiveSaveRecordTableView.m in Sources */,
@@ -5254,6 +5273,7 @@
 				6B34DC662BF1FFB1002DD1EF /* imageCollectionViewCell.m in Sources */,
 				183AE6072A89CE3C00B11CB0 /* JSONModelClassProperty.m in Sources */,
 				6B0582862B0457C400D37290 /* uploadFileManager.m in Sources */,
+				6BB573352C8076F000713351 /* nasBackupsManager.m in Sources */,
 				18F9CB082ABD7835003FF71A /* QRCodeScanForChangeDeviceViewController.m in Sources */,
 				6B0581A32AFCF50300D37290 /* AJPhotoListCell.m in Sources */,
 				6B6ABEED2BFF5B2F00480BAC /* receiveSaveRecordTableView.m in Sources */,

+ 23 - 0
创维盒子/双子星云手机/NAS/nasBackupsManager/nasBackupsManager.h

@@ -0,0 +1,23 @@
+//
+//  nasBackupsManager.h
+//  双子星云手机
+//
+//  Created by xd h on 2024/8/29.
+//
+
+#import <Foundation/Foundation.h>
+#import "photosBackupsTaskModel.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface nasBackupsManager : NSObject
+@property (nonatomic,strong) photosBackupsTaskModel* curPhotosBackupsTaskMod;
+@property (nonatomic,copy) NSString* sdnId;//标志本次是否备份过
+
++(instancetype)shareInstance;
+
+//处理备份消息
+- (void)AutohandlePhotosBackupsFun;
+@end
+
+NS_ASSUME_NONNULL_END

+ 518 - 0
创维盒子/双子星云手机/NAS/nasBackupsManager/nasBackupsManager.m

@@ -0,0 +1,518 @@
+//
+//  nasBackupsManager.m
+//  双子星云手机
+//
+//  Created by xd h on 2024/8/29.
+//
+
+#import "nasBackupsManager.h"
+
+@interface nasBackupsManager ()
+/**检测任务10s后 无反馈重新开始 */
+@property (nonatomic, assign) NSInteger  taskRenewTime; //
+@property (nonatomic,strong)photosBackupsTaskModel *lastModel;//最后一次备份的数据
+@end
+
+@implementation nasBackupsManager
++ (instancetype)shareInstance {
+    static nasBackupsManager *_instance;
+    static dispatch_once_t onceToken;
+    dispatch_once(&onceToken, ^{
+        _instance = [[self alloc] init];
+    });
+    return _instance;
+}
+
+- (void)AutohandlePhotosBackupsFun
+{
+    NSString *curSdnId = [connectDeviceManager shareInstance].DeviceThirdIdMod.data.sdnId;
+    if(!_sdnId || ![curSdnId isEqualToString:_sdnId])
+    {//没有备份过 或者更换设备了
+        [self handlePhotosBackupsFun];
+    }
+    else{
+        [self checkReBackupsFileFun];
+    }
+    
+}
+
+- (void)handlePhotosBackupsFun
+{
+    BOOL haveOpenBackups = [HWDataManager getBoolWithKey:stringKeyAddSn(Const_photo_backups_state)];
+    if(!haveOpenBackups){
+        return;
+    }
+    
+    if(ksharedAppDelegate.DisabledFileTransferType){
+        return;
+    }
+    
+    //相册权限
+    if (![[TZImageManager manager] authorizationStatusAuthorized]){
+        [HWDataManager setBoolWithKey:Const_photo_backups_state value:NO];
+        return;
+    }
+    
+    NSString *curSdnId = [connectDeviceManager shareInstance].DeviceThirdIdMod.data.sdnId;
+    _sdnId = curSdnId;
+    
+    [photosBackupsTaskModel bg_findAsync:backups_photos_tableName limit:0 orderBy:nil desc:YES complete:^(NSArray * _Nullable array) {
+        if(!array || array.count == 0){
+            [self getAllAlbumsFun];
+            return;
+        }
+        
+        if(array.count >1){
+            [self keepDatabaseOneDataFun];
+        }
+        
+        self->_lastModel = array.firstObject;
+        
+        HLog(@"1 bg_id:%@",self->_lastModel.bg_id);
+        
+        if(self->_lastModel.isBackupsSuspendType == backupsSuspendByUser){
+            return;
+        }
+        
+        if(self->_lastModel.curBackupsState == backupsStateFail
+           ||self->_lastModel.curBackupsState == backupsStateDone){//上次备份完成
+            [self getAllAlbumsFun];
+        }
+        else{//继续上次的备份任务
+            [self handelBackupsModelFun:self->_lastModel];
+        }
+    }];
+    
+}
+
+- (void)keepDatabaseOneDataFun
+{
+    [photosBackupsTaskModel bg_deleteFirstObject:backups_photos_tableName];
+}
+
+//备份开始查询相册
+- (void)getAllAlbumsFun
+{
+    //
+    KWeakSelf
+    [[TZImageManager manager] getAllAlbums:YES allowPickingImage:YES needFetchAssets:NO completion:^(NSArray<TZAlbumModel *> *models) {
+        
+        if(models.count >= 1){
+            TZAlbumModel *curAlbumModel= models.firstObject;
+            
+            photosBackupsTaskModel * taskModel = [photosBackupsTaskModel new];
+            //taskModel.count = curAlbumModel.count;
+            //taskModel.result = curAlbumModel.result;
+            
+            taskModel.failCount = 0;
+            taskModel.didBackupsCount = 0;
+            taskModel.bg_tableName = backups_photos_tableName;
+            
+            //备份路径
+            NSString * backupsDefaultPath = [HWDataManager getStringWithKey:stringKeyAddSn(Const_photo_backups_default_path)];
+            
+            if(!backupsDefaultPath || backupsDefaultPath.length == 0){
+                backupsDefaultPath = Const_default_backups_path;
+                [HWDataManager setStringWithKey:stringKeyAddSn(Const_photo_backups_default_path) value:backupsDefaultPath];
+            }
+            
+            NSString *lastStr= [backupsDefaultPath substringFromIndex:backupsDefaultPath.length-1];
+            if(![lastStr isEqualToString:@"/"]){
+                backupsDefaultPath = [[NSString alloc] initWithFormat:@"%@/",backupsDefaultPath];
+            }
+            
+            taskModel.backupsPath = backupsDefaultPath;
+            
+            NSMutableString *allLocalIdentifier= [NSMutableString new];
+            
+            for (PHAsset *asset in curAlbumModel.result) {
+                if (asset.localIdentifier) {
+                    if(allLocalIdentifier.length >0){
+                        [allLocalIdentifier appendString:@"&"];
+                    }
+                    [allLocalIdentifier appendString:asset.localIdentifier];
+                }
+            }
+            
+            taskModel.totalLocalIdentifier = allLocalIdentifier;
+            
+            if(self->_lastModel
+               && self->_lastModel.totalLocalIdentifier
+               && (self->_lastModel.backupsPath && [self->_lastModel.backupsPath isEqualToString:taskModel.backupsPath])){//相册备份排重
+                taskModel.curTaskLocalIdentifier = [weakSelf AlbumBackupsHandleNew:taskModel];
+                
+                taskModel.PreDidBackupsCount = self->_lastModel.PreDidBackupsCount + self->_lastModel.didBackupsCount;
+            }
+            else{
+                taskModel.curTaskLocalIdentifier = allLocalIdentifier;
+            }
+            
+            taskModel.count = [taskModel.curTaskLocalIdentifier componentsSeparatedByString:@"&"].count;
+            
+            HLog(@"2 bg_id:%@",taskModel.bg_id);
+            
+            [taskModel bg_saveAsync:^(BOOL isSuccess) {
+                if(!isSuccess){
+                    HLog(@"\n\nError!!!\n\n");
+                }
+                else{
+                    //[self handelBackupsModelFun:taskModel];
+                    [self handlePhotosBackupsFun];
+                }
+            }];
+        }
+    }];
+}
+
+- (NSString*)AlbumBackupsHandleNew:(photosBackupsTaskModel * )taskModel
+{
+    NSArray* curLocalIdentifierArr = [taskModel.totalLocalIdentifier componentsSeparatedByString:@"&"];
+    NSArray* preLocalIdentifierArr = [_lastModel.totalLocalIdentifier componentsSeparatedByString:@"&"];
+    
+    NSMutableArray *allArr = [NSMutableArray arrayWithArray:curLocalIdentifierArr];
+    
+    for (NSString*localIdentifier in preLocalIdentifierArr) {
+        for (NSString* newlocalIdentifier in allArr) {
+            if([localIdentifier isEqualToString:newlocalIdentifier]){
+                [allArr removeObject:newlocalIdentifier];
+                break;
+            }
+        }
+    }
+    
+    NSMutableString *allLocalIdentifier= [NSMutableString new];
+    for (NSString* newlocalIdentifier in allArr) {
+        if(allLocalIdentifier.length >0){
+            [allLocalIdentifier appendString:@"&"];
+        }
+        [allLocalIdentifier appendString:newlocalIdentifier];
+    }
+    
+    return allLocalIdentifier;
+}
+
+- (void)handelBackupsModelFun:(photosBackupsTaskModel*)backupsTaskModel
+{
+    _curPhotosBackupsTaskMod = backupsTaskModel;
+    _curPhotosBackupsTaskMod.isBackupsSuspendType = backupsSuspendNone;
+    _curPhotosBackupsTaskMod.curBackupsState = backupsStateUploading;
+    
+    _curPhotosBackupsTaskMod.LocalIdentifierArr = [backupsTaskModel.curTaskLocalIdentifier componentsSeparatedByString:@"&"];
+    
+    if(_curPhotosBackupsTaskMod.LocalIdentifierArr.count == 0){
+        
+        _curPhotosBackupsTaskMod.didBackupsCount = 0;
+        _curPhotosBackupsTaskMod.curBackupsState = backupsStateDone;
+        [self RefreshDatabaseFun];
+        [self changeBackupsFileStateFun];
+        return;
+    }
+    
+    if(_curPhotosBackupsTaskMod.LocalIdentifierArr.count
+       <= (_curPhotosBackupsTaskMod.didBackupsCount + _curPhotosBackupsTaskMod.failCount))
+    {
+        _curPhotosBackupsTaskMod.curBackupsState = backupsStateDone;
+        [self RefreshDatabaseFun];
+        [self changeBackupsFileStateFun];
+        return;
+    }
+    
+    [self beginBackupsFileFun];
+}
+
+- (void)beginBackupsFileFun
+{
+    BOOL isCanUseCellular = [HWDataManager getBoolWithKey:stringKeyAddSn(Const_file_Transfe_canUse_Cellular_all)];
+    if(!isCanUseCellular){//不允许流量上传
+        //
+        if([AFNetworkReachabilityManager sharedManager].networkReachabilityStatus == AFNetworkReachabilityStatusReachableViaWWAN){
+            return;
+        }
+        
+    }
+    
+    self.taskRenewTime = [iTools getNowTimeStamp];
+    
+    NSInteger index = _curPhotosBackupsTaskMod.didBackupsCount + _curPhotosBackupsTaskMod.failCount;
+    
+    if(!_curPhotosBackupsTaskMod.LocalIdentifierArr){
+        _curPhotosBackupsTaskMod.LocalIdentifierArr = [_curPhotosBackupsTaskMod.curTaskLocalIdentifier componentsSeparatedByString:@"&"];
+    }
+    
+    if(index >= _curPhotosBackupsTaskMod.LocalIdentifierArr.count){
+        _curPhotosBackupsTaskMod.curBackupsState = backupsStateDone;
+        [self RefreshDatabaseFun];
+        [self changeBackupsFileStateFun];
+        _curPhotosBackupsTaskMod = nil;
+        return;
+    }
+    
+    NSString *curLocalIdentifier = _curPhotosBackupsTaskMod.LocalIdentifierArr[index];
+    
+    if(!curLocalIdentifier || curLocalIdentifier.length == 0)
+    {
+        [self getDataWrongToChangeFailFun];
+        return;
+    }
+        
+    _curPhotosBackupsTaskMod.didUploadBytes = 0;
+    _curPhotosBackupsTaskMod.preDidUploadBytes = 0;
+    _curPhotosBackupsTaskMod.totalBytes = 0;
+    
+    PHFetchResult *fetchResult = [PHAsset fetchAssetsWithLocalIdentifiers:@[curLocalIdentifier] options:nil];
+    PHAsset *curAsset = fetchResult.firstObject;
+    
+    NSString *fileName = [curAsset valueForKey:@"filename"];;
+   
+    if(!fileName){
+        [self getDataWrongToChangeFailFun];
+        return;
+    }
+    _curPhotosBackupsTaskMod.filename = fileName;
+    
+    KWeakSelf
+    if(curAsset.mediaType == PHAssetMediaTypeImage){
+        _curPhotosBackupsTaskMod.curUploadFileType = uploadFileTypeImage;
+        [[PHImageManager defaultManager] requestImageDataForAsset:curAsset options:nil resultHandler:^(NSData * _Nullable imageData, NSString * _Nullable dataUTI, UIImageOrientation orientation, NSDictionary * _Nullable info) {
+                // 直接得到最终的 NSData 数据
+                if (imageData) {
+                    [weakSelf  afterGetImageDataFun:imageData];
+                }
+                else{
+                    [weakSelf getDataWrongToChangeFailFun];
+                }
+        }];
+    }
+    else{
+        _curPhotosBackupsTaskMod.curUploadFileType = uploadFileTypeVideo;
+        
+        //判断文件是否在app内
+       BOOL didSaveFile = [cachesFileManager  checkFileIsSaveState:_curPhotosBackupsTaskMod.filename withType:uploadFileTypeVideo];
+        
+        if(didSaveFile){
+            [self afterGetVideoDataFun];
+            return;
+        }
+        
+        //真正的视频数据
+        PHVideoRequestOptions *options = [[PHVideoRequestOptions alloc] init];
+        options.version = PHVideoRequestOptionsVersionOriginal;
+        [[PHImageManager defaultManager] requestAVAssetForVideo:curAsset options:options resultHandler:^(AVAsset *asset, AVAudioMix *audioMix, NSDictionary *info) {
+            if ([asset isKindOfClass:[AVURLAsset class]]) {
+                
+                AVURLAsset* urlAsset = (AVURLAsset*)asset;
+                
+                BOOL isSuc = [cachesFileManager copyVideoItemAtPath:[urlAsset.URL path] fileName:self->_curPhotosBackupsTaskMod.filename error:nil];
+        
+                if (isSuc) {
+                    [weakSelf  afterGetVideoDataFun];
+                }
+                else{
+                    [weakSelf getDataWrongToChangeFailFun];
+                }
+            }
+            else{
+                [weakSelf getDataWrongToChangeFailFun];
+            }
+        }];
+    }
+    
+}
+
+- (void)getDataWrongToChangeFailFun
+{
+    [self deleteVideoFun];
+    _curPhotosBackupsTaskMod.failCount += 1;
+    
+    [self RefreshDatabaseFun];
+    
+    if(_curPhotosBackupsTaskMod.curBackupsState == backupsStateSuspend){
+        return;
+    }
+    
+    [self beginBackupsFileFun];
+}
+
+- (void)changeBackupsFileStateToFailWith:(NSString*)errorStr
+{
+    [self deleteVideoFun];
+    _curPhotosBackupsTaskMod.curBackupsState = backupsStateFail;
+    _curPhotosBackupsTaskMod.backupsTipMsg = errorStr;
+    [self RefreshDatabaseFun];
+    [self changeBackupsFileStateFun];
+}
+
+- (void)RefreshDatabaseFun
+{
+    HLog(@"3 bg_id:%@",_curPhotosBackupsTaskMod.bg_id);
+    [_curPhotosBackupsTaskMod bg_saveOrUpdateAsync:^(BOOL isSuccess) {
+                if(isSuccess){
+                }
+    }];
+}
+
+- (void)afterGetImageDataFun:(NSData*)imageData
+{
+    _curPhotosBackupsTaskMod.imageData = imageData;
+    _curPhotosBackupsTaskMod.didUploadBytes = 0;
+    _curPhotosBackupsTaskMod.totalBytes = [imageData length];
+    [[webSocketManager shareInstance] beginGotoBackupsFileFunBy:_curPhotosBackupsTaskMod];
+    [self RefreshDatabaseFun];
+    [self changeBackupsFileStateFun];
+}
+
+- (void)deleteVideoFun
+{
+    if(_curPhotosBackupsTaskMod.curUploadFileType == uploadFileTypeVideo){
+        [cachesFileManager removeItemAtPath:_curPhotosBackupsTaskMod.filename type:uploadFileTypeVideo error:nil];
+    }
+}
+
+- (void)afterGetVideoDataFun
+{
+    NSString *filePath = [cachesFileManager getFilePathWithName:_curPhotosBackupsTaskMod.filename type:uploadFileTypeVideo]; // 文件路径
+    
+    NSFileManager *manager0 = [NSFileManager defaultManager];
+    if([manager0 fileExistsAtPath:filePath]) {
+        NSFileHandle *fileHandle = [NSFileHandle fileHandleForReadingAtPath:filePath]; // 创建文件句柄
+        
+        if (fileHandle) {
+            long long endOfFile = [fileHandle seekToEndOfFile];
+            
+            _curPhotosBackupsTaskMod.didUploadBytes = 0;
+            _curPhotosBackupsTaskMod.totalBytes = endOfFile;
+            [fileHandle closeFile];
+        }
+        
+    }
+    
+    
+    [[webSocketManager shareInstance] beginGotoBackupsFileFunBy:_curPhotosBackupsTaskMod];
+    [self RefreshDatabaseFun];
+    [self changeBackupsFileStateFun];
+}
+
+- (void)backupsFileDoneFun
+{
+    [self deleteVideoFun];
+    _curPhotosBackupsTaskMod.didBackupsCount += 1;
+    
+//    if(!_curPhotosBackupsTaskMod.didBackupsOneFileType)
+//    {
+//        _curPhotosBackupsTaskMod.curTaskBackupsCount += 1;
+//    }
+    
+    [self RefreshDatabaseFun];
+    [self changeBackupsFileStateFun];
+    
+    if(_curPhotosBackupsTaskMod.curBackupsState == backupsStateSuspend){
+        return;
+    }
+    
+    //延时 进度条视觉效果
+    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
+        [self beginBackupsFileFun];
+    });
+    
+    
+}
+
+//修改文件上传的状态
+- (void)changeBackupsFileStateFun
+{
+    self.taskRenewTime = [iTools getNowTimeStamp];
+    
+    [[NSNotificationCenter defaultCenter] postNotificationName:backupsFileRefreshNotification object:_curPhotosBackupsTaskMod];
+}
+
+- (void)suspendBackupsFileFun
+{
+    if(!_curPhotosBackupsTaskMod){
+        return;
+    }
+    
+    _curPhotosBackupsTaskMod.curBackupsState = backupsStateSuspend;
+    _curPhotosBackupsTaskMod.backupsTipMsg = NSLocalizedString(@"File_backups_Record_tip_Suspend",nil);
+    
+    [_curPhotosBackupsTaskMod bg_saveOrUpdateAsync:^(BOOL isSuccess) {
+        if(isSuccess){
+            [self changeBackupsFileStateFun];
+        }
+    }];
+    
+}
+
+//文件重新备份
+- (void)reBackupsFileFunBy:(photosBackupsTaskModel*)model
+{
+    model.isBackupsSuspendType = backupsSuspendNone;
+    model.curBackupsState = backupsStateUploading;
+    _curPhotosBackupsTaskMod = model;
+        
+    [self RefreshDatabaseFun];
+    [self changeBackupsFileStateFun];
+    
+    [self beginBackupsFileFun];
+    
+//    [_curPhotosBackupsTaskMod bg_saveOrUpdateAsync:^(BOOL isSuccess) {
+//        if(isSuccess){
+//            [self beginBackupsFileFun];
+//        }
+//    }];
+    
+}
+
+//文件重新备份
+- (void)reBackupsFileFun
+{
+    [self handlePhotosBackupsFun];
+    
+    //if(_curPhotosBackupsTaskMod.curBackupsState != backupsStateUploading)
+    if(self->_lastModel.curBackupsState != backupsStateUploading){
+        if(self->_lastModel.curBackupsState == backupsStateFail
+           ||self->_lastModel.curBackupsState == backupsStateDone){//上次备份完成
+            [self getAllAlbumsFun];
+        }
+        else{//继续上次的备份任务
+            [self handelBackupsModelFun:self->_lastModel];
+        }
+    }
+}
+
+//检查是否需要重新备份
+- (void)checkReBackupsFileFun
+{
+    if(!_curPhotosBackupsTaskMod){
+        return;
+    }
+    
+    if(_curPhotosBackupsTaskMod.curBackupsState != backupsStateUploading){
+        return;
+    }
+    
+    NSInteger curTime = [iTools getNowTimeStamp];
+    
+    if(self.taskRenewTime == 0){
+        return;
+    }
+    
+    if(curTime - self.taskRenewTime < 10){
+        return;
+    }
+    
+    [self beginBackupsFileFun];
+}
+
+//检查是否在备份中
+- (BOOL)checkBackupsingFun{
+    if(!_curPhotosBackupsTaskMod){
+        return NO;
+    }
+    
+    if(_curPhotosBackupsTaskMod.curBackupsState == backupsStateSuspend){
+        return NO;
+    }
+    
+    return YES;
+}
+@end

+ 3 - 1
创维盒子/双子星云手机/cloudPhone/websocket/webSocketManager.m

@@ -16,6 +16,7 @@
 #import "RcGameWQKeyChain.h"
 #import "USBInsertPopView.h"
 #import "nasMixUploadManager.h"
+#import "nasBackupsManager.h"
 
 @interface webSocketManager ()
 {
@@ -512,7 +513,8 @@ static webSocketManager *webSocketManagerInstance = nil;
     [[errorAlertTool shareInstance] dismissErrorAlertFun];
     
     //处理相册备份
-    [[backupsFileManager shareInstance] AutohandlePhotosBackupsFun];
+    //[[backupsFileManager shareInstance] AutohandlePhotosBackupsFun];
+    [[nasBackupsManager shareInstance] AutohandlePhotosBackupsFun];
     
     //获取磁盘外挂
     [self getExtraFilesListFun];