TSNetWork+Business.swift 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. //
  2. // TSNetWork+Business.swift
  3. // AIEmoji
  4. //
  5. // Created by 100Years on 2025/1/16.
  6. //
  7. /// 基础 URL(根据需求修改)
  8. private let baseURL = "http://ai.soundmove.cn"
  9. //private let baseChinaURL = "http://ai.100yearslater100.com"
  10. import Alamofire
  11. enum TSNeURLType:String {
  12. case musicCreate = "/api/music/create" //音乐生成
  13. case actionInfo = "/api/action/info" //查询生成过程接口
  14. case upload = "/api/upload" //上传
  15. // func getUrlString() -> String {
  16. // if Locale.current.identifier.contains("_CN") {//中国区
  17. // return baseChinaURL + self.rawValue
  18. // }else{
  19. // return baseURL + self.rawValue
  20. // }
  21. // }
  22. func getUrlString() -> String {
  23. return baseURL + self.rawValue
  24. }
  25. }
  26. func getUserInfoJsonString()->[String:Any] {
  27. let uuid: String
  28. let uuidUdKey = "my_UUID"
  29. if let saved = UserDefaults.standard.string(forKey: uuidUdKey),
  30. !saved.isEmpty {
  31. uuid = saved
  32. } else {
  33. let newUuid = UUID().uuidString
  34. UserDefaults.standard.set(newUuid, forKey: uuidUdKey)
  35. UserDefaults.standard.synchronize()
  36. uuid = newUuid
  37. }
  38. let dic:[String:Any] = [
  39. "device":UIDevice.current.modelName,
  40. "deviceId":uuid,
  41. "iosVersion":UIDevice.current.systemVersion,
  42. "appVersion":appShortVersion(),
  43. // "subscriptionStatus":kPurchaseDefault.isVip ? "active" : "fallow",
  44. ]
  45. return dic
  46. }
  47. func getLanguageCode()->String{
  48. if Locale.current.identifier.contains("zh-Hant"){
  49. return "zh-Hant"
  50. }
  51. if let languageCode = Locale.current.languageCode {
  52. // print("当前设备语言简写: \(languageCode)") // 输出如 "en", "ja", "zh" 等
  53. return languageCode
  54. }
  55. return "en"
  56. }
  57. extension TSNetworkManager {
  58. /// 通用 get 请求
  59. func get<T: TSBaseModel>(
  60. urlType: TSNeURLType,
  61. parameters: [String: Any]? = nil,
  62. responseType: T.Type? = nil,
  63. completion: @escaping (Result<Any, Error>) -> Void
  64. ) -> Request {
  65. let urlString = urlType.getUrlString()
  66. return request(method: .get, urlString: urlString, parameters:parameters) { result in
  67. completion(result)
  68. }
  69. }
  70. /// 通用 POST 请求
  71. /// - Parameters:
  72. /// - endpoint: 接口路径
  73. /// - parameters: 请求参数
  74. /// - responseType: 响应数据模型(可选)
  75. /// - completion: 请求完成的回调
  76. func post<T: TSBaseModel>(
  77. urlType: TSNeURLType,
  78. parameters: [String: Any]? = nil,
  79. responseType: T.Type? = nil,
  80. completion: @escaping (Result<Any, Error>) -> Void
  81. ) -> Request {
  82. let urlString = urlType.getUrlString()
  83. return request(method: .post, urlString: urlString, parameters:parameters) { result in
  84. completion(result)
  85. }
  86. }
  87. /// 通用 POST Stream 请求
  88. /// - Parameters:
  89. /// - endpoint: 接口路径
  90. /// - parameters: 请求参数
  91. /// - responseType: 响应数据模型(可选)
  92. /// - completion: 请求完成的回调
  93. func postStream<T: TSBaseModel>(
  94. urlType: TSNeURLType,
  95. parameters: [String: Any]? = nil,
  96. responseType: T.Type? = nil,
  97. streamHandler:@escaping (String) -> Void,
  98. completion: @escaping (Result<Any, Error>) -> Void
  99. ) -> Request?{
  100. let urlString = urlType.getUrlString()
  101. let streamRequest = postStreamRequest(urlString: urlString, parameters: parameters, streamHandler: streamHandler, completion: completion)
  102. return streamRequest
  103. }
  104. /// 上传多个 Data 数据
  105. /// - Parameters:
  106. /// - urlType: TSNeURLType
  107. /// - dataArray: Data 数组,每个元素是一个字典,包含 Data 和字段名
  108. /// - parameters: 其他参数(可选)
  109. /// - headers: 自定义请求头(可选)
  110. /// - completion: 完成回调,返回结果或错误
  111. func uploadData<T: TSBaseModel>(
  112. urlType: TSNeURLType,
  113. dataArray: [[String: Any]], // Data 数组,每个元素包含 Data 和字段名
  114. parameters: [String: Any]? = nil,
  115. responseType: T.Type? = nil,
  116. progressHandler: @escaping (Float) -> Void, // 上传进度回调
  117. completion: @escaping (Result<Any, Error>) -> Void
  118. ) -> Request?{
  119. let urlString = urlType.getUrlString()
  120. let request = uploadData(urlString: urlString,dataArray:dataArray, parameters: parameters, progressHandler: { progress in
  121. progressHandler(Float(progress.fractionCompleted))
  122. },completion: completion)
  123. return request
  124. }
  125. func downloadFile(
  126. urlString: String,
  127. to destination: URL,
  128. progressHandler: ((Double) -> Void)? = nil,
  129. completion: @escaping (URL?, Error?) -> Void
  130. ) -> DownloadRequest? {
  131. let request = self.downloadFile(
  132. urlString: urlString,
  133. to: destination,
  134. progressHandler: { progress in
  135. print("下载进度: \(progress * 100)%")
  136. progressHandler?(progress)
  137. },
  138. completion: { result in
  139. switch result {
  140. case .success(let fileURL):
  141. dePrint("下载完成,文件保存在: \(fileURL.path)")
  142. completion(fileURL,nil)
  143. case .failure(let error):
  144. dePrint("下载失败: \(error.localizedDescription)")
  145. completion(nil,error)
  146. }
  147. }
  148. )
  149. return request
  150. }
  151. }
  152. extension TSNetworkManager {
  153. // func uploadAudio(
  154. // fileURL:URL,
  155. // progressHandler: @escaping (Float) -> Void, // 上传进度回调
  156. // completion: @escaping (Any?, Error?) -> Void)
  157. // -> Request?{
  158. //
  159. // let urlString = TSNeURLType.upload.getUrlString()
  160. //
  161. // let request = uploadFile(urlString: urlString, fileURL: fileURL, multipartBuilder: { multipart in
  162. // multipart.append(fileURL, withName: "file", fileName: "audio.mp3", mimeType: "audio/mp3")
  163. // }) { progress in
  164. // progressHandler(Float(progress.fractionCompleted))
  165. // } completion: { [weak self] result in
  166. // guard let self = self else { return }
  167. // switch result {
  168. // case .success(let data):
  169. // if let dataDict = kNetWorkCodeSuccess(data: data),
  170. // let picUrl = dataDict["result"] as? String{
  171. // completion(picUrl,nil)
  172. // }else{
  173. // let error = NSError(domain: "Service exception", code: 0)
  174. // completion(nil,error)
  175. // }
  176. // case .failure(let error):
  177. // completion(nil,error)
  178. // }
  179. // }
  180. //
  181. // return request
  182. // }
  183. func uploadAudio(
  184. fileURL:URL,
  185. progressHandler: @escaping (Float) -> Void, // 上传进度回调
  186. completion: @escaping (Any?, Error?) -> Void)
  187. -> Request?{
  188. let urlString = TSNeURLType.upload.getUrlString()
  189. dePrint("✈️✈️✈️网络请求:\(urlString)")
  190. guard let url = URL(string: urlString) else {
  191. completion(nil,NSError(domain: "url nil", code: 0))
  192. return nil
  193. }
  194. return AF.upload(
  195. multipartFormData: { multipart in
  196. multipart.append(fileURL, withName: "file", fileName: "audio.mp3", mimeType: "audio/mp3")
  197. },
  198. to: url
  199. )
  200. .uploadProgress { progress in
  201. dePrint("✈️✈️✈️进度: \(progress.fractionCompleted * 100)%")
  202. progressHandler(Float(progress.fractionCompleted))
  203. }
  204. .responseString { response in
  205. self.handleResponse(response) { [weak self] result in
  206. guard let self = self else { return }
  207. switch result {
  208. case .success(let data):
  209. if let dataDict = kNetWorkCodeSuccess(data: data),
  210. let picUrl = dataDict["result"] as? String{
  211. completion(picUrl,nil)
  212. }else{
  213. let error = NSError(domain: "Service exception", code: 0)
  214. completion(nil,error)
  215. }
  216. case .failure(let error):
  217. completion(nil,error)
  218. }
  219. }
  220. }
  221. }
  222. }