我依靠加密领域将某些数据存储在用Swift编写的应用程序中。有时候我会遇到这样一种情况:删除给定领域并创建一个新领域以确保在某些状态之间不会存在任何数据。
我自己跟踪加密密钥,因此存在我无意中尝试使用错误的加密密钥解密域的风险,这会引发以下异常:
libc ++ abi.dylib:以类型为realm的未捕获异常终止:: RealmFileException:无法在路径'/path/to/private.realm'中打开域:Realm文件解密失败。
因为这意味着我丢失了原始加密密钥,实际上使这个特定领域无用,我希望能够删除领域文件并重新开始而不是崩溃。
我根据文档建议创建领域:
do {
var configuration = Realm.Configuration.defaultConfiguration
configuration.encryptionKey = ...
try Realm(configuration: configuration)
}
catch let error {
}
我已经尝试this和类似的方法来捕获NSException
并返回它以由Swift代码处理,但似乎没有直接的方法来实现这一点。这是不可能的,还是我接近这个错误?
答案 0 :(得分:2)
事实证明问题是由Realm中的一个错误导致的,deleteRealmIfMigrationNeeded = true
在使用加密时导致异常被抛出,但无法捕获。
从我(非常有帮助)与kishikawa katsumi的对应:
无法捕获错误的问题归因于
deleteRealmIfMigrationNeeded
。它无意中改变了代码流。这似乎是Realm的错误。我们很快就会解决。
目前,在我的情况下,唯一要做的就是设置deleteRealmIfMigrationNeeded = false
并手动处理此案例。我已经向Realm提交了this issue。
更新:问题应通过this commit解决。
答案 1 :(得分:1)
您的代码应该有效。如果加密密钥错误,则进入catch块。然后,您可以删除现有文件并重新创建Realm。如下所示:
var configuration = Realm.Configuration.defaultConfiguration
configuration.encryptionKey = getKey()
do {
let realm = try Realm(configuration: configuration)
...
}
catch {
try! NSFileManager().removeItemAtURL(configuration.fileURL!)
let realm = try! Realm(configuration: configuration)
...
}
如果您无法捕获错误的加密错误,则可能是使用旧的Realm.framework。请更新最新版本的Realm。