diff --git a/Note/ClipStore.swift b/Note/ClipStore.swift index 4af3f45..6aa1ae8 100644 --- a/Note/ClipStore.swift +++ b/Note/ClipStore.swift @@ -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 { static let shared = ClipStore() @@ -31,13 +42,13 @@ actor ClipStore { private var cachedClips: [Clip]? - private var fileURL: URL { + private func fileURL() throws -> URL { let fileManager = FileManager.default guard let containerURL = fileManager.containerURL(forSecurityApplicationGroupIdentifier: appGroupIdentifier) else { - fatalError("无法访问 App Group 容器: \(appGroupIdentifier)") + throw ClipStoreError.appGroupUnavailable } 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) } @@ -55,7 +66,7 @@ actor ClipStore { return cached } - let url = fileURL + let url = try fileURL() let fileManager = FileManager.default guard fileManager.fileExists(atPath: url.path) else { cachedClips = [] @@ -93,7 +104,7 @@ actor ClipStore { } private func persist(_ clips: [Clip]) async throws { - let url = fileURL + let url = try fileURL() let data = try JSONEncoder().encode(clips) try data.write(to: url, options: .atomic) cachedClips = clips