保存失败时返回具体错误信息

This commit is contained in:
2026-07-15 23:55:36 +08:00
parent 01ad237af3
commit f1a380d105
+16 -5
View File
@@ -21,6 +21,17 @@ struct Clip: Codable, Identifiable, Equatable, Sendable {
} }
} }
enum ClipStoreError: Error, LocalizedError {
case appGroupUnavailable
var errorDescription: String? {
switch self {
case .appGroupUnavailable:
return "无法访问 App Group 容器,请检查签名和 entitlements 配置。"
}
}
}
actor ClipStore { actor ClipStore {
static let shared = ClipStore() static let shared = ClipStore()
@@ -31,13 +42,13 @@ actor ClipStore {
private var cachedClips: [Clip]? private var cachedClips: [Clip]?
private var fileURL: URL { private func fileURL() throws -> URL {
let fileManager = FileManager.default let fileManager = FileManager.default
guard let containerURL = fileManager.containerURL(forSecurityApplicationGroupIdentifier: appGroupIdentifier) else { guard let containerURL = fileManager.containerURL(forSecurityApplicationGroupIdentifier: appGroupIdentifier) else {
fatalError("无法访问 App Group 容器: \(appGroupIdentifier)") throw ClipStoreError.appGroupUnavailable
} }
let directoryURL = containerURL.appendingPathComponent(subdirectory, isDirectory: true) let directoryURL = containerURL.appendingPathComponent(subdirectory, isDirectory: true)
try? fileManager.createDirectory(at: directoryURL, withIntermediateDirectories: true) try fileManager.createDirectory(at: directoryURL, withIntermediateDirectories: true)
return directoryURL.appendingPathComponent(fileName) return directoryURL.appendingPathComponent(fileName)
} }
@@ -55,7 +66,7 @@ actor ClipStore {
return cached return cached
} }
let url = fileURL let url = try fileURL()
let fileManager = FileManager.default let fileManager = FileManager.default
guard fileManager.fileExists(atPath: url.path) else { guard fileManager.fileExists(atPath: url.path) else {
cachedClips = [] cachedClips = []
@@ -93,7 +104,7 @@ actor ClipStore {
} }
private func persist(_ clips: [Clip]) async throws { private func persist(_ clips: [Clip]) async throws {
let url = fileURL let url = try fileURL()
let data = try JSONEncoder().encode(clips) let data = try JSONEncoder().encode(clips)
try data.write(to: url, options: .atomic) try data.write(to: url, options: .atomic)
cachedClips = clips cachedClips = clips