我将 SwiftData 与 iCloud 结合使用用于私人项目来存储和同步凭据。由于我有不同的模型,因此我需要一个用于
UntisConfiguration
和 ElternportalCredentials
的通用容器。
自从我将模型从
ElternpotalLoginModel
重命名为 ElternportalCredentials
以来,该应用程序总是在我的真实 iPhone 上崩溃并出现以下错误:
MyApp/ParentPortalCredentialsDataSource.swift:21: Fatal error: 'try!' expression unexpectedly raised an error: SwiftData.SwiftDataError(_error: SwiftData.SwiftDataError._Error.loadIssueModelContainer)
@Model
final class ElternportalCredentials {
var mail: String = ""
var password: String = ""
init(elternportalMail: String = "", elternportalPassword: String = "") {
self.mail = elternportalMail
self.password = elternportalPassword
}
}
final class ElternportalCredentialsDataSource {
private let modelContainer: ModelContainer
private let modelContext: ModelContext
@MainActor
static let shared = ElternportalCredentialsDataSource()
@MainActor
private init() {
let config = ModelConfiguration(groupContainer: .identifier("com.company.myapp"))
self.modelContainer = try! ModelContainer(for: ElternportalCredentials.self, UntisConfiguration.self, configurations: config)
self.modelContext = modelContainer.mainContext
}
func saveCredentials(credentials: ElternportalCredentials) {
modelContext.insert(credentials)
do {
try modelContext.save()
} catch {
fatalError(error.localizedDescription)
}
}
func fetchCredentials() -> [ElternportalCredentials] {
do {
return try modelContext.fetch(FetchDescriptor<ElternportalCredentials>())
} catch {
fatalError(error.localizedDescription)
}
}
func removeOldCredentials() {
let credentials = fetchCredentials()
for credential in credentials {
modelContext.delete(credential)
}
}
}
奇怪的是,当我在新创建的模拟器中启动应用程序时,这种情况不会发生。不幸的是,我无法测试该错误是否也发生在未安装以前版本的应用程序的新物理设备上。
我已通过执行以下操作解决了我的问题:
导航到应用程序标识符>我的应用程序>应用程序组。
它应该看起来像这样:
let config = ModelConfiguration(groupContainer: .identifier("group.com.company.MyApp"))