Browse Source

重写了网络请求

100Years 2 months ago
parent
commit
dea8272c25
21 changed files with 444 additions and 1207 deletions
  1. 12 24
      AICalendarWallpaper.xcodeproj/project.pbxproj
  2. 0 9
      AICalendarWallpaper/AppDelegate.swift
  3. 5 3
      AICalendarWallpaper/Business/AICalendar/ASAICalendarHistoryVC/ASAICalendarHistoryCell.swift
  4. 2 2
      AICalendarWallpaper/Business/ASAIGeneratorVC/ASGeneratorView/ASGeneratorView.swift
  5. 8 72
      AICalendarWallpaper/Business/Data/ASActionInfoModel.swift
  6. 1 34
      AICalendarWallpaper/Business/Data/ASDBActionInfoModel.swift
  7. 0 4
      AICalendarWallpaper/Business/Data/ASDBHistoryManager.swift
  8. 7 25
      AICalendarWallpaper/Business/Launch/ASLaunch.swift
  9. 3 11
      AICalendarWallpaper/Business/OperationQueue/AIGenerate/ASGenerateBaseOperation.swift
  10. 6 12
      AICalendarWallpaper/Business/OperationQueue/AIGenerate/ASGenerateTTPOperation.swift
  11. 1 1
      AICalendarWallpaper/Business/OperationQueue/ASProgressState.swift
  12. 91 0
      AICalendarWallpaper/Common/AIEndpoint.swift
  13. 20 18
      AICalendarWallpaper/Common/AINetworkManager.swift
  14. 94 0
      AICalendarWallpaper/Common/AIResponseStatusCode.swift
  15. 13 0
      AICalendarWallpaper/Common/Base/AIBaseCollectionCell.swift
  16. 3 3
      AICalendarWallpaper/Common/Base/AIBaseModel.swift
  17. 0 394
      AICalendarWallpaper/Common/CpuMapManager.swift
  18. 178 0
      AICalendarWallpaper/Common/Ex/UIDevice+Ex.swift
  19. 0 157
      AICalendarWallpaper/Common/TSNetWork/TSNetWork+Business.swift
  20. 0 111
      AICalendarWallpaper/Common/TSNetWork/TSNetWork+Error.swift
  21. 0 327
      AICalendarWallpaper/Common/TSNetWork/TSNetworkManager.swift

+ 12 - 24
AICalendarWallpaper.xcodeproj/project.pbxproj

@@ -35,6 +35,9 @@
 		A85421D22DEFE968005D5BA5 /* AIBaseModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A85421D12DEFE963005D5BA5 /* AIBaseModel.swift */; };
 		A85421D42DEFEB38005D5BA5 /* AIClickButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = A85421D32DEFEB38005D5BA5 /* AIClickButton.swift */; };
 		A85421D62DEFED21005D5BA5 /* AINetworkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A85421D52DEFED1D005D5BA5 /* AINetworkManager.swift */; };
+		A85421D82DEFEFE3005D5BA5 /* AIResponseStatusCode.swift in Sources */ = {isa = PBXBuildFile; fileRef = A85421D72DEFEFE0005D5BA5 /* AIResponseStatusCode.swift */; };
+		A85421DA2DEFF0EF005D5BA5 /* AIEndpoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = A85421D92DEFF0EE005D5BA5 /* AIEndpoint.swift */; };
+		A85421DC2DF01450005D5BA5 /* UIDevice+Ex.swift in Sources */ = {isa = PBXBuildFile; fileRef = A85421DB2DF0144C005D5BA5 /* UIDevice+Ex.swift */; };
 		A8990E3C2DE40B8C00DD55FE /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8990E322DE40B8C00DD55FE /* AppDelegate.swift */; };
 		A8990E3F2DE40B8C00DD55FE /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A8990E332DE40B8C00DD55FE /* Assets.xcassets */; };
 		A8990E412DE40B8C00DD55FE /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A8990E362DE40B8C00DD55FE /* LaunchScreen.storyboard */; };
@@ -50,10 +53,6 @@
 		A8990E632DE41D2D00DD55FE /* APSettingVC+Col.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8990E622DE41D2C00DD55FE /* APSettingVC+Col.swift */; };
 		A8990E662DE41D9C00DD55FE /* ASTutorialsVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8990E652DE41D9B00DD55FE /* ASTutorialsVC.swift */; };
 		A8990E692DE41DAF00DD55FE /* ASBusinessWebVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8990E682DE41DAE00DD55FE /* ASBusinessWebVC.swift */; };
-		A8990E702DE441AC00DD55FE /* TSNetWork+Business.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8990E6C2DE441AC00DD55FE /* TSNetWork+Business.swift */; };
-		A8990E712DE441AC00DD55FE /* TSNetworkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8990E6B2DE441AC00DD55FE /* TSNetworkManager.swift */; };
-		A8990E722DE441AC00DD55FE /* TSNetWork+Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8990E6A2DE441AC00DD55FE /* TSNetWork+Error.swift */; };
-		A8990E742DE4424A00DD55FE /* CpuMapManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8990E732DE4424A00DD55FE /* CpuMapManager.swift */; };
 		A8990E762DE4431800DD55FE /* ASAICalendarVC+View.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8990E752DE4430F00DD55FE /* ASAICalendarVC+View.swift */; };
 		A8990E792DE4438000DD55FE /* ASCommonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8990E782DE4437F00DD55FE /* ASCommonView.swift */; };
 		A8990E7B2DE4438C00DD55FE /* ASLeftHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8990E7A2DE4438C00DD55FE /* ASLeftHeaderView.swift */; };
