Files
e-party-iOS/yana/Utils/TCCos/Services/COSConfigurationService.swift
edwinQQQ b966e24532 feat: 更新COSManager和相关视图以增强图片上传功能
- 修改COSManagerAdapter以支持新的TCCos组件,确保与腾讯云COS的兼容性。
- 在CreateFeedFeature中新增图片上传相关状态和Action,优化图片选择与上传逻辑。
- 更新CreateFeedView以整合图片上传功能,提升用户体验。
- 在多个视图中添加键盘状态管理,改善用户交互体验。
- 新增COS相关的测试文件,确保功能的正确性和稳定性。
2025-07-31 11:41:56 +08:00

202 lines
6.2 KiB
Swift
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import Foundation
import QCloudCOSXML
import ComposableArchitecture
// MARK: - COS
/// COS
public protocol COSConfigurationServiceProtocol: Sendable {
/// COS
func initializeCOSService(with tokenData: TcTokenData) async throws
/// COS
func isCOSServiceInitialized() async -> Bool
///
func getCurrentConfiguration() async -> COSConfiguration?
/// COS
func resetCOSService() async
}
// MARK: - COS
/// COS
public struct COSConfigurationService: COSConfigurationServiceProtocol {
private let configurationCache: ConfigurationCacheProtocol
public init(configurationCache: ConfigurationCacheProtocol = ConfigurationCache()) {
self.configurationCache = configurationCache
}
/// COS
public func initializeCOSService(with tokenData: TcTokenData) async throws {
//
if await isCOSServiceInitialized() {
debugInfoSync("✅ COS服务已初始化跳过重复初始化")
return
}
do {
//
let configuration = QCloudServiceConfiguration()
let endpoint = QCloudCOSXMLEndPoint()
//
endpoint.regionName = tokenData.region
endpoint.useHTTPS = true
//
if tokenData.accelerate {
endpoint.suffix = "cos.accelerate.myqcloud.com"
}
configuration.endpoint = endpoint
//
QCloudCOSXMLService.registerDefaultCOSXML(with: configuration)
QCloudCOSTransferMangerService.registerDefaultCOSTransferManger(with: configuration)
//
let cosConfiguration = COSConfiguration(
region: tokenData.region,
bucket: tokenData.bucket,
accelerate: tokenData.accelerate,
customDomain: tokenData.customDomain,
useHTTPS: true
)
await configurationCache.cacheConfiguration(cosConfiguration)
debugInfoSync("✅ COS服务已初始化region: \(tokenData.region)")
} catch {
debugErrorSync("❌ COS服务初始化失败: \(error.localizedDescription)")
throw COSError.configurationFailed(error.localizedDescription)
}
}
/// COS
public func isCOSServiceInitialized() async -> Bool {
return await configurationCache.getCachedConfiguration() != nil
}
///
public func getCurrentConfiguration() async -> COSConfiguration? {
return await configurationCache.getCachedConfiguration()
}
/// COS
public func resetCOSService() async {
await configurationCache.clearCachedConfiguration()
debugInfoSync("🔄 COS服务配置已重置")
}
}
// MARK: -
///
public protocol ConfigurationCacheProtocol: Sendable {
///
func getCachedConfiguration() async -> COSConfiguration?
///
func cacheConfiguration(_ configuration: COSConfiguration) async
///
func clearCachedConfiguration() async
}
// MARK: -
///
public actor ConfigurationCache: ConfigurationCacheProtocol {
private var cachedConfiguration: COSConfiguration?
public init() {}
///
public func getCachedConfiguration() async -> COSConfiguration? {
return cachedConfiguration
}
///
public func cacheConfiguration(_ configuration: COSConfiguration) async {
cachedConfiguration = configuration
debugInfoSync("💾 COS配置已缓存: \(configuration.region)")
}
///
public func clearCachedConfiguration() async {
cachedConfiguration = nil
debugInfoSync("🗑️ 清除缓存的 COS 配置")
}
}
// MARK: - TCA
extension DependencyValues {
/// COS
public var cosConfigurationService: COSConfigurationServiceProtocol {
get { self[COSConfigurationServiceKey.self] }
set { self[COSConfigurationServiceKey.self] = newValue }
}
}
/// COS
private enum COSConfigurationServiceKey: DependencyKey {
static let liveValue: COSConfigurationServiceProtocol = COSConfigurationService()
static let testValue: COSConfigurationServiceProtocol = MockCOSConfigurationService()
}
// MARK: - Mock
/// Mock
public struct MockCOSConfigurationService: COSConfigurationServiceProtocol {
public var initializeResult: Result<Void, Error> = .success(())
public var isInitializedResult: Bool = false
public var configurationResult: COSConfiguration? = nil
public init() {}
public func initializeCOSService(with tokenData: TcTokenData) async throws {
switch initializeResult {
case .success:
return
case .failure(let error):
throw error
}
}
public func isCOSServiceInitialized() async -> Bool {
return isInitializedResult
}
public func getCurrentConfiguration() async -> COSConfiguration? {
return configurationResult
}
public func resetCOSService() async {
// Mock
}
}
// MARK: -
extension COSConfiguration {
///
public var fullDomain: String {
if !customDomain.isEmpty {
return customDomain
}
let baseDomain = "\(bucket).cos.\(region).myqcloud.com"
return accelerate ? "\(bucket).cos.accelerate.myqcloud.com" : baseDomain
}
/// URL
public var urlPrefix: String {
let domain = fullDomain
let scheme = useHTTPS ? "https" : "http"
return "\(scheme)://\(domain)"
}
}