@@ -113,6 +112,9 @@
 		A85421D12DEFE963005D5BA5 /* AIBaseModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AIBaseModel.swift; sourceTree = "<group>"; };
 		A85421D32DEFEB38005D5BA5 /* AIClickButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AIClickButton.swift; sourceTree = "<group>"; };
 		A85421D52DEFED1D005D5BA5 /* AINetworkManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AINetworkManager.swift; sourceTree = "<group>"; };
+		A85421D72DEFEFE0005D5BA5 /* AIResponseStatusCode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AIResponseStatusCode.swift; sourceTree = "<group>"; };
+		A85421D92DEFF0EE005D5BA5 /* AIEndpoint.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AIEndpoint.swift; sourceTree = "<group>"; };
+		A85421DB2DF0144C005D5BA5 /* UIDevice+Ex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIDevice+Ex.swift"; sourceTree = "<group>"; };
 		A8990E1A2DE40B8500DD55FE /* AICalendarWallpaper.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AICalendarWallpaper.app; sourceTree = BUILT_PRODUCTS_DIR; };
 		A8990E322DE40B8C00DD55FE /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
 		A8990E332DE40B8C00DD55FE /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
@@ -130,10 +132,6 @@
 		A8990E622DE41D2C00DD55FE /* APSettingVC+Col.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APSettingVC+Col.swift"; sourceTree = "<group>"; };
 		A8990E652DE41D9B00DD55FE /* ASTutorialsVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ASTutorialsVC.swift; sourceTree = "<group>"; };
 		A8990E682DE41DAE00DD55FE /* ASBusinessWebVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ASBusinessWebVC.swift; sourceTree = "<group>"; };
-		A8990E6A2DE441AC00DD55FE /* TSNetWork+Error.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "TSNetWork+Error.swift"; sourceTree = "<group>"; };
-		A8990E6B2DE441AC00DD55FE /* TSNetworkManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSNetworkManager.swift; sourceTree = "<group>"; };
-		A8990E6C2DE441AC00DD55FE /* TSNetWork+Business.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "TSNetWork+Business.swift"; sourceTree = "<group>"; };
-		A8990E732DE4424A00DD55FE /* CpuMapManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CpuMapManager.swift; sourceTree = "<group>"; };
 		A8990E752DE4430F00DD55FE /* ASAICalendarVC+View.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ASAICalendarVC+View.swift"; sourceTree = "<group>"; };
 		A8990E782DE4437F00DD55FE /* ASCommonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ASCommonView.swift; sourceTree = "<group>"; };
 		A8990E7A2DE4438C00DD55FE /* ASLeftHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ASLeftHeaderView.swift; sourceTree = "<group>"; };
@@ -179,6 +177,7 @@
 		A854218F2DEED07E005D5BA5 /* Ex */ = {
 			isa = PBXGroup;
 			children = (
+				A85421DB2DF0144C005D5BA5 /* UIDevice+Ex.swift */,
 				A85421AB2DEEE442005D5BA5 /* UIStackView+Ex.swift */,
 				A85421A92DEEE244005D5BA5 /* Array+Ex.swift */,
 				A854219C2DEEE0D2005D5BA5 /* UIColor+Ex.swift */,
@@ -323,10 +322,10 @@
 				A85421AE2DEEEA66005D5BA5 /* View */,
 				A854219E2DEEE108005D5BA5 /* Base */,
 				A854218F2DEED07E005D5BA5 /* Ex */,
-				A8990E6E2DE441AC00DD55FE /* TSNetWork */,
 				A8990E602DE4187700DD55FE /*  Notification+Ex.swift */,
 				A85421D52DEFED1D005D5BA5 /* AINetworkManager.swift */,
-				A8990E732DE4424A00DD55FE /* CpuMapManager.swift */,
+				A85421D92DEFF0EE005D5BA5 /* AIEndpoint.swift */,
+				A85421D72DEFEFE0005D5BA5 /* AIResponseStatusCode.swift */,
 				A8990E4F2DE4159E00DD55FE /* Common.swift */,
 				A85421B32DEEED88005D5BA5 /* WindowHelper.swift */,
 				A85421B52DEEEE7B005D5BA5 /* TSRandomTextTool.swift */,
@@ -363,16 +362,6 @@
 			path = ASBusinessWebVC;
 			sourceTree = "<group>";
 		};
-		A8990E6E2DE441AC00DD55FE /* TSNetWork */ = {
-			isa = PBXGroup;
-			children = (
-				A8990E6A2DE441AC00DD55FE /* TSNetWork+Error.swift */,
-				A8990E6B2DE441AC00DD55FE /* TSNetworkManager.swift */,
-				A8990E6C2DE441AC00DD55FE /* TSNetWork+Business.swift */,
-			);
-			path = TSNetWork;
-			sourceTree = "<group>";
-		};
 		A8990E772DE4437A00DD55FE /* ASCommonView */ = {
 			isa = PBXGroup;
 			children = (
@@ -637,6 +626,8 @@
 				A8990E9E2DE46E4200DD55FE /* ASRealmManager.swift in Sources */,
 				A8990E972DE46D9300DD55FE /* ASAIGeneratorVC+Load.swift in Sources */,
 				A85421D42DEFEB38005D5BA5 /* AIClickButton.swift in Sources */,
+				A85421D82DEFEFE3005D5BA5 /* AIResponseStatusCode.swift in Sources */,
+				A85421DC2DF01450005D5BA5 /* UIDevice+Ex.swift in Sources */,
 				A85421CE2DEFE828005D5BA5 /* AIBaseView.swift in Sources */,
 				A85421B02DEEEA79005D5BA5 /* TSUIExpandedTouchButton.swift in Sources */,
 				A8990E542DE4166E00DD55FE /* ASWallpaperVC.swift in Sources */,
@@ -671,12 +662,12 @@
 				A85421912DEED1D8005D5BA5 /* UILabel+Ex.swift in Sources */,
 				A8990E902DE46BF400DD55FE /* ASGeneratorLoadingView.swift in Sources */,
 				A8990EA72DE4726500DD55FE /* ASBaseOperation.swift in Sources */,
-				A8990E742DE4424A00DD55FE /* CpuMapManager.swift in Sources */,
 				A8990EB52DE55F1D00DD55FE /* ASAICalendarHistoryCell.swift in Sources */,
 				A8990E5A2DE4168700DD55FE /* ASAICalendarVC.swift in Sources */,
 				A8990EAE2DE47C2200DD55FE /* ASGenerateTTPOperation.swift in Sources */,
 				A85421952DEED28A005D5BA5 /* UIView+Ex.swift in Sources */,
 				A8990E8E2DE46BEA00DD55FE /* ASGeneratorView.swift in Sources */,
+				A85421DA2DEFF0EF005D5BA5 /* AIEndpoint.swift in Sources */,
 				A8990E8B2DE463CE00DD55FE /* ASAppBtnView.swift in Sources */,
 				A85421D22DEFE968005D5BA5 /* AIBaseModel.swift in Sources */,
 				A85421C22DEEF881005D5BA5 /* AIKFTool.swift in Sources */,
@@ -693,10 +684,7 @@
 				A85421BE2DEEF487005D5BA5 /* PhotoManager.swift in Sources */,
 				A854219D2DEEE0E1005D5BA5 /* UIColor+Ex.swift in Sources */,
 				A85421932DEED268005D5BA5 /* UIButton+Ex.swift in Sources */,
-				A8990E702DE441AC00DD55FE /* TSNetWork+Business.swift in Sources */,
 				A8990EBA2DE592B500DD55FE /* ASPageNullView.swift in Sources */,
-				A8990E712DE441AC00DD55FE /* TSNetworkManager.swift in Sources */,
-				A8990E722DE441AC00DD55FE /* TSNetWork+Error.swift in Sources */,
 				A8990E792DE4438000DD55FE /* ASCommonView.swift in Sources */,
 				A8990E862DE4531A00DD55FE /* ASGenerateStyleModel.swift in Sources */,
 				A8990E762DE4431800DD55FE /* ASAICalendarVC+View.swift in Sources */,

+ 0 - 9
AICalendarWallpaper/AppDelegate.swift

@@ -69,15 +69,6 @@ extension AppDelegate {
             backgroundTaskIdentifier = .invalid
         }
     }
-
-    func applicationWillEnterForeground(_ application: UIApplication) {
-
-    }
-    
-    func applicationWillTerminate(_ application: UIApplication) {
-        // 当应用即将被终止时,这里也可以添加数据保存逻辑,但系统留给的时间很有限
-    }
-
 }
 
 

+ 5 - 3
AICalendarWallpaper/Business/AICalendar/ASAICalendarHistoryVC/ASAICalendarHistoryCell.swift

@@ -75,10 +75,12 @@ class ASAICalendarHistoryCell: AIBaseCollectionCell  {
         
         let itemW = (kScreenW-43.0)/2.0
         let itemSize = CGSize(width: itemW, height: ScreenMetrics.scaledHeight(designSize: CGSizeMake(166, 314), referenceWidth: itemW))
-        contentView.snp.makeConstraints { make in
-            make.size.equalTo(itemSize)
+        contentView.snp.remakeConstraints { make in
+            make.width.equalTo(Int(itemSize.width))
+            make.height.equalTo(Int(itemSize.height))
+            make.edges.equalToSuperview()
         }
-        
+ 
         contentView.addSubview(showImageView)
         showImageView.snp.makeConstraints { make in
             make.edges.equalToSuperview()

+ 2 - 2
AICalendarWallpaper/Business/ASAIGeneratorVC/ASGeneratorView/ASGeneratorView.swift

@@ -157,9 +157,9 @@ extension ASGeneratorView{
     }
     
     func updateShowError(text:String,code:Int){
-        self.style = TSNetWorkCode.getGeneratorStyle(code: code)
+        self.style = AIResponseStatusCode.viewConfigurationForStatus(code)
         isHidden = false
-        showError(text: text.isEmpty ? kGenerateFailed : text)
+        showError(text: text.isEmpty ? AIErrorDefaultMessage : text)
         isRotating = false
         setBackgroundGenerateBtnHidden(true)
     }

+ 8 - 72
AICalendarWallpaper/Business/Data/ASActionInfoModel.swift

@@ -11,8 +11,6 @@ class ASActionInfoModel: AIBaseModel {
     enum ModelType:Int {
         case normal = 0
         case example = 1
-        case ttr = 2    //文生铃声
-        case rtr = 3    //铃声生铃声
     }
     
     enum ActionStatus:String ,Equatable {
@@ -36,9 +34,7 @@ class ASActionInfoModel: AIBaseModel {
     var costTime:Int = 0
     var percent:Float = 0.0
     var actionStatus:ActionStatus = .failed
-    
 
-    var ringSavePath:String = ""
     
     var uuid:String = UUID().uuidString
     override func mapping(map: ObjectMapper.Map) {
@@ -46,57 +42,17 @@ class ASActionInfoModel: AIBaseModel {
         id           <- map["id"]
         actionType   <- map["actionType"]
         comments     <- map["comments"]
-        request      <- (map["request"],JsonStringTransform<ASActionRequestModel>())
-        response           <- (map["response"],JsonStringTransform<ASActionResponseModel>())
+        request      <- (map["request"],AIJsonStringTransform<ASActionRequestModel>())
+        response           <- (map["response"],AIJsonStringTransform<ASActionResponseModel>())
         createdTimestamp   <- map["createdTimestamp"]
         status     <- map["status"]
         costTime      <- map["costTime"]
         percent     <- map["percent"]
         actionStatus      <- map["actionStatus"]
         actionStatus = ActionStatus.from(status)
-        
-        ringSavePath      <- map["ringSavePath"]
-        
+    
         uuid      <- map["uuid"]
     }
-}
-
-extension ASActionInfoModel {
-
-//    var isExpired:Bool{
-//        if request.uploadUrl.count == 0 {
-//            return true
-//        }
-//        
-//        if request.uploadTimestamp <= 0 {
-//            return true
-//        }
-//        //86400=24小时
-//        if Date.timestampInt - request.uploadTimestamp > 86400 {
-//            return true
-//        }
-//        
-//        return false
-//    }
-    
-    
-//    var localURL: URL? {
-//        if modelType == .example {
-//            if let url = Bundle.main.url(forResource: response.musicUrl, withExtension: nil) {
-//                return url
-//            }
-//        }
-//        
-//        if !ringSavePath.isEmpty {
-//            return ringSavePath.fillDocumentURL
-//        }
-//        
-//        return nil
-//    }
-    
-    
-
-    
 }
 
 class ASActionRequestModel : AIBaseModel {
@@ -106,51 +62,31 @@ class ASActionRequestModel : AIBaseModel {
 
     var prompt:String = ""
     var inputText:String = ""  //用户自己输入的内容
-    
-//    var duration:Int = 0
-//    var uploadUrl:String = ""
-//    var uploadTimestamp:Int = 0 //上传的时间戳
+
     
     override func mapping(map: ObjectMapper.Map) {
         prompt              <- map["prompt"]
         inputText          <- map["inputText"]
-        
-//        duration            <- map["duration"]
-//        uploadUrl            <- map["uploadUrl"]
-//        uploadTimestamp   <- map["uploadTimestamp"]
+
     }
 }
 
 class ASActionResponseModel : AIBaseModel {
     var code:Int = 0
     var resultUrl:String = ""
-    
-    //生成音乐用的
-//    var coverUrl:String = ""
-//    var title:String = ""
-//    var musicUrl:String = ""
-//    //自己计算的
-//    var duration:Int = 0
-//    var size:Int = 0
+
     override func mapping(map: ObjectMapper.Map) {
         code                <- map["code"]
         resultUrl           <- map["resultUrl"]
-        
-//        coverUrl           <- map["coverUrl"]
-//        title              <- map["title"]
-//        musicUrl           <- map["musicUrl"]
-//        
-//        duration           <- map["duration"]
-//        size               <- map["size"]
     }
     
     //获取生成错误 code 对应的文案
     var codeErrorMsg:String {
-        TSNetWorkCode.errorMsg(code: code)
+        AIResponseStatusCode.messageForStatusCode(code)
     }
     //敏感错误
     var sensitiveError:Bool {
-        return TSNetWorkCode.sensitiveError(code: code)
+        AIResponseStatusCode.isContentRestricted(code)
     }
 }
 

+ 1 - 34
AICalendarWallpaper/Business/Data/ASDBActionInfoModel.swift

@@ -25,9 +25,6 @@ class ASDBActionInfoModel: Object {
     @Persisted var costTime:Int = 0
     @Persisted var percent:Float = 0.0
     
-//    @Persisted var videoThumbnailPath:String = ""
-//    @Persisted var videoPath:String = ""
-    
     @Persisted var uuid:String = UUID().uuidString
     
     static func createDBModel(actionInfoModel:ASActionInfoModel) -> ASDBActionInfoModel{
@@ -108,11 +105,6 @@ class ASDBActionRequestModel : Object {
     @Persisted var prompt:String = ""
     @Persisted var inputText:String = ""  //用户自己输入的内容
     
-//    @Persisted var duration:Int = 5 //音乐秒数
-//    @Persisted var uploadUrl:String = ""
-//    @Persisted var uploadTimestamp:Int = 0
-    
-    
     static func createDBModel(requestModel:ASActionRequestModel) -> ASDBActionRequestModel{
         let dbModel = ASDBActionRequestModel()
         dbModel.saveData(requestModel: requestModel)
@@ -125,10 +117,7 @@ class ASDBActionRequestModel : Object {
 
         self.width = requestModel.width
         self.height = requestModel.height
-        
-//        self.duration = requestModel.duration
-//        self.uploadUrl = requestModel.uploadUrl
-//        self.uploadTimestamp = requestModel.uploadTimestamp
+
     }
     
     
@@ -139,11 +128,6 @@ class ASDBActionRequestModel : Object {
 
         model.width = self.width
         model.height = self.height
-        
-//        model.duration = self.duration
-//        model.uploadUrl = self.uploadUrl
-//        model.uploadTimestamp = self.uploadTimestamp
-        
         return model
     }
 
@@ -156,12 +140,6 @@ class ASDBActionResponseModel : Object {
     @Persisted var code:Int = 0
     @Persisted var resultUrl:String = ""
     
-//    //生成音乐用的
-//    @Persisted var coverUrl:String = ""
-//    @Persisted var title:String = ""
-//    @Persisted var musicUrl:String = ""
-//    @Persisted var duration:Int = 0 //音乐秒数
-//    @Persisted var size:Int = 0 //音乐大小
     
     static func createDBModel(responseModel:ASActionResponseModel) -> ASDBActionResponseModel{
         let dbModel = ASDBActionResponseModel()
@@ -170,11 +148,6 @@ class ASDBActionResponseModel : Object {
     }
     
     func saveData(responseModel:ASActionResponseModel) {
-//        self.musicUrl = responseModel.musicUrl
-//        self.coverUrl = responseModel.coverUrl
-//        self.title = responseModel.title
-//        self.duration = responseModel.duration
-//        self.size = responseModel.size
         
         self.code = responseModel.code
         self.resultUrl = responseModel.resultUrl
@@ -184,12 +157,6 @@ class ASDBActionResponseModel : Object {
     func getModel()->ASActionResponseModel{
         let model = ASActionResponseModel()
         
-//        model.coverUrl = self.coverUrl
-//        model.title = self.title
-//        model.musicUrl = self.musicUrl
-//        model.duration = self.duration
-//        model.size = self.size
-        
         model.code = self.code
         model.resultUrl = self.resultUrl
         return model

+ 0 - 4
AICalendarWallpaper/Business/Data/ASDBHistoryManager.swift

@@ -149,10 +149,6 @@ extension ASRealmManager {
         model.request.width = 330
         model.request.height = 440
         
-//        model.response.coverUrl = ""
-//        model.response.title = title
-//        model.response.musicUrl = musicName
-//        model.response.duration = duration
         model.status = "success"
         return model
     }

+ 7 - 25
AICalendarWallpaper/Business/Launch/ASLaunch.swift

@@ -23,16 +23,19 @@ class ASLaunchVC: UIViewController {
 
     override func viewDidLoad() {
         super.viewDidLoad()
-        setupLaunchScreenView()
-        addNotifiy()
         
+        guard let launchVC = UIStoryboard(name: "LaunchScreen", bundle: nil).instantiateInitialViewController() else { return }
+        guard let launchView = launchVC.view else { return }
+        launchView.frame = UIScreen.main.bounds
+        view.addSubview(launchView)
+        
+        
+        addNotifiy()
         if AppDelegate.isFirstInstallApp() {//首次安装需要等待网络权限弹窗
             startTimer()
         }else {
             self.enterApp()
         }
-        
-        addNotifiy()
     }
 
     func addNotifiy() {
@@ -100,28 +103,7 @@ class ASLaunchVC: UIViewController {
         }
     }
     
-    
 
-    private func setupLaunchScreenView() {
-        // 获取 LaunchScreen.storyboard 的视图控制器
-        let storyboard = UIStoryboard(name: "LaunchScreen", bundle: nil)
-        guard let launchVC = storyboard.instantiateInitialViewController() else {
-            debugPrint("无法加载 LaunchScreen 的初始视图控制器")
-            return
-        }
-
-        // 获取 LaunchScreen 的视图
-        guard let launchView = launchVC.view else {
-            debugPrint("无法获取 LaunchScreen 的视图")
-            return
-        }
-
-        // 设置 launchView 的 frame 为当前视图的 bounds
-        launchView.frame = UIScreen.main.bounds
-
-        // 将 launchView 添加到 ASLaunchVC 的视图中
-        view.addSubview(launchView)
-    }
 }
 
 

+ 3 - 11
AICalendarWallpaper/Business/OperationQueue/AIGenerate/ASGenerateBaseOperation.swift

@@ -52,14 +52,6 @@ class ASGenerateBaseOperation: ASBaseOperation , @unchecked Sendable{
     
     @Published var stateDatauPblished:(ASProgressState,ASActionInfoModel?) = (ASProgressState.none,nil){
         didSet{
-//            dePrint("ASBaseOperation stateDatauPblished didSet = \(stateDatauPblished)")
-//                if let block = self.stateDataPblishedChanged{
-//                    debugPrint("刷新进度block 真=\(self.stateDatauPblished)")
-//                    self.stateDataPblishedChanged?(self.stateDatauPblished.0,self.stateDatauPblished.1)
-//                }else{
-//                    debugPrint("刷新进度block 空=\(self.stateDatauPblished)")
-//                }
-            
             DispatchQueue.main.async {
                 self.stateDataPblishedChanged?(self.stateDatauPblished.0,self.stateDatauPblished.1)
             }
@@ -118,7 +110,7 @@ class ASGenerateBaseOperation: ASBaseOperation , @unchecked Sendable{
 
     func getActionInfo(action_id:Int){
         self.action_id = action_id
-        queryRequest = TSNetworkShared.get(urlType: .actionInfo,parameters: ["action_id":action_id]) { [weak self] data,error in
+        queryRequest = AINetworkManager.get(endpoint:.actionInfo,parameters: ["action_id":action_id]) { [weak self] data,error in
             guard let self = self else { return }
             
             if stopNetwork == true {
@@ -127,11 +119,11 @@ class ASGenerateBaseOperation: ASBaseOperation , @unchecked Sendable{
             
             if let error = error {
                 debugPrint("getActionInfo error error = \(error)")
-                handleFailInfoModel(errorString: error.tsDesc,code: error.tsCode)
+                handleFailInfoModel(errorString: error.localizedStatusDescription,code: error.responseStatusCode)
                 return
             }
             
-            if let result = kNetWorkResultSuccess(data: data) {
+            if let result = AIResponseCheckSuccess(data) {
                 if let genmojiModel = ASActionInfoModel(JSON: result) {
                     
                     if genmojiModel.actionStatus != .success {

+ 6 - 12
AICalendarWallpaper/Business/OperationQueue/AIGenerate/ASGenerateTTPOperation.swift

@@ -151,7 +151,7 @@ class ASGenerateTTPOperation:ASGenerateBaseOperation , @unchecked Sendable{
 //        stateDatauPblished = (.start,nil)
 //        
 //        stateDatauPblished = (.progressString(uploadingPhoto(progress: 0.0)),currentActionInfoModel)
-//        uploadRequest =TSNetworkShared.uploadImage(upLoadImage: upLoadImage, maxKb: imageMaxKb) { [weak self]  progress in
+//        uploadRequest =AINetworkManager.uploadImage(upLoadImage: upLoadImage, maxKb: imageMaxKb) { [weak self]  progress in
 //            guard let self = self else { return }
 //            if generatingProgress == 0 {
 //                stateDatauPblished = (.progressString(uploadingPhoto(progress: progress)),currentActionInfoModel)
@@ -192,10 +192,7 @@ class ASGenerateTTPOperation:ASGenerateBaseOperation , @unchecked Sendable{
         currentActionInfoModel.actionStatus = .running
         currentActionInfoModel.percent = 0
         replaceSaveInfoModel(model: currentActionInfoModel)
-        
-//        stateDatauPblished = (.progressString(generating(progress: 0.0)),currentActionInfoModel)
- 
-        
+
         let request = currentActionInfoModel.request
         var prompt = request.prompt
         let inputText = request.inputText
@@ -209,23 +206,20 @@ class ASGenerateTTPOperation:ASGenerateBaseOperation , @unchecked Sendable{
         }
         let width = 800.0
         let height = 1440.0
-        creatRequest = TSNetworkShared.post(urlType: .textCreatePhoto,parameters:
+        creatRequest = AINetworkManager.post(endpoint:.textToImage,parameters:
                                                 ["prompt":prompt,
                                                  "width":width,
                                                  "height":height,
-                                                 "device":getUserInfoJsonString(),
-//                                                 "imageUrl":request.imageUrl,
-//                                                 "style":request.style,
-//                                                 "advance": request.advance
+                                                 "device":AIGetUserInfoJsonString,
                                                 ]) { [weak self] data,error in
             guard let self = self else { return }
             if stopNetwork == true { return }
             
             if let error = error {
-                handleFailInfoModel(errorString: error.tsDesc,code: error.tsCode)
+                handleFailInfoModel(errorString: error.localizedStatusDescription,code: error.responseStatusCode)
                 complete(false)
             }else{
-                if let dataDict = kNetWorkCodeSuccess(data: data),
+                if let dataDict = AIResponseCheckSuccess(data),
                    let actionId = dataDict["actionId"] as? Int{
                     if stopNetwork == false {
                         complete(true)

+ 1 - 1
AICalendarWallpaper/Business/OperationQueue/ASProgressState.swift

@@ -60,6 +60,6 @@ enum ASProgressState  {
     }
     
     static var generalNormalFailed:ASProgressState {
-        return .failed(TSNetWorkCode.fail.errorMsg, TSNetWorkCode.fail.rawValue)
+        return .failed(AIResponseStatusCode.failure.localizedErrorMessage, AIResponseStatusCode.failure.rawValue)
     }
 }

+ 91 - 0
AICalendarWallpaper/Common/AIEndpoint.swift

@@ -0,0 +1,91 @@
+//
+//  AIEndpoint.swift
+//  AICalendarWallpaper
+//
+//  Created by 100Years on 2025/6/3.
+//
+
+//import Alamofire
+import ObjectMapper
+// MARK: - Supporting Types
+enum AIEndpoint: String {
+    case textToImage = "/api/image/create"
+    case actionInfo = "/api/action/info"
+    
+    var urlString: String {
+        return AINetworkService.AIConfig.baseURL + self.rawValue
+    }
+}
+
+func AIResponseCheckSuccess(_ responseData: Any?) -> [String: Any]? {
+    guard let unwrappedData = responseData else { return nil }
+    
+    if let responseDict = unwrappedData as? [String: Any],
+       let statusCode = responseDict["code"] as? Int,
+       statusCode == 200 {
+        return responseDict
+    }
+    return nil
+}
+
+func AIExtractResultPayload(_ responseData: Any?) -> [String: Any]? {
+    guard let validResponse = AIResponseCheckSuccess(responseData),
+          let resultPayload = validResponse["result"] as? [String: Any] else {
+        return nil
+    }
+    return resultPayload
+}
+
+func AIGetResponseMessage(_ responseData: Any?) -> String? {
+    guard let dataContainer = responseData,
+          let messageContainer = dataContainer as? [String: Any],
+          let responseMessage = messageContainer["message"] as? String else {
+        return nil
+    }
+    return responseMessage
+}
+
+class AIJsonStringTransform<T:Mappable>: TransformType {
+    typealias Object = T
+    typealias JSON = [String: Any]
+
+    func transformFromJSON(_ value: Any?) -> T? {
+        if let jsonString = value as? String {
+            let obj = T(JSONString: jsonString)
+            return obj
+        }
+        if let dict = value as? [String: Any] {
+            let obj = T(JSON: dict)
+            return obj
+        }
+        return nil
+    }
+
+    func transformToJSON(_ value: T?) -> [String : Any]? {
+        return value?.toJSON() as? [String: Any]
+    }
+}
+
+var AIGetUserInfoJsonString:[String:Any] {
+    let uuid: String
+    let uuidUdKey = "deviceUUID"
+    if let saved = UserDefaults.standard.string(forKey: uuidUdKey),
+       !saved.isEmpty {
+        uuid = saved
+    } else {
+        let newUuid = UUID().uuidString
+        UserDefaults.standard.set(newUuid, forKey: uuidUdKey)
+        UserDefaults.standard.synchronize()
+        uuid = newUuid
+    }
+
+    let dic:[String:Any] = [
+        "device":UIDevice.current.modelName,
+        "deviceId":uuid,
+        "iosVersion":UIDevice.current.systemVersion,
+        "appVersion":appShortVersion(),
+//        "subscriptionStatus":kPurchaseDefault.isVip ? "active" : "fallow",
+    ]
+
+    return dic
+}

+ 20 - 18
AICalendarWallpaper/Common/AINetworkManager.swift

@@ -97,27 +97,39 @@ extension AINetworkService {
     func get(
         endpoint: AIEndpoint,
         parameters: [String: Any]? = nil,
-        completion: @escaping (Result<Any, AIError>) -> Void
+        completion: @escaping (Any?, Error?) -> Void
     ) -> DataRequest {
         return executeRequest(
             method: .get,
             endpoint: endpoint.urlString,
-            parameters: parameters,
-            completion: completion
-        )
+            parameters: parameters)
+            { result in
+                switch result {
+                case .success(let data):
+                    completion(data,nil)
+                case .failure(let error):
+                    completion(nil,error)
+                }
+            }
     }
     
     func post(
         endpoint: AIEndpoint,
         parameters: [String: Any]? = nil,
-        completion: @escaping (Result<Any, AIError>) -> Void
+        completion: @escaping (Any?, Error?) -> Void
     ) -> DataRequest {
         return executeRequest(
             method: .post,
             endpoint: endpoint.urlString,
-            parameters: parameters,
-            completion: completion
-        )
+            parameters: parameters)
+            { result in
+                switch result {
+                case .success(let data):
+                    completion(data,nil)
+                case .failure(let error):
+                    completion(nil,error)
+                }
+            }
     }
     
     // MARK: - Upload
@@ -193,16 +205,6 @@ extension AINetworkService {
     }
 }
 
-// MARK: - Supporting Types
-enum AIEndpoint: String {
-    case textToImage = "/api/image/create"
-    case actionInfo = "/api/action/info"
-    
-    var urlString: String {
-        return AINetworkService.AIConfig.baseURL + self.rawValue
-    }
-}
-
 struct AIFileData {
     let data: Data
     let fieldName: String

+ 94 - 0
AICalendarWallpaper/Common/AIResponseStatusCode.swift

@@ -0,0 +1,94 @@
+//
+//  Untitled.swift
+//  AICalendarWallpaper
+//
+//  Created by 100Years on 2025/6/3.
+//
+
+import Alamofire
+
+let AIErrorDefaultMessage = "Sorry there was a slight problem with the image processing, please try again later.".localized
+
+enum AIResponseStatusCode: Int {
+    case operationSuccess = 200
+    case failure = 0
+    case contentPolicyViolationText = -10003
+    case contentPolicyViolationImage = -10004
+    case connectivityIssue = -1005
+    
+    var localizedErrorMessage: String {
+        switch self {
+        case .contentPolicyViolationText, .contentPolicyViolationImage:
+            return "Your ringtone or text may contain copyright infringement, nudity, gore or violence that does not comply with the Health Policy, please replace the photo and try again.".localized
+        case .connectivityIssue:
+            return "No network, please check your network and try again.".localized
+        default:
+            return "Sorry there was a slight problem with the ringtone processing, please try again later.".localized
+        }
+    }
+    
+    static func messageForStatusCode(_ statusCode: Int) -> String {
+        return AIResponseStatusCode(rawValue: statusCode)?.localizedErrorMessage ?? AIResponseStatusCode.failure.localizedErrorMessage
+    }
+    
+    static func isContentRestricted(_ statusCode: Int) -> Bool {
+        guard let status = AIResponseStatusCode(rawValue: statusCode) else { return false }
+        return status == .contentPolicyViolationText || status == .contentPolicyViolationImage
+    }
+    
+    static func isNetworkRelated(_ statusCode: Int) -> Bool {
+        return AIResponseStatusCode(rawValue: statusCode) == .connectivityIssue
+    }
+    
+    static func statusCodeFromError(_ error: Error) -> Int {
+        if let urlError = error as? URLError {
+            switch urlError.code {
+            case .notConnectedToInternet, .networkConnectionLost:
+                return AIResponseStatusCode.connectivityIssue.rawValue
+            default:
+                return urlError.code.rawValue
+            }
+        }
+        return AIResponseStatusCode.failure.rawValue
+    }
+    
+    static func viewConfigurationForStatus(_ statusCode: Int) -> ASGeneratorView.Style {
+        guard let status = AIResponseStatusCode(rawValue: statusCode) else {
+            return .generalError
+        }
+        
+        switch status {
+        case .contentPolicyViolationText, .contentPolicyViolationImage:
+            return .sensitiveError
+        case .connectivityIssue:
+            return .netWorkError
+        default:
+            return .generalError
+        }
+    }
+}
+
+extension Error {
+    var responseStatusCode: Int {
+        if let afError = self as? AFError, let underlyingError = afError.underlyingError as? URLError {
+            switch underlyingError.code {
+            case .notConnectedToInternet, .networkConnectionLost, .timedOut:
+                return AIResponseStatusCode.connectivityIssue.rawValue
+            default:
+                return underlyingError.code.rawValue
+            }
+        } else if let urlError = self as? URLError {
+            switch urlError.code {
+            case .notConnectedToInternet, .networkConnectionLost, .timedOut:
+                return AIResponseStatusCode.connectivityIssue.rawValue
+            default:
+                return urlError.code.rawValue
+            }
+        }
+        return AIResponseStatusCode.failure.rawValue
+    }
+    
+    var localizedStatusDescription: String {
+        return AIResponseStatusCode.messageForStatusCode(self.responseStatusCode)
+    }
+}

+ 13 - 0
AICalendarWallpaper/Common/Base/AIBaseCollectionCell.swift

@@ -6,6 +6,13 @@
 //
 
 open class AIBaseCollectionCell: UICollectionViewCell  {
+    /// 内容容器视图
+//     public private(set) lazy var ctView: UIView = {
+//         let view = UIView()
+//         view.backgroundColor = .clear
+//         view.translatesAutoresizingMaskIntoConstraints = false
+//         return view
+//     }()
     
     // MARK: - Initialization
     
@@ -21,9 +28,15 @@ open class AIBaseCollectionCell: UICollectionViewCell  {
     
     private func commonInit() {
         self.backgroundColor = .clear
+//        self.addSubview(ctView)
+//        ctView.snp.makeConstraints { make in
+//            make.top.leading.trailing.bottom.equalTo(0)
+//        }
+        
         contentView.snp.makeConstraints { make in
             make.top.leading.trailing.bottom.equalTo(0)
         }
+        
         setupViews()
         setupBindings()
     }

+ 3 - 3
AICalendarWallpaper/Common/Base/AIBaseModel.swift

@@ -76,7 +76,7 @@ open class AIBaseModel: NSObject, Mappable, NSCopying {
     
     // MARK: - Debug
     
-    deinit {
-        debugPrint("♻️ \(type(of: self)) 已释放 ♻️")
-    }
+//    deinit {
+//        debugPrint("♻️ \(type(of: self)) 已释放 ♻️")
+//    }
 }

+ 0 - 394
AICalendarWallpaper/Common/CpuMapManager.swift

@@ -1,394 +0,0 @@
-//
-//  CpuMapManager.swift
-//  ClockWidget
-//
-//  Created by fff on 2023/7/28.
-//
-
-import UIKit
-
-class CpuMapManager: NSObject {
-    static let shared = CpuMapManager()
-    
-    /// 数据来源 https://kylebing.cn/tools/iphone/
-    ///         http://kylebing.cn/tools/iphone/
-    ///
-    private let deviceMap: [String: [String: String]] = [
-        
-        "iPhone 16 Pro Max" : ["CPU":"A18 Pro",
-                               "Freq": "4.04GHz",
-                               "Battery": "4685 mah"],
-        "iPhone 16 Pro"     : ["CPU":"A18 Pro",
-                               "Freq": "4.04GHz",
-                               "Battery": "3582 mah"],
-        "iPhone 16 Plus"    : ["CPU":"A18",
-                               "Freq": "3.78GHz",
-                               "Battery": "4674 mah"],
-        "iPhone 16"         : ["CPU":"A18",
-                               "Freq": "3.78GHz",
-                               "Battery": "3561 mah"],
-        
-        "iPhone 15 Pro Max" : ["CPU":"A17 Pro",
-                               "Freq": "3.77GHz",
-                               "Battery": "4422 mah"],
-        "iPhone 15 Pro"     : ["CPU":"A17 Pro",
-                               "Freq": "3.77GHz",
-                               "Battery": "3274 mah"],
-        "iPhone 15 Plus"    : ["CPU":"A16",
-                               "Freq": "3.46GHz",
-                               "Battery": "4383 mah"],
-        "iPhone 15"         : ["CPU":"A16",
-                               "Freq": "3.46GHz",
-                               "Battery": "3349 mah"],
-        
-        "iPhone 14 Pro Max" : ["CPU":"A16",
-                               "Freq": "3.46GHz",
-                               "Battery": "4323 mah"],
-        "iPhone 14 Pro"     : ["CPU":"A16",
-                               "Freq": "3.46GHz",
-                               "Battery": "3200 mah"],
-        "iPhone 14 Plus"    : ["CPU":"A15",
-                               "Freq": "3.20GHz",
-                               "Battery": "4325 mah"],
-        "iPhone 14"         : ["CPU":"A15",
-                               "Freq": "3.20GHz",
-                               "Battery": "3279 mah"],
-        
-        "iPhone SE3"        : ["CPU":"A15",
-                               "Freq": "3.20GHz",
-                               "Battery": "2018 mah"],
-        "iPhone 13 Pro Max" : ["CPU":"A15",
-                               "Freq": "3.20GHz",
-                               "Battery": "4352 mah"],
-        "iPhone 13 Pro"     : ["CPU":"A15",
-                               "Freq": "3.20GHz",
-                               "Battery": "3095 mah"],
-        "iPhone 13"         : ["CPU":"A15",
-                               "Freq": "3.20GHz",
-                               "Battery": "3227 mah"],
-        "iPhone 13 Mini"    : ["CPU":"A15",
-                               "Freq": "3.20GHz",
-                               "Battery": "2406 mah"],
-        
-        "iPhone 12 Pro Max" : ["CPU":"A14",
-                               "Freq": "3.00GHz",
-                               "Battery": "3687 mah"],
-        "iPhone 12 Pro"     : ["CPU":"A14",
-                               "Freq": "3.00GHz",
-                               "Battery": "2815 mah"],
-        "iPhone 12"         : ["CPU":"A14",
-                               "Freq": "3.00GHz",
-                               "Battery": "2851 mah"],
-        "iPhone 12 Mini"    : ["CPU":"A14",
-                               "Freq": "3.00GHz",
-                               "Battery": "2227 mah"],
-        
-        "iPhone SE2"        : ["CPU":"A13",
-                               "Freq": "2.0GHz",
-                               "Battery": "1821 mah"],
-        
-        "iPhone 11 Pro Max" : ["CPU":"A13",
-                               "Freq": "2.0GHz",
-                               "Battery": "3969 mah"],
-        "iPhone 11 Pro"     : ["CPU":"A13",
-                               "Freq": "2.0GHz",
-                               "Battery": "3046 mah"],
-        "iPhone 11"         : ["CPU":"A13",
-                               "Freq": "2.0GHz",
-                               "Battery": "3110 mah"],
-        
-        "iPhone XR"         : ["CPU":"A13",
-                               "Freq": "2.0GHz",
-                               "Battery": "2942 mah"],
-        "iPhone XS Max"     : ["CPU":"A12",
-                               "Freq": "2.49GHz",
-                               "Battery": "3174 mah"],
-        "iPhone XS"         : ["CPU":"A12",
-                               "Freq": "2.49GHz",
-                               "Battery": "2658 mah"],
-        "iPhone X"          : ["CPU":"A11",
-                               "Freq": "1.4GHz",
-                               "Battery": "2716 mah"],
-        
-        "iPhone 8 Plus"     : ["CPU":"A11",
-                               "Freq": "1.4GHz",
-                               "Battery": "2691 mah"],
-        "iPhone 8"          : ["CPU":"A11",
-                               "Freq": "1.4GHz",
-                               "Battery": "1821 mah"],
-        "iPhone 7 Plus"     : ["CPU":"A11",
-                               "Freq": "1.4GHz",
-                               "Battery": "2900 mah"],
-        "iPhone 7"          : ["CPU":"A10",
-                               "Freq": "1.3GHz",
-                               "Battery": "1960 mah"],
-        "iPhone SE"         : ["CPU":"A9",
-                               "Freq": "1.85GHz",
-                               "Battery": "1624 mah"],
-        "iPhone 6s Plus"    : ["CPU":"A9",
-                               "Freq": "1.85GHz",
-                               "Battery": "2750 mah"],
-        "iPhone 6s"         : ["CPU":"A9",
-                               "Freq": "1.85GHz",
-                               "Battery": "1715 mah"],
-    ]
-    
-    private(set) var modelName: String
-    private(set) var cpuName: String?
-    /// CPU频率
-    private(set) var cpuFreq: String?
-    private(set) var batteryCapacity: String?
-    
-    override init() {
-        
-        modelName = UIDevice.current.modelName
-        cpuName = deviceMap[modelName]?["CPU"]
-        cpuFreq = deviceMap[modelName]? ["Freq"]
-        batteryCapacity = deviceMap[modelName]?["Battery"]
-        
-        super.init()
-    }
-}
-
-extension UIDevice {
-    
-    var modelIdentifier: String {
-        var systemInfo = utsname()
-        uname(&systemInfo)
-        
-        let machineMirror = Mirror(reflecting: systemInfo.machine)
-        let identifier = machineMirror.children.reduce("") { (identifier, element) in
-            guard let value = element.value as? Int8, value != 0 else {
-                return identifier
-            }
-            return identifier + String(UnicodeScalar(UInt8(value)))
-        }
-        
-        return identifier
-    }
-    
-    /// 数据来源 https://www.jianshu.com/p/d9068fee295e
-    var modelName: String {
-        
-        let identifier = modelIdentifier
-        
-        switch identifier {
-        case "iPhone8,1":
-            return "iPhone 6s"
-        case "iPhone8,2":
-            return "iPhone 6s Plus"
-        case "iPhone8,4":
-            return "iPhone SE"
-        case "iPhone9,1":
-            return "iPhone 7"; //国行、日版、港行
-        case "iPhone9,2":
-            return "iPhone 7 Plus"; //国行、港行
-        case "iPhone9,3":
-            return "iPhone 7"; //美版、台版
-        case "iPhone9,4":
-            return "iPhone 7 Plus"; //美版、台版
-        case "iPhone10,1":
-            return "iPhone 8"; //国行(A1863)、日行(A1906)
-        case "iPhone10,2":
-            return "iPhone 8 Plus"; //国行(A1864)、日行(A1898)
-        case "iPhone10,3":
-            return "iPhone X"; //国行(A1865)、日行(A1902)
-        case "iPhone10,4":
-            return "iPhone 8"; //美版(Global/A1905)
-        case "iPhone10,5":
-            return "iPhone 8 Plus"; //美版(Global/A1897)
-        case "iPhone10,6":
-            return "iPhone X";//美版(Global/A1901)
-            
-        // 刘海屏(除SE外)
-        case "iPhone11,8":
-            return "iPhone XR"
-        case "iPhone11,2":
-            return "iPhone XS"
-        case "iPhone11,6":
-            return "iPhone XS Max"
-        case "iPhone11,4":
-            return "iPhone XS Max"
-        case "iPhone12,1":
-            return "iPhone 11"
-        case "iPhone12,3":
-            return "iPhone 11 Pro"
-        case "iPhone12,5":
-            return "iPhone 11 Pro Max"
-        case "iPhone12,8":
-            return "iPhone SE2"; //(2nd generation)
-        case "iPhone13,1":
-            return "iPhone 12 mini"
-        case "iPhone13,2":
-            return "iPhone 12"
-        case "iPhone13,3":
-            return "iPhone 12 Pro"
-        case "iPhone13,4":
-            return "iPhone 12 Pro Max"
-        case "iPhone14,2":
-            return "iPhone 13 Pro"
-        case "iPhone14,3":
-            return "iPhone 13 Pro Max"
-        case "iPhone14,4":
-            return "iPhone 13 mini"
-        case "iPhone14,5":
-            return "iPhone 13"
-        case "iPhone14,6":
-            return "iPhone SE3"; //(2nd generation)
-        case "iPhone14,7":
-            return "iPhone 14"
-        case "iPhone14,8":
-            return "iPhone 14 Plus"
-            
-        // 灵动岛
-        case "iPhone15,2":
-            return "iPhone 14 Pro"
-        case "iPhone15,3":
-            return "iPhone 14 Pro Max"
-            
-        case "iPhone16,2":
-            return "iPhone 15 Pro Max"
-        case "iPhone16,1":
-            return "iPhone 15 Pro"
-        case "iPhone15,5":
-            return "iPhone 15 Plus"
-        case "iPhone15,4":
-            return "iPhone 15"
-
-            
-        case "iPhone17,3":
-            return "iPhone 16"
-        case "iPhone17,4":
-            return "iPhone 16 Plus"
-        case "iPhone17,1":
-            return "iPhone 16 Pro"
-        case "iPhone17,2":
-            return "iPhone 16 Pro Max"
-            
-            
-            
-        default:
-            return "--"
-        }
-    }
-    
-    var currentSysVersion: Int {
-        let version = UIDevice.current.systemVersion
-        let v1 = version.components(separatedBy: ".").first ?? "0"
-        let doubleVersion = Double(v1)
-        if let doubleVersion = doubleVersion {
-            return Int(doubleVersion)
-        }
-        return 0
-    }
-    
-    // 版本判断
-    func currentSysVersionEqualOrGreater(than version: String) -> Bool {
-        var sysValues = UIDevice.current.systemVersion.components(separatedBy: ".")
-        var values = version.components(separatedBy: ".")
-        
-        // 位数不同,少的补0
-        let count = max(sysValues.count, values.count)
-        if sysValues.count < count {
-            let more = Array(repeating: "0", count: count-sysValues.count)
-            sysValues.append(contentsOf: more)
-        }
-        if values.count < count {
-            let more = Array(repeating: "0", count: count-values.count)
-            values.append(contentsOf: more)
-        }
-        
-        for idx in 0..<count {
-            if let sv = Int(sysValues.safeAny(At: idx) ?? "0"),
-                let v = Int(values.safeAny(At: idx) ?? "0") {
-                if sv > v {
-                    return true
-                } else if sv < v {
-                    return false
-                }
-            }
-        }
-        return true
-    }
-    
-    var iPhoneXids: [String] {
-        return ["iPhone10,3", "iPhone10,6"]
-    }
-    
-    var iPhoneSEids: [String] {
-        return ["iPhone8,4", "iPhone12,8", "iPhone14,6"]
-    }
-}
-
-// 传感器样式: 无 | 刘海 | 灵动岛
-enum DeviceSensorStyle {
-    case none
-    case bang
-    case island
-}
-
-extension UIDevice {
-    func sensorStyle() -> DeviceSensorStyle {
-#if targetEnvironment(simulator)
-        return .island
-#endif
-        let identifier = UIDevice.current.modelIdentifier
-        // SE
-        if iPhoneSEids.contains(identifier) {
-            return .none
-        }
-        // X
-        if iPhoneXids.contains(identifier) {
-            return .bang
-        }
-        if identifier.hasPrefix("iPhone") {
-            let digital = identifier.replacingOccurrences(of: "iPhone", with: "")
-            let arr = digital.components(separatedBy: ",")
-            if let v1 = arr.safeAny(At: 0),
-               let vv1 = Double(v1) {
-                if vv1 >= 15 {
-                    return .island
-                } else {
-                    if vv1 < 11 {
-                        return .none
-                    }
-                    return .bang
-                }
-            }
-        }
-        return .none
-    }
-    
-    // 刘海屏 及以后设备才可以升级到16.1
-    var supportLiveActivity: Bool {
-        guard #available(iOS 16.1, *) else {
-            return false
-        }
-        let style = sensorStyle()
-        return style != .none
-    }
-    
-    var sensorSize: CGSize {
-        let style = sensorStyle()
-        switch style {
-        case .none:
-            return .zero
-        case .bang:
-            let ratio: CGFloat = UIScreen.main.bounds.width/375.0
-            return CGSize(width: 219*ratio, height: 30*ratio)
-        case .island:
-            return CGSize(width: 125, height: 36.7)//16s 和 16sp 是 126*37.3
-        }
-    }
-    
-    var sensorTop:Double{
-        let kScreenWidth = UIScreen.main.bounds.size.width
-        let kScreenHeight = UIScreen.main.bounds.size.height
-        //16s和 16sp
-        if (kScreenWidth == 440 && kScreenHeight == 956) || (kScreenWidth == 402 && kScreenHeight == 874) ||  modelName.contains("iPhone 16 Pro") {
-            return 14.0
-        } else {
-            return 11.3
-        }
-    }
-}

+ 178 - 0
AICalendarWallpaper/Common/Ex/UIDevice+Ex.swift

@@ -0,0 +1,178 @@
+//
+//  UIDevice+Ex.swift
+//  AICalendarWallpaper
+//
+//  Created by 100Years on 2025/6/3.
+//
+
+import UIKit
+
+extension UIDevice {
+    
+    var modelIdentifier: String {
+        var systemInfo = utsname()
+        uname(&systemInfo)
+        
+        let machineMirror = Mirror(reflecting: systemInfo.machine)
+        let identifier = machineMirror.children.reduce("") { (identifier, element) in
+            guard let value = element.value as? Int8, value != 0 else {
+                return identifier
+            }
+            return identifier + String(UnicodeScalar(UInt8(value)))
+        }
+        
+        return identifier
+    }
+    
+    /// 数据来源 https://www.jianshu.com/p/d9068fee295e
+    var modelName: String {
+        
+        let identifier = modelIdentifier
+        
+        switch identifier {
+        case "iPhone8,1":
+            return "iPhone 6s"
+        case "iPhone8,2":
+            return "iPhone 6s Plus"
+        case "iPhone8,4":
+            return "iPhone SE"
+        case "iPhone9,1":
+            return "iPhone 7"; //国行、日版、港行
+        case "iPhone9,2":
+            return "iPhone 7 Plus"; //国行、港行
+        case "iPhone9,3":
+            return "iPhone 7"; //美版、台版
+        case "iPhone9,4":
+            return "iPhone 7 Plus"; //美版、台版
+        case "iPhone10,1":
+            return "iPhone 8"; //国行(A1863)、日行(A1906)
+        case "iPhone10,2":
+            return "iPhone 8 Plus"; //国行(A1864)、日行(A1898)
+        case "iPhone10,3":
+            return "iPhone X"; //国行(A1865)、日行(A1902)
+        case "iPhone10,4":
+            return "iPhone 8"; //美版(Global/A1905)
+        case "iPhone10,5":
+            return "iPhone 8 Plus"; //美版(Global/A1897)
+        case "iPhone10,6":
+            return "iPhone X";//美版(Global/A1901)
+            
+        // 刘海屏(除SE外)
+        case "iPhone11,8":
+            return "iPhone XR"
+        case "iPhone11,2":
+            return "iPhone XS"
+        case "iPhone11,6":
+            return "iPhone XS Max"
+        case "iPhone11,4":
+            return "iPhone XS Max"
+        case "iPhone12,1":
+            return "iPhone 11"
+        case "iPhone12,3":
+            return "iPhone 11 Pro"
+        case "iPhone12,5":
+            return "iPhone 11 Pro Max"
+        case "iPhone12,8":
+            return "iPhone SE2"; //(2nd generation)
+        case "iPhone13,1":
+            return "iPhone 12 mini"
+        case "iPhone13,2":
+            return "iPhone 12"
+        case "iPhone13,3":
+            return "iPhone 12 Pro"
+        case "iPhone13,4":
+            return "iPhone 12 Pro Max"
+        case "iPhone14,2":
+            return "iPhone 13 Pro"
+        case "iPhone14,3":
+            return "iPhone 13 Pro Max"
+        case "iPhone14,4":
+            return "iPhone 13 mini"
+        case "iPhone14,5":
+            return "iPhone 13"
+        case "iPhone14,6":
+            return "iPhone SE3"; //(2nd generation)
+        case "iPhone14,7":
+            return "iPhone 14"
+        case "iPhone14,8":
+            return "iPhone 14 Plus"
+            
+        // 灵动岛
+        case "iPhone15,2":
+            return "iPhone 14 Pro"
+        case "iPhone15,3":
+            return "iPhone 14 Pro Max"
+            
+        case "iPhone16,2":
+            return "iPhone 15 Pro Max"
+        case "iPhone16,1":
+            return "iPhone 15 Pro"
+        case "iPhone15,5":
+            return "iPhone 15 Plus"
+        case "iPhone15,4":
+            return "iPhone 15"
+
+            
+        case "iPhone17,3":
+            return "iPhone 16"
+        case "iPhone17,4":
+            return "iPhone 16 Plus"
+        case "iPhone17,1":
+            return "iPhone 16 Pro"
+        case "iPhone17,2":
+            return "iPhone 16 Pro Max"
+            
+            
+            
+        default:
+            return "--"
+        }
+    }
+    
+    var currentSysVersion: Int {
+        let version = UIDevice.current.systemVersion
+        let v1 = version.components(separatedBy: ".").first ?? "0"
+        let doubleVersion = Double(v1)
+        if let doubleVersion = doubleVersion {
+            return Int(doubleVersion)
+        }
+        return 0
+    }
+    
+    // 版本判断
+    func currentSysVersionEqualOrGreater(than version: String) -> Bool {
+        var sysValues = UIDevice.current.systemVersion.components(separatedBy: ".")
+        var values = version.components(separatedBy: ".")
+        
+        // 位数不同,少的补0
+        let count = max(sysValues.count, values.count)
+        if sysValues.count < count {
+            let more = Array(repeating: "0", count: count-sysValues.count)
+            sysValues.append(contentsOf: more)
+        }
+        if values.count < count {
+            let more = Array(repeating: "0", count: count-values.count)
+            values.append(contentsOf: more)
+        }
+        
+        for idx in 0..<count {
+            if let sv = Int(sysValues.safeAny(At: idx) ?? "0"),
+                let v = Int(values.safeAny(At: idx) ?? "0") {
+                if sv > v {
+                    return true
+                } else if sv < v {
+                    return false
+                }
+            }
+        }
+        return true
+    }
+    
+    var iPhoneXids: [String] {
+        return ["iPhone10,3", "iPhone10,6"]
+    }
+    
+    var iPhoneSEids: [String] {
+        return ["iPhone8,4", "iPhone12,8", "iPhone14,6"]
+    }
+}

+ 0 - 157
AICalendarWallpaper/Common/TSNetWork/TSNetWork+Business.swift

@@ -1,157 +0,0 @@
-//
-//  TSNetWork+Business.swift
-//  AIEmoji
-//
-//  Created by 100Years on 2025/1/16.
-//
-
-/// 基础 URL(根据需求修改)
-private let baseURL = "http://ai.100yearslater.com"
-import Alamofire
-enum TSNeURLType:String {
-    
-    case textCreatePhoto = "/api/image/create"     //文生图
-    case actionInfo = "/api/action/info"         //查询生成过程接口
-   
-    func getUrlString() -> String {
-        return baseURL + self.rawValue
-    }
-}
-
-
-func getUserInfoJsonString()->[String:Any] {
-    let uuid: String
-    let uuidUdKey = "my_UUID"
-    if let saved = UserDefaults.standard.string(forKey: uuidUdKey),
-       !saved.isEmpty {
-        uuid = saved
-    } else {
-        let newUuid = UUID().uuidString
-        UserDefaults.standard.set(newUuid, forKey: uuidUdKey)
-        UserDefaults.standard.synchronize()
-        uuid = newUuid
-    }
-    
-    let dic:[String:Any] = [
-        "device":UIDevice.current.modelName,
-        "deviceId":uuid,
-        "iosVersion":UIDevice.current.systemVersion,
-        "appVersion":appShortVersion(),
-//        "subscriptionStatus":kPurchaseDefault.isVip ? "active" : "fallow",
-    ]
-
-    return dic
-}
-
-
-func getLanguageCode()->String{
-    if Locale.current.identifier.contains("zh-Hant"){
-        return "zh-Hant"
-    }
-    if let languageCode = Locale.current.languageCode {
-//        print("当前设备语言简写: \(languageCode)") // 输出如 "en", "ja", "zh" 等
-        return languageCode
-    }
-    return "en"
-}
-
-
-extension TSNetworkManager {
-    
-    /// 通用 get 请求
-    func get(
-        urlType: TSNeURLType,
-        parameters: [String: Any]? = nil,
-        completion: @escaping (Any?, Error?) -> Void
-    ) -> Request  {
-        let urlString = urlType.getUrlString()
-        return request(method: .get, urlString: urlString, parameters:parameters) { result in
-            switch result {
-            case .success(let data):
-                completion(data,nil)
-            case .failure(let error):
-                completion(nil,error)
-            }
-        }
-    }
-
-
-    /// 通用 POST 请求
-    /// - Parameters:
-    ///   - endpoint: 接口路径
-    ///   - parameters: 请求参数
-    ///   - responseType: 响应数据模型(可选)
-    ///   - completion: 请求完成的回调
-    func post(
-        urlType: TSNeURLType,
-        parameters: [String: Any]? = nil,
-        completion: @escaping (Any?, Error?) -> Void
-    ) -> Request {
-        let urlString = urlType.getUrlString()
-        return request(method: .post, urlString: urlString, parameters:parameters) { result in
-            switch result {
-            case .success(let data):
-                completion(data,nil)
-            case .failure(let error):
-                completion(nil,error)
-            }
-        }
-    }
-
-    
-    /// 上传多个 Data 数据
-    /// - Parameters:
-    ///   - urlType: TSNeURLType
-    ///   - dataArray: Data 数组,每个元素是一个字典,包含 Data 和字段名
-    ///   - parameters: 其他参数(可选)
-    ///   - headers: 自定义请求头(可选)
-    ///   - completion: 完成回调,返回结果或错误
-    func uploadData(
-        urlType: TSNeURLType,
-        dataArray: [[String: Any]], // Data 数组,每个元素包含 Data 和字段名
-        parameters: [String: Any]? = nil,
-        progressHandler: @escaping (Float) -> Void, // 上传进度回调
-        completion: @escaping (Any?, Error?) -> Void
-    ) -> Request?{
-        let urlString = urlType.getUrlString()
-        let request = uploadData(urlString: urlString,dataArray:dataArray, parameters: parameters, progressHandler: { progress in
-            progressHandler(Float(progress.fractionCompleted))
-        }) { result in
-            switch result {
-            case .success(let data):
-                completion(data,nil)
-            case .failure(let error):
-                completion(nil,error)
-            }
-        }
-        return request
-    }
-    
-    func downloadFile(
-        urlString: String,
-        to destination: URL,
-        progressHandler: ((Double) -> Void)? = nil,
-        completion: @escaping (URL?, Error?) -> Void
-    ) -> DownloadRequest? {
-        let request = self.downloadFile(
-            urlString: urlString,
-            to: destination,
-            progressHandler: { progress in
-                print("下载进度: \(progress * 100)%")
-                progressHandler?(progress)
-            },
-            completion: { result in
-                switch result {
-                case .success(let fileURL):
-                    dePrint("下载完成,文件保存在: \(fileURL.path)")
-                    completion(fileURL,nil)
-                case .failure(let error):
-                    dePrint("下载失败: \(error.localizedDescription)")
-                    completion(nil,error)
-                }
-            }
-        )
-        return request
-    }
-
-}

+ 0 - 111
AICalendarWallpaper/Common/TSNetWork/TSNetWork+Error.swift

@@ -1,111 +0,0 @@
-//
-//  TSNetWork+Error.swift
-//  AIPlayRingtones
-//
-//  Created by 100Years on 2025/5/18.
-//
-
-
-import Alamofire
-let kGenerateFailed:String = "Sorry there was a slight problem with the image processing, please try again later.".localized
-
-enum TSNetWorkCode : Int {
-    case success = 200
-    case fail = 0   //通用错误
-    case textSensitive = -10003    //文生图敏感错误
-    case imageSensitive = -10004   //图生图敏感错误
-    case networkError = -1005   //网络错误
-    
-    
-    var errorMsg:String {
-        switch self {
-        case .textSensitive,.imageSensitive:
-            return "Your ringtone or text may contain copyright infringement, nudity, gore or violence that does not comply with the Health Policy, please replace the photo and try again.".localized
-        case .networkError:
-            return "No network, please check your network and try again.".localized
-        default:
-            return "Sorry there was a slight problem with the ringtone processing, please try again later.".localized
-        }
-        
-    }
-    
-    //获取生成错误 code 对应的文案
-    static func errorMsg(code:Int)->String{
-        let netCode = TSNetWorkCode(rawValue: code) ?? .fail
-        return netCode.errorMsg
-    }
-    //敏感错误
-    static func sensitiveError(code:Int)->Bool{
-        let netCode = TSNetWorkCode(rawValue: code)
-        switch netCode {
-        case .textSensitive,.imageSensitive:
-            return true
-        default:
-            return false
-        }
-    }
-    
-    //网络错误错误
-    static func networkError(code:Int)->Bool{
-        let netCode = TSNetWorkCode(rawValue: code)
-        switch netCode {
-        case .networkError:
-            return true
-        default:
-            return false
-        }
-    }
-    
-    //网络错误错误
-    static func getErrorCode(_ error: Error) -> Int {
-        if let urlError = error as? URLError {
-            switch urlError.code {
-            case .notConnectedToInternet, .networkConnectionLost:
-                return TSNetWorkCode.networkError.rawValue
-            default:
-                return urlError.code.rawValue
-            }
-        }
-        return 0
-    }
-    //获取生成错误 code 对应的文案
-    static func getGeneratorStyle(code:Int)->ASGeneratorView.Style{
-        let netCode = TSNetWorkCode(rawValue: code)
-        switch netCode {
-        case .textSensitive,.imageSensitive:
-            return ASGeneratorView.Style.sensitiveError
-        case .networkError:
-            return ASGeneratorView.Style.netWorkError
-        default:
-            return ASGeneratorView.Style.generalError
-        }
-    }
-}
-
-
-extension Error {
-    
-    var tsCode:Int {
-        if let error = self as? AFError, let underlyingError = error.underlyingError as? URLError {
-            switch underlyingError.code {
-            case .notConnectedToInternet, .networkConnectionLost,.timedOut:
-                return TSNetWorkCode.networkError.rawValue
-            default:
-                return underlyingError.code.rawValue
-            }
-        }else
-        if let urlError = self as? URLError {
-            switch urlError.code {
-            case .notConnectedToInternet, .networkConnectionLost,.timedOut:
-                return TSNetWorkCode.networkError.rawValue
-            default:
-                return urlError.code.rawValue
-            }
-        }
-        return 0
-    }
-    
-    var tsDesc:String {
-        return TSNetWorkCode.errorMsg(code: tsCode)
-    }
-}

+ 0 - 327
AICalendarWallpaper/Common/TSNetWork/TSNetworkManager.swift

@@ -1,327 +0,0 @@
-//
-//  NetworkManager.swift
-//  AIEmoji
-//
-//  Created by 100Years on 2025/1/16.
-//
-
-import Alamofire
-import ObjectMapper
-
-let TSNetworkShared = TSNetworkManager.shared
-
-/// 网络工具类
-class TSNetworkManager {
-    
-    static let shared = TSNetworkManager()
-    private init() {}
-    
-    /// 通用 Headers
-    private var defaultHeaders: HTTPHeaders {
-        return ["Content-Type": "application/json",
-                "accept": "application/json"
-        ]
-    }
-    
-    lazy var afSession: Session = {
-        let configuration = URLSessionConfiguration.af.default
-        configuration.timeoutIntervalForRequest = 60 // 请求超时时间(秒)
-        configuration.timeoutIntervalForResource = 60 // 资源超时时间(秒)
-        let session = Session(configuration: configuration)
-        return session
-    }()
-    lazy var encoder: JSONEncoding = {
-        return JSONEncoding(options: .withoutEscapingSlashes)// 关键:禁用斜杠转义
-    }()
-
-    func request(
-        method:HTTPMethod,
-        urlString: String,
-        parameters: [String: any Any & Sendable]? = nil,
-        completion: @escaping (Result<Any, Error>) -> Void
-    ) -> Request{
-        dePrint("✈️✈️✈️网络请求:\(urlString)")
-        dePrint("✈️✈️✈️参数:\(String(describing: parameters))")
-        
-        var encoding: ParameterEncoding = URLEncoding.default
-        if method == .post {
-            encoding = encoder
-        }
-        let request = afSession.request(urlString, method: method, parameters: parameters, encoding: encoding, headers: defaultHeaders, interceptor: nil)
-        request.responseString { response in
-                self.handleResponse(response, completion: completion)
-            }
-        return request
-    }
-}
-
-extension TSNetworkManager {
-    
-    
-    /*
-     // Data 数组
-     let dataArray: [[String: Any]] = [
-         [
-             "data": imageData,
-             "fieldName": "file1", // 字段名
-             "fileName": "App-Icon.png", // 文件名
-             "mimeType": "image/png" // MIME 类型
-         ],
-         [
-             "data": textData,
-             "fieldName": "file2", // 字段名
-             "fileName": "hello.txt", // 文件名
-             "mimeType": "text/plain" // MIME 类型
-         ]
-     ]
-     */
-    
-    /// 上传多个 Data 数据
-    /// - Parameters:
-    ///   - url: 上传地址
-    ///   - dataArray: Data 数组,每个元素是一个字典,包含 Data 和字段名
-    ///   - parameters: 其他参数(可选)
-    ///   - headers: 自定义请求头(可选)
-    ///   - completion: 完成回调,返回结果或错误
-    func uploadData(
-        urlString: String,
-        dataArray: [[String: Any]], // Data 数组,每个元素包含 Data 和字段名
-        parameters: [String: Any]? = nil, // 其他参数
-        headers: HTTPHeaders? = nil, // 自定义请求头
-        progressHandler: @escaping (Progress) -> Void, // 上传进度回调
-        completion: @escaping (Result<Any, Error>) -> Void
-    )-> Request? {
-        
-        guard let url = URL(string: urlString) else {
-            completion(.failure(NSError(domain: "url nil", code: 0)))
-            return nil
-        }
-        
-        // 1. 设置默认请求头
-        var defaultHeaders: HTTPHeaders = [
-            "accept": "application/json",
-            "Content-Type": "multipart/form-data"
-        ]
-        // 合并自定义请求头
-        if let customHeaders = headers {
-            customHeaders.forEach { defaultHeaders[$0.name] = $0.value }
-        }
-        
-        dePrint("✈️✈️✈️网络请求:\(urlString)")
-        dePrint("✈️✈️✈️dataArray:\(String(describing: dataArray))")
-        dePrint("✈️✈️✈️参数:\(String(describing: parameters))")
-        // 2. 使用 Alamofire 上传 Data
-        let request = afSession.upload(
-            multipartFormData: { multipartFormData in
-                // 添加 Data
-                for dataItem in dataArray {
-                    if let data = dataItem["data"] as? Data,
-                       let fieldName = dataItem["fieldName"] as? String,
-                       let fileName = dataItem["fileName"] as? String,
-                       let mimeType = dataItem["mimeType"] as? String {
-                        multipartFormData.append(
-                            data,
-                            withName: fieldName,
-                            fileName: fileName,
-                            mimeType: mimeType
-                        )
-                    }
-                }
-
-                // 添加其他参数
-                if let parameters = parameters {
-                    for (key, value) in parameters {
-                        if let data = "\(value)".data(using: .utf8) {
-                            multipartFormData.append(data, withName: key)
-                        }
-                    }
-                }
-            },
-            to: url, // 上传地址
-            headers: defaultHeaders // 请求头
-        )
-        
-        request
-            .uploadProgress{ progress in
-                // 3. 上传进度回调
-                // 上传进度回调
-                dePrint("✈️✈️✈️进度: \(progress.fractionCompleted * 100)%")
-                progressHandler(progress)
-            }
-            .responseString{ response in
-                // 4. 处理响应
-                self.handleResponse(response, completion: completion)
-        }
-        
-        return request
-    }
-
-    /// 下载文件
-    /// - Parameters:
-    ///   - url: 下载URL
-    ///   - destination: 目标保存路径 (可选,不传则使用临时目录)
-    ///   - progressHandler: 进度回调 (0.0~1.0)
-    ///   - completion: 完成回调 (返回文件URL或错误)
-    func downloadFile(
-        urlString: String,
-        to destination: URL? = nil,
-        progressHandler: ((Double) -> Void)? = nil,
-        completion: @escaping (Result<URL, Error>) -> Void
-    ) -> DownloadRequest? {
-        
-        
-        guard let url = URL(string: urlString) else {
-            completion(.failure(NSError(domain: "url nil", code: 0)))
-            return nil
-        }
-        
-        // 设置下载目标路径
-        let destination: DownloadRequest.Destination = { temporaryURL, response in
-            // 如果用户指定了目标路径
-            if let destination = destination {
-                // 确保目录存在
-                let directory = destination.deletingLastPathComponent()
-                try? FileManager.default.createDirectory(at: directory, withIntermediateDirectories: true, attributes: nil)
-                return (destination, [.removePreviousFile, .createIntermediateDirectories])
-            }
-            
-            // 否则使用临时目录
-            let documentsURL = FileManager.default.temporaryDirectory
-            let suggestedFilename = response.suggestedFilename ?? url.lastPathComponent
-            let fileURL = documentsURL.appendingPathComponent(suggestedFilename)
-            
-            return (fileURL, [.removePreviousFile, .createIntermediateDirectories])
-        }
-        
-        // 开始下载
-        let request = afSession.download(url, to: destination)
-            .downloadProgress { progress in
-                // 主线程回调进度
-                DispatchQueue.main.async {
-                    progressHandler?(progress.fractionCompleted)
-                }
-            }
-            .response { response in
-                // 主线程回调结果
-                DispatchQueue.main.async {
-                    switch response.result {
-                    case .success(let fileURL):
-                        if let fileURL = fileURL {
-                            completion(.success(fileURL))
-                        } else {
-                            completion(.failure(NSError(domain: "DownloadError", code: -1, userInfo: [NSLocalizedDescriptionKey: "文件路径无效"])))
-                        }
-                    case .failure(let error):
-                        completion(.failure(error))
-                    }
-                }
-            }
-        
-        return request
-    }
-
-}
-
-extension TSNetworkManager {
-    
-    func handleResponse(
-        _ response: AFDataResponse<String>,
-        completion: @escaping (Result<Any, Error>) -> Void
-    ) {
-        
-        switch response.result {
-        case .success(let value):
-            if let resultDict = dataToJSONObject(data:response.data) as? [String:Any] {
-            handleSuccess(data: resultDict, response: response, completion: completion)
-            }else{
-                handleFail(error: NSError(domain: "Unable to parse data", code: 0), response: response, completion: completion)
-            }
-
-        case .failure(let error):
-            handleFail(error: error, response: response, completion: completion)
-        }
-    }
-    
-    func handleSuccess(data:Any,
-                       response: AFDataResponse<String>,
-                       completion: @escaping (Result<Any, Error>) -> Void){
-        dePrint("🚗🚗🚗网络请求成功:\(String(describing: response.request?.url?.absoluteString))")
-        dePrint("🚗🚗🚗网络请求成功:\(response)")
-        completion(.success(data))
-       }
-    
-    func handleFail(error:Error,
-                    response: AFDataResponse<String>,
-                    completion: @escaping (Result<Any, Error>) -> Void){
-        dePrint("🚗🚗🚗网络请求失败:\(String(describing: response.request?.url?.absoluteString))")
-        dePrint("🚗🚗🚗网络请求失败:\(response)")
-        completion(.failure(error))
-    }
-
-    func dataToJSONObject(data: Data?) -> Any? {
-        guard let data = data else { return nil }
-        do {
-            let jsonObject = try JSONSerialization.jsonObject(with: data, options: [])
-            return jsonObject
-        } catch {
-            print("Failed to convert Data to JSON object: \(error.localizedDescription)")
-            return nil
-        }
-    }
-    
-}
-
-func kNetWorkCodeSuccess(data:Any?) -> [String:Any]? {
-    guard let data = data else { return nil }
-    if let dataDict = data as? [String:Any],
-        let code = dataDict["code"] as? Int{
-        switch code {
-        case 200://成功
-            return dataDict
-        default:
-            return nil
-        }
-    }
-    return nil
-}
-
-func kNetWorkResultSuccess(data:Any?) -> [String:Any]? {
-    guard let dict = kNetWorkCodeSuccess(data: data) else { return nil }
-    if let result = dict["result"] as? [String:Any]{
-        return result
-    }
-    return nil
-}
-
-func kNetWorkMessage(data:Any?) -> String? {
-    guard let data = data else { return nil }
-    if let dict = data as? [String:Any] ,
-       let msg = dict["message"] as? String{
-        return msg
-    }
-    return nil
-}
-
-class JsonStringTransform<T:Mappable>: TransformType {
-    typealias Object = T
-    typealias JSON = [String: Any]
-    
-    func transformFromJSON(_ value: Any?) -> T? {
-    
-        if let jsonString = value as? String {
-            let obj = T(JSONString: jsonString)
-            return obj
-        }
-        
-        if let dict = value as? [String: Any] {
-            let obj = T(JSON: dict)
-            return obj
-        }
-
-        return nil
-    }
-    
-    func transformToJSON(_ value: T?) -> [String : Any]? {
-        return value?.toJSON() as? [String: Any]
-    }
-}